|
| 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