Skip to content

Commit 9ee90cb

Browse files
committed
flat_map : add flat_multimap (#1078)
1 parent 9730e9e commit 9ee90cb

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+3807
-21
lines changed

reference/flat_map.md

+8-6
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
[`std::map`](/reference/map/map.md)と違ってノードベースの実装ではなく、メモリ連続性のある平坦 (flat) な配列で扱われる。
88

9-
`<flat_map>` ヘッダでは、キーの重複を許さない `std::`[`flat_map`](flat_map/flat_map.md) クラステンプレート、およびキーの重複を許す `std::`[`flat_multimap`](flat_map/flat_multimap.md.nolink) クラステンプレートを提供する。
9+
`<flat_map>` ヘッダでは、キーの重複を許さない `std::`[`flat_map`](flat_map/flat_map.md) クラステンプレート、およびキーの重複を許す `std::`[`flat_multimap`](flat_map/flat_multimap.md) クラステンプレートを提供する。
1010

1111
このヘッダでは、以下の標準ヘッダをインクルードする:
1212

@@ -15,11 +15,13 @@
1515

1616

1717
| 名前 | 説明 | 対応バージョン |
18-
|----------------------------------------------|--------------------------------------------------------|-------|
19-
| [`flat_map`](flat_map/flat_map.md) | キーの重複を許さない平坦な順序付き連想コンテナ(class template) | C++23 |
20-
| [`flat_multimap`](flat_map/flat_multimap.md.nolink) | キーの重複を許す平坦な順序付き連想コンテナ(class template) | C++23 |
21-
| [`sorted_unique_t`](flat_map/sorted_unique_t.md) | ソート済みかつ重複要素がないことを示すためのタグ型(class) | C++23 |
22-
| [`sorted_unique`](flat_map/sorted_unique_t.md) | ソート済みかつ重複要素がないことを示すためのタグ値(variable) | C++23 |
18+
|----------------------------------------------------------|----------------------------------------------------------------------|-------|
19+
| [`flat_map`](flat_map/flat_map.md) | キーの重複を許さない平坦な順序付き連想コンテナ(class template) | C++23 |
20+
| [`flat_multimap`](flat_map/flat_multimap.md) | キーの重複を許す平坦な順序付き連想コンテナ(class template) | C++23 |
21+
| [`sorted_unique_t`](flat_map/sorted_unique_t.md) | ソート済みかつ重複要素がないことを示すためのタグ型(class) | C++23 |
22+
| [`sorted_unique`](flat_map/sorted_unique_t.md) | ソート済みかつ重複要素がないことを示すためのタグ値(variable) | C++23 |
23+
| [`sorted_equivalent_t`](flat_map/sorted_equivalent_t.md) | ソート済みであること(重複はしてもよい)を示すためのタグ型(class) | C++23 |
24+
| [`sorted_equivalent`](flat_map/sorted_equivalent_t.md) | ソート済みであること(重複はしてもよい)を示すためのタグ値(variable) | C++23 |
2325

2426

2527
## バージョン

reference/flat_map/flat_map/count.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,16 @@ size_type count(const K& x) const; // (2) C++23
3030
3131
## 計算量
3232
```
33-
log(b.size()) + b.count(k)
33+
log(size()) + count(x)
3434
```
35-
* b.size()[link size.md]
35+
* size()[link size.md]
3636
3737
3838
## 備考
3939
- (2) :
4040
- `is_transparent`は、標準ライブラリの[`std::less`](/reference/functional/less.md)、[`std::greater`](/reference/functional/greater.md)といった関数オブジェクトの、`void`に対する特殊化で定義される。それ以外のテンプレートパラメータで`is_transparent`が定義されないのは、互換性のためである。
4141
- これらのオーバーロードは、`flat_map<string, int>`のようなコンテナに対し、検索操作で文字列リテラルを渡した際に、キー型の一時オブジェクトが生成されるコストを減らすためにある。
42-
- [`std::flat_multimap`](/reference/flat_map/flat_multimap.md.nolink)クラスとの共通インタフェースを使用する必要がなければ、この関数の代わりに[`contains()`](contains.md)メンバ関数を使用することを推奨する
42+
- [`std::flat_multimap`](/reference/flat_map/flat_multimap.md)クラスとの共通インタフェースを使用する必要がなければ、この関数の代わりに[`contains()`](contains.md)メンバ関数を使用することを推奨する
4343
4444
4545
## 例

reference/flat_map/flat_map/insert.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,13 @@ void insert(sorted_unique_t s,
4040
* sorted_unique_t[link /reference/flat_map/sorted_unique_t.md]
4141
4242
## 概要
43-
新しく一つの要素(引数 `x`, `y`を使う)または要素のシーケンス(入力イテレータまたは `initializer_list` を使う)を挿入し、コンテナを拡張する。
43+
新しく一つの要素(引数 `x` を使う)または要素のシーケンス(入力イテレータまたは `initializer_list` を使う)を挿入し、コンテナを拡張する。
4444
4545
これは、挿入された要素の数だけコンテナの [`size()`](size.md) を増やす。
4646
4747
`flat_map` コンテナは重複したキーを持つ要素を許さないため、挿入操作はそれぞれの要素が他のコンテナ内の既存要素と同じキーかどうかをチェックする。もし同じであれば要素は挿入されず、戻り値を持つ関数の場合はそれへのイテレータなどを返す。
4848
49-
重複した値を許す、類似したコンテナについては `flat_multimap` を参照。
49+
重複した値を許す、類似したコンテナについては [`flat_multimap`](/reference/flat_map/flat_multimap.md) を参照。
5050
5151
内部的に `flat_map` コンテナは、コンストラクト時に指定された比較オブジェクトによって要素を下位から上位へとソートして保持する。
5252

reference/flat_map/flat_map/insert_range.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ Rangeを挿入し、コンテナを拡張する。
1818
1919
`flat_map` コンテナは重複したキーを持つ要素を許さないため、挿入操作はそれぞれの要素が他のコンテナ内の既存要素と同じキーかどうかをチェックする。もし同じであれば要素は挿入されない。
2020
21-
重複した値を許す、類似したコンテナについては `flat_multimap` を参照。
21+
重複した値を許す、類似したコンテナについては [`flat_multimap`](/reference/flat_map/flat_multimap.md) を参照。
2222
2323
内部的に `flat_map` コンテナは、コンストラクト時に指定された比較オブジェクトによって要素を下位から上位へとソートして保持する。
2424

reference/flat_map/flat_multimap.md

+243
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,243 @@
1+
# flat_multimap
2+
* flat_map[meta header]
3+
* std[meta namespace]
4+
* class template[meta id-type]
5+
* cpp23[meta cpp]
6+
7+
```cpp
8+
namespace std {
9+
template <class Key,
10+
class T,
11+
class Compare = less<Key>,
12+
class KeyContainer = vector<Key>,
13+
class MappedContainer = vector<T>>
14+
class flat_multimap;
15+
}
16+
```
17+
* less[link ../functional/less.md]
18+
* vector[link /reference/vector/vector.md]
19+
20+
## 概要
21+
22+
23+
## メンバ関数
24+
### 構築・破棄
25+
26+
| 名前 | 説明 | 対応バージョン |
27+
|---------------------------------|----------------|-------|
28+
| [`(constructor)`](flat_multimap/op_constructor.md) | コンストラクタ | C++23 |
29+
| [`(destructor)`](flat_multimap/op_destructor.md.nolink) | デストラクタ | C++23 |
30+
| [`operator=`](flat_multimap/op_assign.md) | 代入演算子 | C++23 |
31+
32+
33+
### イテレータ
34+
35+
| 名前 | 説明 | 対応バージョン |
36+
|---------------------------------------|--------------------------------------------------|-------|
37+
| [`begin`](flat_multimap/begin.md) | 先頭を指すイテレータを取得する | C++23 |
38+
| [`cbegin`](flat_multimap/cbegin.md) | 先頭を指す読み取り専用イテレータを取得する | C++23 |
39+
| [`end`](flat_multimap/end.md) | 末尾の次を指すイテレータを取得する | C++23 |
40+
| [`cend`](flat_multimap/cend.md) | 末尾の次を指す読み取り専用イテレータを取得する | C++23 |
41+
| [`rbegin`](flat_multimap/rbegin.md) | 末尾を指す逆イテレータを取得する | C++23 |
42+
| [`crbegin`](flat_multimap/crbegin.md) | 末尾を指す読み取り専用逆イテレータを取得する | C++23 |
43+
| [`rend`](flat_multimap/rend.md) | 先頭の前を指す逆イテレータを取得する | C++23 |
44+
| [`crend`](flat_multimap/crend.md) | 先頭の前を指す読み取り専用逆イテレータを取得する | C++23 |
45+
46+
47+
### 領域
48+
49+
| 名前 | 説明 | 対応バージョン |
50+
|-----------------------------------------|------------------------------------|-------|
51+
| [`empty`](flat_multimap/empty.md) | コンテナが空であるかどうかを調べる | C++23 |
52+
| [`size`](flat_multimap/size.md) | 要素数を取得する | C++23 |
53+
| [`max_size`](flat_multimap/max_size.md) | 格納可能な最大の要素数を取得する | C++23 |
54+
55+
56+
### コンテナの変更
57+
58+
| 名前 | 説明 | 対応バージョン |
59+
|-------------------------------------------------|------------------------------------------|----------------|
60+
| [`clear`](flat_multimap/clear.md) | 全ての要素を削除する | C++23 |
61+
| [`insert`](flat_multimap/insert.md) | 要素を挿入する | C++23 |
62+
| [`insert_range`](flat_multimap/insert_range.md) | Rangeを挿入する | C++23 |
63+
| [`emplace`](flat_multimap/emplace.md) | 要素を直接構築する | C++23 |
64+
| [`emplace_hint`](flat_multimap/emplace_hint.md) | ヒントを使って要素を直接構築する | C++23 |
65+
| [`erase`](flat_multimap/erase.md) | 要素を削除する | C++23 |
66+
| [`swap`](flat_multimap/swap.md) | コンテンツを交換する | C++23 |
67+
| [`extract`](flat_multimap/extract.md) | キーのコンテナ、値のコンテナを取得する | C++23 |
68+
| [`replace`](flat_multimap/replace.md) | キーのコンテナ、値のコンテナを置き換える | C++23 |
69+
70+
71+
### 要素アクセス
72+
73+
| 名前 | 説明 | 対応バージョン |
74+
|-----------------------------------------------|--------------------------------------------------------------|-------|
75+
| [`count`](flat_multimap/count.md) | 指定したキーにマッチする要素の数を取得する | C++23 |
76+
| [`find`](flat_multimap/find.md) | 指定したキーで要素を探す | C++23 |
77+
| [`contains`](flat_multimap/contains.md) | 指定したキーの要素が含まれているかを判定する | C++23 |
78+
| [`equal_range`](flat_multimap/equal_range.md) | 指定したキーにマッチする要素範囲を取得する | C++23 |
79+
| [`lower_bound`](flat_multimap/lower_bound.md) | 与えられた値より小さくない最初の要素へのイテレータを取得する | C++23 |
80+
| [`upper_bound`](flat_multimap/upper_bound.md) | 特定の値よりも大きい最初の要素へのイテレータを取得する | C++23 |
81+
82+
### オブザーバー
83+
84+
| 名前 | 説明 | 対応バージョン |
85+
|---------------------------------------------|----------------------------------------|----------------|
86+
| [`key_comp`](flat_multimap/key_comp.md) | キー比較用の関数オブジェクトを取得する | C++23 |
87+
| [`value_comp`](flat_multimap/value_comp.md) | 要素比較用の関数オブジェクトを取得する | C++23 |
88+
| [`keys`](flat_multimap/keys.md) | キーのコンテナを取得する | C++23 |
89+
| [`values`](flat_multimap/values.md) | 値のコンテナを取得する | C++23 |
90+
91+
92+
## メンバ型
93+
94+
| 名前 | 説明 | 対応バージョン |
95+
|------|------|----------------|
96+
| `key_type` | キーの型。テンプレートパラメータ `Key` | C++23 |
97+
| `mapped_type` | 値の型。テンプレートパラメータ `T` | C++23 |
98+
| `value_type` | 要素の型。[`std::pair`](/reference/utility/pair.md)`<key_type, mapped_type>` | C++23 |
99+
| `key_compare` | キー値の大小関係を判定する二項述語の型。テンプレートパラメータ `Compare` | C++23 |
100+
| [`value_compare`](flat_multimap/value_compare.md) | 要素値のキー部分で大小関係を判定する二項述語の型。入れ子クラス | C++23 |
101+
| `reference` | 要素への参照型。[`std::pair`](/reference/utility/pair.md)`<const key_type&, mapped_type&>` | C++23 |
102+
| `const_reference` | 要素への`const`参照型。[`std::pair`](/reference/utility/pair.md)`<const key_type&, const mapped_type&>` | C++23 |
103+
| `size_type` | 要素数を表す符号なし整数型 [`size_t`](/reference/cstddef/size_t.md) | C++23 |
104+
| `difference_type` | 同一のコンテナを指す `iterator` の差を表す符号付き整数型 [`ptrdiff_t`](/reference/cstddef/ptrdiff_t.md) | C++23 |
105+
| `iterator` | ランダムアクセスイテレータ | C++23 |
106+
| `const_iterator` | 読み取り専用ランダムアクセスイテレータ | C++23 |
107+
| `reverse_iterator` | 逆順ランダムアクセスイテレータ。[`std::reverse_iterator`](/reference/iterator/reverse_iterator.md)`<iterator>` | C++23 |
108+
| `const_reverse_iterator` | 読み取り専用逆順ランダムアクセスイテレータ。[`std::reverse_iterator`](/reference/iterator/reverse_iterator.md)`<const_iterator>` | C++23 |
109+
| `key_container_type` | キーを格納するコンテナ型 `KeyContainer` | C++23 |
110+
| `mapped_container_type` | 値を格納するコンテナ型 `MappedContainer` | C++23 |
111+
| [`containers`](flat_multimap/containers.md) | キーのコンテナと値のコンテナを保持する型 | C++23 |
112+
| [`key_equiv`](flat_multimap/key_equiv.md) | 要素をとってキーの等価比較を行う説明専用の関数オブジェクト | C++23 |
113+
114+
115+
## 非メンバ関数
116+
### 要素削除
117+
118+
| 名前 | 説明 | 対応バージョン |
119+
|------|------|----------------|
120+
| [`erase_if`](flat_multimap/erase_if_free.md) | 指定した条件に合致する要素とその分の領域を、コンテナから削除する | C++23 |
121+
122+
123+
## 非メンバ(*Hidden friends*)関数
124+
### 比較演算子
125+
126+
| 名前 | 説明 | 対応バージョン |
127+
|------|------|----------------|
128+
| [`operator==`](flat_multimap/op_equal.md) | 左辺と右辺が等しいかの判定を行う | C++23 |
129+
| `bool operator!=(const flat_multimap& x, const flat_multimap& y);` | 左辺と右辺が等しくないかの判定を行う (`==`により使用可能) | C++23 |
130+
| [`operator<=>`](flat_multimap/op_compare_3way.md) | 三方比較を行う | C++23 |
131+
| `bool operator<(const flat_multimap& x, const flat_multimap& y);` | 左辺が右辺より小さいかの判定を行う (`<=>`により使用可能) | C++23 |
132+
| `bool operator<=(const flat_multimap& x, const flat_multimap& y);` | 左辺が右辺より小さいか等しいかの判定を行う (`<=>`により使用可能) | C++23 |
133+
| `bool operator>(const flat_multimap& x, const flat_multimap& y);` | 左辺が右辺より大きいかの判定を行う (`<=>`により使用可能) | C++23 |
134+
| `bool operator>=(const flat_multimap& x, const flat_multimap& y);` | 左辺が右辺より大きいか等しいかの判定を行う (`<=>`により使用可能) | C++23 |
135+
136+
137+
### 入れ替え
138+
139+
| 名前 | 説明 | 対応バージョン |
140+
|------|------|----------------|
141+
| [`swap`](flat_multimap/swap_free.md.nolink) | 2つの`flat_multimap`オブジェクトを入れ替える | C++23 |
142+
143+
144+
## 推論補助
145+
146+
| 名前 | 説明 | 対応バージョン |
147+
|---------------------------------------------|------------------------------------|-------|
148+
| [`(deduction_guide)`](flat_multimap/op_deduction_guide.md.nolink) | クラステンプレートの推論補助 | C++23 |
149+
150+
151+
## その他
152+
153+
| 名前 | 説明 | 対応バージョン |
154+
|------|------|----------------|
155+
| [`uses_allocator`](flat_multimap/uses_allocator.md) | `flat_multimap`による特殊化 | C++23 |
156+
157+
158+
159+
## 例
160+
### 基本的な使い方
161+
```cpp example
162+
#include <flat_map>
163+
#include <iostream>
164+
165+
int main()
166+
{
167+
// intをキー、charを値、として扱う連想配列
168+
// flat_mapとは異なり、キーが重複してもよい
169+
std::flat_multimap<int, char> fm = {
170+
{10, 'A'}, {11, 'B'}, {12, 'C'},
171+
{10, 'a'}, {11, 'b'}, {12, 'c'},
172+
};
173+
174+
// 全体を出力する
175+
for (const auto& [key, value] : fm) {
176+
std::cout << key << " : " << value << std::endl;
177+
}
178+
}
179+
```
180+
181+
#### 出力
182+
```
183+
10 : A
184+
10 : a
185+
11 : B
186+
11 : b
187+
12 : C
188+
12 : c
189+
```
190+
191+
192+
193+
### キーと要素以外のテンプレートを指定
194+
```cpp example
195+
#include <deque>
196+
#include <flat_map>
197+
#include <iostream>
198+
199+
int main()
200+
{
201+
std::deque<int> keys = {10, 10, 11, 11, 12, 12};
202+
std::deque<char> values = {'A', 'a', 'B', 'b', 'C', 'c'};
203+
204+
// intをキー、charを値として扱う連想配列
205+
// キーの順序はgreater、キーと値のコンテナはdequeで保持
206+
std::flat_multimap<int,
207+
char,
208+
std::greater<int>,
209+
std::deque<int>,
210+
std::deque<char>> fm(keys, values);
211+
212+
// 全体を出力する
213+
for (const auto& [key, value] : fm) {
214+
std::cout << key << " : " << value << std::endl;
215+
}
216+
}
217+
```
218+
219+
#### 出力
220+
```
221+
12 : C
222+
12 : c
223+
11 : B
224+
11 : b
225+
10 : A
226+
10 : a
227+
```
228+
229+
## バージョン
230+
### 言語
231+
- C++23
232+
233+
### 処理系
234+
- [Clang](/implementation.md#clang): ??
235+
- [GCC](/implementation.md#gcc): ??
236+
- [Visual C++](/implementation.md#visual_cpp): ??
237+
238+
239+
## 参照
240+
- [P0429R3 A Standard `flat_map`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0429r3.pdf)
241+
- C++23で`flat_map`が導入された経緯・動機・設計について記載されている
242+
- [P0429R9 A Standard `flat_map`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p0429r9.pdf)
243+
- C++23で導入された`flat_map`の仕様

0 commit comments

Comments
 (0)