Skip to content

Commit c135b44

Browse files
committed
create flat_set folder and files (#1079)
1 parent c7a7c9d commit c135b44

Some content is hidden

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

80 files changed

+6672
-7
lines changed

GLOBAL_QUALIFY_LIST.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@
118118
* fs::filesystem_error[link /reference/filesystem/filesystem_error.md]
119119
* fs::path[link /reference/filesystem/path.md]
120120
* <flat_map>[link /reference/flat_map.md]
121+
* <flat_set>[link /reference/flat_set.md]
121122
* <format>[link /reference/format.md]
122123
* <forward_list>[link /reference/forward_list.md]
123124
* std::forward_list[link /reference/forward_list/forward_list.md]

lang/cpp23.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ C++23とは、2023年中に改訂され、ISO/IEC 14882:2024で標準規格化
119119
- 外部から提供されるメモリバッファでストリーム処理を行うライブラリとして[`<spanstream>`](/reference/spanstream.md.nolink)を追加
120120
- 正常値とエラー値のどちらかを持つクラスおよびライブラリとして[`<expected>`](/reference/expected.md)を追加
121121
- 多次元配列ビューのライブラリとして[`<mdspan>`](/reference/mdspan.md)を追加
122-
- ノードベースではないソート済みキーによる順序付き連想コンテナのライブラリとして、[`<flat_map>`](/reference/flat_map.md)[`<flat_set>`](/reference/flat_set.md.nolink)を追加
122+
- ノードベースではないソート済みキーによる順序付き連想コンテナのライブラリとして、[`<flat_map>`](/reference/flat_map.md)[`<flat_set>`](/reference/flat_set.md)を追加
123123
- 書式指定で出力するライブラリとして[`<print>`](/reference/print.md)を追加
124124
- コルーチンによるRangeの生成をサポートする[`<generator>`](/reference/generator.md)を追加
125125
- 拡張浮動小数点数のライブラリとして[`<stdfloat>`](/reference/stdfloat.md)を追加

lang/cpp23/feature_test_macros.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@
5050
|`__cpp_lib_constexpr_typeinfo`|`202106L`|[`std::type_info::operator==()`](/reference/typeinfo/type_info/op_equal.md)`constexpr`対応|[`<typeinfo>`](/reference/typeinfo.md)|
5151
|`__cpp_lib_containers_ranges`|`202202L`|コンテナのコンストラクタのRange対応|[`<vector>`](/reference/vector.md)<br/>[`<list>`](/reference/list.md)<br/>[`<forward_list>`](/reference/forward_list.md)<br/>[`<map>`](/reference/map.md)<br/>[`<set>`](/reference/set.md)<br/>[`<unordered_map>`](/reference/unordered_map.md)<br/>[`<unordered_set>`](/reference/unordered_set.md)<br/>[`<deque>`](/reference/deque.md)<br/>[`<queue>`](/reference/queue.md)<br/>[`<stack>`](/reference/stack.md)<br/>[`<string>`](/reference/string.md)|
5252
|`__cpp_lib_expected`|`202211L`|[`<expected>`](/reference/expected.md)の追加|[`<expected>`](/reference/expected.md)|
53-
|`__cpp_lib_flat_map`|`202207L`|[`std::flat_map`](/reference/flat_map.md)`std::flat_multimap`の追加|[`<flat_map>`](/reference/flat_map.md)|
54-
|`__cpp_lib_flat_set`|`202207L`|`std::flat_set``std::flat_multiset`の追加|`<flat_set>`|
53+
|`__cpp_lib_flat_map`|`202207L`|[`std::flat_map`](/reference/flat_map/flat_map.md)[`std::flat_multimap`](/reference/flat_map/flat_multimap.md)の追加|[`<flat_map>`](/reference/flat_map.md)|
54+
|`__cpp_lib_flat_set`|`202207L`|[`std::flat_set`](/reference/flat_set/flat_set.md)[`std::flat_multiset`](/reference/flat_set/flat_multiset.md)の追加|[`<flat_set>`](/reference/flat_set.md)|
5555
|`__cpp_lib_format`|`202207L`|`std::format`の時刻型のローカライズ対応|[`<format>`](/reference/format.md)|
5656
|`__cpp_lib_format_ranges`|`202207L`|[`std::formatter`](/reference/format/formatter.md)のRange対応|[`<format>`](/reference/format.md)|
5757
|`__cpp_lib_formatters`|`202302L`|[`std::formatter`](/reference/format/formatter.md)[`std::stacktrace`](/reference/stacktrace/basic_stacktrace.md)対応と[`std::thread::id`](/reference/thread/thread/id.md)対応|[`<stacktrace>`](/reference/stacktrace.md)<br/>[`<thread>`](/reference/thread.md)|

reference.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@
111111
| [`<map>`](/reference/map.md) | 順序付き連想配列 | |
112112
| [`<set>`](/reference/set.md) | 順序付き集合 | |
113113
| [`<flat_map>`](/reference/flat_map.md) | ソート済みキーによる順序付き連想配列 | C++23 |
114-
| [`<flat_set>`](/reference/flat_set.md.nolink) | ソート済みキーによる順序付き集合 | C++23 |
114+
| [`<flat_set>`](/reference/flat_set.md) | ソート済みキーによる順序付き集合 | C++23 |
115115
| [`<unordered_map>`](/reference/unordered_map.md) | 非順序連想配列 | C++11 |
116116
| [`<unordered_set>`](/reference/unordered_set.md) | 非順序集合 | C++11 |
117117
| [`<span>`](/reference/span.md) | 部分シーケンスの参照 | C++20 |

reference/flat_set.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# flat_set
2+
* flat_set[meta header]
3+
* cpp23[meta cpp]
4+
5+
`<flat_set>` ヘッダは、ソート済みキーによる連想コンテナを定義する。
6+
7+
[`std::set`](/reference/set/set.md)と違ってノードベースの実装ではなく、メモリ連続性のある平坦 (flat) な配列で扱われる。
8+
9+
`<flat_set>` ヘッダでは、キーの重複を許さない `std::`[`flat_set`](flat_set/flat_set.md) クラステンプレート、およびキーの重複を許す `std::`[`flat_multiset`](flat_set/flat_multiset.md) クラステンプレートを提供する。
10+
11+
このヘッダでは、以下の標準ヘッダをインクルードする:
12+
13+
- [`<initializer_list>`](initializer_list.md)
14+
- [`<compare>`](compare.md)
15+
16+
17+
| 名前 | 説明 | 対応バージョン |
18+
|----------------------------------------------------------|----------------------------------------------------------------------|-------|
19+
| [`flat_set`](flat_set/flat_set.md) | キーの重複を許さない平坦な順序付き連想コンテナ(class template) | C++23 |
20+
| [`flat_multiset`](flat_set/flat_multiset.md) | キーの重複を許す平坦な順序付き連想コンテナ(class template) | C++23 |
21+
| [`sorted_unique_t`](flat_set/sorted_unique_t.md) | ソート済みかつ重複要素がないことを示すためのタグ型(class) | C++23 |
22+
| [`sorted_unique`](flat_set/sorted_unique_t.md) | ソート済みかつ重複要素がないことを示すためのタグ値(variable) | C++23 |
23+
| [`sorted_equivalent_t`](flat_set/sorted_equivalent_t.md) | ソート済みであること(重複はしてもよい)を示すためのタグ型(class) | C++23 |
24+
| [`sorted_equivalent`](flat_set/sorted_equivalent_t.md) | ソート済みであること(重複はしてもよい)を示すためのタグ値(variable) | C++23 |
25+
26+
27+
## バージョン
28+
### 言語
29+
- C++23
30+
31+
32+
## 参照
33+
- [P1222R0 A Standard `flat_set`](hhttps://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1222r0.pdf)
34+
- C++23で`flat_set`が導入された経緯・動機・設計について記載されている
35+
- [P1222R4 A Standard `flat_set`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p1222r4.pdf)
36+
- C++23で導入された`flat_set`の仕様

reference/flat_set/flat_multiset.md

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

0 commit comments

Comments
 (0)