From 9fe59f7c3a1b97adef5bc273c0ab9f81f8b085a7 Mon Sep 17 00:00:00 2001 From: Akira Takahashi Date: Mon, 17 Apr 2023 18:07:27 +0900 Subject: [PATCH] =?UTF-8?q?flat=5Fmap=E3=82=AF=E3=83=A9=E3=82=B9=E3=81=AE?= =?UTF-8?q?=E3=83=9A=E3=83=BC=E3=82=B8=E3=82=92=E8=BF=BD=E5=8A=A0=20#1078?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- reference/flat_map.md | 4 +- reference/flat_map/flat_map.md | 171 ++++++++++++++++++++ reference/format/format.md | 2 +- reference/format/range-default-formatter.md | 2 +- reference/format/range_format.md | 2 +- 5 files changed, 176 insertions(+), 5 deletions(-) create mode 100644 reference/flat_map/flat_map.md diff --git a/reference/flat_map.md b/reference/flat_map.md index 568ef4d4e1..7523236c44 100644 --- a/reference/flat_map.md +++ b/reference/flat_map.md @@ -6,7 +6,7 @@ [`std::map`](/reference/map/map.md)と違ってノードベースの実装ではなく、メモリ連続性のある平坦 (flat) な配列で扱われる。 -`` ヘッダでは、キーの重複を許さない `std::`[`flat_map`](flat_map/flat_map.md.nolink) クラステンプレート、およびキーの重複を許す `std::`[`flat_multimap`](flat_map/flat_multimap.md.nolink) クラステンプレートを提供する。 +`` ヘッダでは、キーの重複を許さない `std::`[`flat_map`](flat_map/flat_map.md) クラステンプレート、およびキーの重複を許す `std::`[`flat_multimap`](flat_map/flat_multimap.md.nolink) クラステンプレートを提供する。 このヘッダでは、以下の標準ヘッダをインクルードする: @@ -16,7 +16,7 @@ | 名前 | 説明 | 対応バージョン | |----------------------------------------------|--------------------------------------------------------|-------| -| [`flat_map`](flat_map/flat_map.md.nolink) | キーの重複を許さない平坦な順序付き連想コンテナ(class template) | C++23 | +| [`flat_map`](flat_map/flat_map.md) | キーの重複を許さない平坦な順序付き連想コンテナ(class template) | C++23 | | [`flat_multimap`](flat_map/flat_multimap.md.nolink) | キーの重複を許す平坦な順序付き連想コンテナ(class template) | C++23 | diff --git a/reference/flat_map/flat_map.md b/reference/flat_map/flat_map.md new file mode 100644 index 0000000000..c49ed299d6 --- /dev/null +++ b/reference/flat_map/flat_map.md @@ -0,0 +1,171 @@ +# flat_map +* flat_map[meta header] +* std[meta namespace] +* class template[meta id-type] +* cpp23[meta cpp] + +```cpp +namespace std { + template , + class KeyContainer = vector, + class MappedContainer = vector> + class flat_map; +} +``` +* less[link ../functional/less.md] +* vector[link /reference/vector.md] + +## 概要 + + +## メンバ関数 +### 構築・破棄 + +| 名前 | 説明 | 対応バージョン | +|---------------------------------|----------------|-------| +| [`(constructor)`](flat_map/op_constructor.md.nolink) | コンストラクタ | C++23 | +| [`(destructor)`](flat_map/op_destructor.md.nolink) | デストラクタ | C++23 | +| [`operator=`](flat_map/op_assign.md.nolink) | 代入演算子 | C++23 | + + +### イテレータ + +| 名前 | 説明 | 対応バージョン | +|------------------------------|----------------------------------------------|-------| +| [`begin`](flat_map/begin.md.nolink) | 先頭を指すイテレータを取得する | C++23 | +| [`cbegin`](flat_map/cbegin.md.nolink) | 先頭を指す読み取り専用イテレータを取得する | C++23 | +| [`end`](flat_map/end.md.nolink) | 末尾を指すイテレータを取得する | C++23 | +| [`cend`](flat_map/cend.md.nolink) | 末尾を指す読み取り専用イテレータを取得する | C++23 | +| [`rbegin`](flat_map/rbegin.md.nolink) | 末尾を指す逆イテレータを取得する | C++23 | +| [`crbegin`](flat_map/crbegin.md.nolink) | 末尾を指す読み取り専用逆イテレータを取得する | C++23 | +| [`rend`](flat_map/rend.md.nolink) | 先頭を指す逆イテレータを取得する | C++23 | +| [`crend`](flat_map/crend.md.nolink) | 先頭を指す読み取り専用逆イテレータを取得する | C++23 | + + +### 領域 + +| 名前 | 説明 | 対応バージョン | +|---------------------------------|------------------------------------|-------| +| [`empty`](flat_map/empty.md.nolink) | コンテナが空であるかどうかを調べる | C++23 | +| [`size`](flat_map/size.md.nolink) | 要素数を取得する | C++23 | +| [`max_size`](flat_map/max_size.md.nolink) | 格納可能な最大の要素数を取得する | C++23 | + + +### コンテナの変更 + +| 名前 | 説明 | 対応バージョン | +|-----------------------------------------------|--------------------------------------------|----------------| +| [`clear`](flat_map/clear.md.nolink) | 全ての要素を削除する | C++23 | +| [`insert`](flat_map/insert.md.nolink) | 要素を挿入する | C++23 | +| [`insert_or_assign`](flat_map/insert_or_assign.md.nolink) | 要素を挿入、あるいは代入する | C++23 | +| [`insert_range`](flat_map/insert_range.md.nolink) | Rangeを挿入する | C++23 | +| [`emplace`](flat_map/emplace.md.nolink) | 要素を直接構築する | C++23 | +| [`emplace_hint`](flat_map/emplace_hint.md.nolink) | ヒントを使って要素を直接構築する | C++23 | +| [`try_emplace`](flat_map/try_emplace.md.nolink) | キーが存在しない場合のみ要素を直接構築する | C++23 | +| [`erase`](flaflat_maptmap/erase.md.nolink) | 要素を削除する | C++23 | +| [`swap`](flat_map/swap.md.nolink) | コンテンツを交換する | C++23 | +| [`extract`](flat_map/extract.md.nolink) | キーのコンテナ、値のコンテナを取得する | C++23 | +| [`replace`](flat_map/replace.md.nolink) | キーのコンテナ、値のコンテナを置き換える | C++23 | + + +### 要素アクセス + +| 名前 | 説明 | 対応バージョン | +|---------------------------------------|--------------------------------------------|-------| +| [`operator[]`](flat_map/op_at.md.nolink) | 指定したキーを持つ要素を取得する | C++23 | +| [`at`](flat_map/at.md.nolink) | 指定したキーを持つ要素を取得する | C++23 | +| [`count`](flat_map/count.md.nolink) | 指定したキーにマッチする要素の数を取得する | C++23 | +| [`find`](flat_map/find.md.nolink) | 指定したキーで要素を探す | C++23 | +| [`contains`](flat_map/contains.md.nolink) | 指定したキーの要素が含まれているかを判定する | C++23 | +| [`equal_range`](flat_map/equal_range.md.nolink) | 指定したキーにマッチする要素範囲を取得する | C++23 | +| [`lower_bound`](flat_map/lower_bound.md.nolink) | 与えられた値より小さくない最初の要素へのイテレータを取得する | C++23 | +| [`upper_bound`](flat_map/upper_bound.md.nolink) | 特定の値よりも大きい最初の要素へのイテレータを取得する | C++23 | + +### オブザーバー + +| 名前 | 説明 | 対応バージョン | +|-------------------------------------|----------------------------------------|----------------| +| [`key_comp`](flat_map/key_comp.md.nolink) | キー比較用の関数オブジェクトを取得する | C++23 | +| [`value_comp`](flat_map/value_comp.md.nolink) | 要素比較用の関数オブジェクトを取得する | C++23 | + +### 比較演算子 + +| 名前 | 説明 | 対応バージョン | +|------|------|----------------| +| [`operator==`](flat_map/op_equal.md.nolink) | 左辺と右辺が等しいかの判定を行う | C++23 | +| `bool operator!=(const flat_map& x, const flat_map& y);` | 左辺と右辺が等しくないかの判定を行う (`==`により使用可能) | C++23 | +| [`operator<=>`](flat_map/op_compare_3way.md.nolink) | 三方比較を行う | C++23 | +| `bool operator<(const flat_map& x, const flat_map& y);` | 左辺が右辺より小さいかの判定を行う (`<=>`により使用可能) | C++23 | +| `bool operator<=(const flat_map& x, const flat_map& y);` | 左辺が右辺より小さいか等しいかの判定を行う (`<=>`により使用可能) | C++23 | +| `bool operator>(const flat_map& x, const flat_map& y);` | 左辺が右辺より大きいかの判定を行う (`<=>`により使用可能) | C++23 | +| `bool operator>=(const flat_map& x, const flat_map& y);` | 左辺が右辺より大きいか等しいかの判定を行う (`<=>`により使用可能) | C++23 | + + +## メンバ型 + +| 名前 | 説明 | 対応バージョン | +|------|------|----------------| +| `key_type` | キーの型。テンプレートパラメータ `Key` | C++23 | +| `mapped_type` | 値の型。テンプレートパラメータ `T` | C++23 | +| `value_type` | 要素の型。`[`std::pair`](/reference/utility/pair.md)`` | C++23 | +| `key_compare` | キー値の大小関係を判定する二項述語の型。テンプレートパラメータ `Compare` | C++23 | +| [`value_compare`](flat_map/value_compare.md.nolink) | 要素値のキー部分で大小関係を判定する二項述語の型。入れ子クラス | C++23 | +| `reference` | 要素への参照型。[`std::pair`](/reference/utility/pair.md)`` | C++23 | +| `const_reference` | 要素への`const`参照型。[`std::pair`](/reference/utility/pair.md)`` | C++23 | +| `size_type` | 要素数を表す符号なし整数型 [`size_t`](/reference/cstddef/size_t.md) | C++23 | +| `difference_type` | 同一のコンテナを指す `iterator` の差を表す符号付き整数型 [`ptrdiff_t`](/reference/cstddef/ptrdiff_t.md) | C++23 | +| `iterator` | 双方向イテレータ | C++23 | +| `const_iterator` | 読み取り専用双方向イテレータ | C++23 | +| `reverse_iterator` | 逆順双方向イテレータ。[`std::reverse_iterator`](/reference/iterator/reverse_iterator.md)`` | C++23 | +| `const_reverse_iterator` | 読み取り専用逆順双方向イテレータ。[`std::reverse_iterator`](/reference/iterator/reverse_iterator.md)`` | C++23 | +| `key_container_type` | キーを格納するコンテナ型 `KeyContainer` | C++23 | +| `mapped_container_type` | 値を格納するコンテナ型 `MappedContainer` | C++23 | +| [`containers`](flat_map/containers.md.nolink) | キーのコンテナと値のコンテナを保持する型 | C++23 | + + +## 非メンバ関数 +### 入れ替え + +| 名前 | 説明 | 対応バージョン | +|------|------|----------------| +| [`swap`](flat_map/swap_free.md.nolink) | 2つの`flat_map`オブジェクトを入れ替える | C++23 | + + +### 要素削除 + +| 名前 | 説明 | 対応バージョン | +|------|------|----------------| +| [`erase_if`](flat_map/erase_if_free.md.nolink) | 指定した条件に合致する要素とその分の領域を、コンテナから削除する | C++23 | + + +## 推論補助 + +| 名前 | 説明 | 対応バージョン | +|---------------------------------------------|------------------------------------|-------| +| [`(deduction_guide)`](flat_map/op_deduction_guide.md.nolink) | クラステンプレートの推論補助 | C++23 | + + +## 例 +### 基本的な使い方 + +#### 出力 + + + +### ユーザー定義型をキーとして使用する (`operator<=>`を定義) +``` + +#### 出力 + + +### ユーザー定義型をキーとして使用する (大小比較の関数オブジェクトを定義) +#### 出力 + + +## 参照 +- [P0429R3 A Standard `flat_map`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0429r3.pdf) + - C++23で`flat_map`が導入された経緯・動機・設計について記載されている +- [P0429R9 A Standard `flat_map`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p0429r9.pdf) + - C++23で導入された`flat_map`の仕様 diff --git a/reference/format/format.md b/reference/format/format.md index cf7c5f0d40..875d62741b 100644 --- a/reference/format/format.md +++ b/reference/format/format.md @@ -476,7 +476,7 @@ int main() * pque.push[link /reference/queue/priority_queue/push.md] * std::stack[link /reference/stack/stack.md] * st.push[link /reference/stack/stack/push.md] -* std::flat_map[link /reference/flat_map/flat_map.md.nolink] +* std::flat_map[link /reference/flat_map/flat_map.md] * std::flat_set[link /reference/flat_map/flat_set.md.nolink] #### 出力 diff --git a/reference/format/range-default-formatter.md b/reference/format/range-default-formatter.md index 3d5c97b1e5..45f154b179 100644 --- a/reference/format/range-default-formatter.md +++ b/reference/format/range-default-formatter.md @@ -40,7 +40,7 @@ namespace std { - (1) : プライマリテンプレート。宣言のみ - (2) : Range・シーケンスコンテナに対する特殊化。デバッグ出力の有効化と、`[a, b, c]`形式の出力を行う -- (3) : [`std::map`](/reference/map/map.md)や[`std::flat_map`](/reference/flat_map/flat_map.md.nolink)などの連想コンテナに対する特殊化。デバッグ出力の有効化と、`{1: a, 2: b}`形式での出力を行う +- (3) : [`std::map`](/reference/map/map.md)や[`std::flat_map`](/reference/flat_map/flat_map.md)などの連想コンテナに対する特殊化。デバッグ出力の有効化と、`{1: a, 2: b}`形式での出力を行う - (4) : [`std::set`](/reference/set/set.md)や[`std::flat_set`](/reference/flat_set/flat_set.md.nolink)などの集合コンテナに対する特殊化。デバッグ出力の有効化と、`{a, b, c}`形式の出力を行う - (5) : 文字列形式の出力を行うRangeに対する特殊化。Rangeを文字列として出力し、[`range_format::debug_string`](range_format.md)指定であればデバッグ文字列として出力する diff --git a/reference/format/range_format.md b/reference/format/range_format.md index eca360a279..be68bcd919 100644 --- a/reference/format/range_format.md +++ b/reference/format/range_format.md @@ -24,7 +24,7 @@ Rangeの書式種別を表す列挙型。 | 列挙値 | 説明 | |----------------|------| | `disabled` | 書式化ができないRangeであることを表す値 | -| `map` | [`std::map`](/reference/map/map.md)や[`std::flat_map`](/reference/flat_map/flat_map.md.nolink)向けの書式。`{k1: v1, k2: v2}` | +| `map` | [`std::map`](/reference/map/map.md)や[`std::flat_map`](/reference/flat_map/flat_map.md)向けの書式。`{k1: v1, k2: v2}` | | `set` | [`std::set`](/reference/set/set.md)や[`std::flat_set`](/reference/flat_set/flat_set.md.nolink)向けの書式。`{v1, v2}` | | `sequence` | [`std::vector`](/reference/vector/vector.md)や[`std::array`](/reference/array/array.md)向けの書式。`[v1, v2]`| | `string` | 文字列向けの書式。`abc` |