Skip to content

Commit 8d9f9ce

Browse files
committed
C++26でのflat_map/set関連の仕様修正に対応 #1566
1 parent fa239b6 commit 8d9f9ce

16 files changed

Lines changed: 153 additions & 38 deletions

File tree

reference/flat_map/flat_map.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ namespace std {
4444
4545
`value_type`は、[`std::map`](/reference/map/map.md)では[`std::pair`](/reference/utility/pair.md)`<const Key, T>`だが、このクラスは[`std::pair`](/reference/utility/pair.md)`<Key, T>`である (`const`がつかない)。
4646
47-
以下の不変条件をもち、メンバ関数のいずれかが例外によって終了した場合には不変条件の状態に復元される (ただし、その復元操作によってコンテナが空になる可能性がある):
47+
以下の不変条件をもち、メンバ関数のいずれかが例外によって終了した場合には不変条件の状態に復元される (ただし、その復元操作によってコンテナが空になる可能性がある)。ムーブコンストラクタとムーブ代入演算子の場合、両方の引数の不変条件が復元される
4848
4949
- キーの配列と値の配列が、同じ要素数をもつ
5050
- キーの配列が、指定された比較関数オブジェクトを尊重してソートを行う
@@ -369,3 +369,5 @@ int main()
369369
- C++23で`flat_map`が導入された経緯・動機・設計について記載されている
370370
- [P0429R9 A Standard `flat_map`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p0429r9.pdf)
371371
- C++23で導入された`flat_map`の仕様
372+
- [P3567R2 flat_meow Fixes](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3567r2.html)
373+
- C++26で`swap`の条件付き`noexcept``insert_range`のソート済みオーバーロード追加などの修正が行われた

reference/flat_map/flat_map/insert_range.md

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,15 @@
77

88
```cpp
99
template<container-compatible-range<value_type> R>
10-
void insert_range(R&& rg); // (1) C++23
10+
void insert_range(R&& rg); // (1) C++23
1111
template<container-compatible-range<value_type> R>
12-
constexpr void insert_range(R&& rg); // (1) C++26
12+
constexpr void insert_range(R&& rg); // (1) C++26
13+
14+
template<container-compatible-range<value_type> R>
15+
constexpr void insert_range(sorted_unique_t, R&& rg); // (2) C++26
1316
```
1417
* container-compatible-range[link /reference/exposition-only/container-compatible-range.md]
18+
* sorted_unique_t[link /reference/flat_map/sorted_unique_t.md]
1519
1620
## 概要
1721
Rangeを挿入し、コンテナを拡張する。
@@ -26,17 +30,19 @@ Rangeを挿入し、コンテナを拡張する。
2630
2731
2832
## 効果
29-
- メンバ変数として保持しているコンテナ`c`に、以下のように挿入する:
33+
- (1) : メンバ変数として保持しているコンテナ`c`に、以下のように挿入する:
3034
```cpp
31-
for (const auto& e : rg) {
32-
c.keys.insert(c.keys.end(), e.first);
33-
c.values.insert(c.values.end(), e.second);
34-
}
35+
ranges::for_each(rg, [&](value_type e) {
36+
c.keys.insert(c.keys.end(), std::move(e.first));
37+
c.values.insert(c.values.end(), std::move(e.second));
38+
});
3539
```
3640
* c.keys[link containers.md]
3741
* c.values[link containers.md]
42+
* ranges::for_each[link /reference/algorithm/ranges_for_each.md]
3843
* end()[link /reference/vector/vector/end.md]
3944
* insert[link /reference/vector/vector/insert.md]
45+
* std::move[link /reference/utility/move.md]
4046
* first[link /reference/utility/pair/first.md]
4147
* second[link /reference/utility/pair/second.md]
4248
@@ -58,13 +64,16 @@ Rangeを挿入し、コンテナを拡張する。
5864
* key_equiv[link key_equiv.md]
5965
* distance[link /reference/iterator/distance.md]
6066
67+
- (2) : `insert_range(rg)`と等価
68+
6169
6270
## 戻り値
6371
なし
6472
6573
6674
## 計算量
67-
- Nをこの操作の前の[`size()`](size.md)、Mを[`ranges::distance`](/reference/iterator/ranges_distance.md)`(rg)`として、N + MlogM
75+
- (1) : Nをこの操作の前の[`size()`](size.md)、Mを[`ranges::distance`](/reference/iterator/ranges_distance.md)`(rg)`として、N + MlogM
76+
- (2) : 線形
6877
6978
7079
## 備考
@@ -123,3 +132,6 @@ int main()
123132

124133
## 参照
125134
- [P3372R3 constexpr containers and adaptors](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3372r3.html)
135+
- [P3567R2 flat_meow Fixes](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3567r2.html)
136+
- C++26で(2)の`sorted_unique_t`をとるオーバーロードが追加された
137+
- C++26で(1)の効果が、要素のコピーではなくムーブを行うように修正された

reference/flat_map/flat_map/swap.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,13 @@
66
* cpp23[meta cpp]
77

88
```cpp
9-
void swap(flat_map& y) noexcept; // (1) C++23
10-
constexpr void swap(flat_map& y) noexcept; // (1) C++26
9+
void swap(flat_map& y) noexcept; // (1) C++23
10+
constexpr void swap(flat_map& y)
11+
noexcept(is_nothrow_swappable_v<key_container_type> &&
12+
is_nothrow_swappable_v<mapped_container_type> &&
13+
is_nothrow_swappable_v<key_compare>); // (1) C++26
1114
```
15+
* is_nothrow_swappable_v[link /reference/type_traits/is_nothrow_swappable.md]
1216
1317
## 概要
1418
コンテナ内のコンテンツを、同じ型の要素を保持する他の `flat_map` オブジェクトである `y` 内のコンテンツと交換する。
@@ -84,3 +88,5 @@ fm2 : {[10,a], [20,b], [30,c]}
8488

8589
## 参照
8690
- [P3372R3 constexpr containers and adaptors](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3372r3.html)
91+
- [P3567R2 flat_meow Fixes](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3567r2.html)
92+
- C++26で、`noexcept`指定が無条件から条件付きに変更された。内部コンテナと比較関数オブジェクトの`swap`が例外を送出しない場合にのみ`noexcept`となる

reference/flat_map/flat_map/swap_free.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ namespace std {
1313
template <class Key, class T, class Compare, class KeyContainer, class MappedContainer>
1414
constexpr void
1515
swap(flat_map<Key, T, Compare, KeyContainer, MappedContainer>& x,
16-
flat_map<Key, T, Compare, KeyContainer, MappedContainer>& y); // (1) C++26
16+
flat_map<Key, T, Compare, KeyContainer, MappedContainer>& y)
17+
noexcept(noexcept(x.swap(y))); // (1) C++26
1718
}
1819
```
1920
@@ -90,3 +91,5 @@ fm2 : {[10,a], [20,b], [30,c]}
9091

9192
## 参照
9293
- [P3372R3 constexpr containers and adaptors](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3372r3.html)
94+
- [P3567R2 flat_meow Fixes](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3567r2.html)
95+
- C++26で、`noexcept`指定が条件付きに変更された。メンバ関数[`swap()`](swap.md)`noexcept`条件に従う

reference/flat_map/flat_multimap.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ namespace std {
4444
4545
`value_type`は、[`std::multimap`](/reference/map/multimap.md)では[`std::pair`](/reference/utility/pair.md)`<const Key, T>`だが、このクラスは[`std::pair`](/reference/utility/pair.md)`<Key, T>`である (`const`がつかない)。
4646
47-
以下の不変条件をもち、メンバ関数のいずれかが例外によって終了した場合には不変条件の状態に復元される (ただし、その復元操作によってコンテナが空になる可能性がある):
47+
以下の不変条件をもち、メンバ関数のいずれかが例外によって終了した場合には不変条件の状態に復元される (ただし、その復元操作によってコンテナが空になる可能性がある)。ムーブコンストラクタとムーブ代入演算子の場合、両方の引数の不変条件が復元される
4848
4949
- キーの配列と値の配列が、同じ要素数をもつ
5050
- キーの配列が、指定された比較関数オブジェクトを尊重してソートを行う
@@ -284,3 +284,5 @@ int main()
284284
- C++23で`flat_map`が導入された経緯・動機・設計について記載されている
285285
- [P0429R9 A Standard `flat_map`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p0429r9.pdf)
286286
- C++23で導入された`flat_map`の仕様
287+
- [P3567R2 flat_meow Fixes](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3567r2.html)
288+
- C++26で`swap`の条件付き`noexcept``insert_range`のソート済みオーバーロード追加などの修正が行われた

reference/flat_map/flat_multimap/insert_range.md

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,15 @@
77

88
```cpp
99
template<container-compatible-range<value_type> R>
10-
void insert_range(R&& rg); // (1) C++23
10+
void insert_range(R&& rg); // (1) C++23
1111
template<container-compatible-range<value_type> R>
12-
constexpr void insert_range(R&& rg); // (1) C++26
12+
constexpr void insert_range(R&& rg); // (1) C++26
13+
14+
template<container-compatible-range<value_type> R>
15+
constexpr void insert_range(sorted_equivalent_t, R&& rg); // (2) C++26
1316
```
1417
* container-compatible-range[link /reference/exposition-only/container-compatible-range.md]
18+
* sorted_equivalent_t[link /reference/flat_map/sorted_equivalent_t.md]
1519
1620
## 概要
1721
Rangeを挿入し、コンテナを拡張する。
@@ -22,30 +26,35 @@ Rangeを挿入し、コンテナを拡張する。
2226
2327
2428
## 効果
25-
- メンバ変数として保持しているコンテナ`c`に、以下のように挿入する:
29+
- (1) : メンバ変数として保持しているコンテナ`c`に、以下のように挿入する:
2630
```cpp
27-
for (const auto& e : rg) {
28-
c.keys.insert(c.keys.end(), e.first);
29-
c.values.insert(c.values.end(), e.second);
30-
}
31+
ranges::for_each(rg, [&](value_type e) {
32+
c.keys.insert(c.keys.end(), std::move(e.first));
33+
c.values.insert(c.values.end(), std::move(e.second));
34+
});
3135
```
3236
* c.keys[link containers.md]
3337
* c.values[link containers.md]
38+
* ranges::for_each[link /reference/algorithm/ranges_for_each.md]
3439
* end()[link /reference/vector/vector/end.md]
3540
* insert[link /reference/vector/vector/insert.md]
41+
* std::move[link /reference/utility/move.md]
3642
* first[link /reference/utility/pair/first.md]
3743
* second[link /reference/utility/pair/second.md]
3844
3945
- 次に、新しく挿入された要素の範囲を`value_comp()`を基準にソートする
4046
- 次に、ソートされた結果の範囲と、既存の要素のソートされた範囲をひとつのソートされた範囲にマージする
4147
48+
- (2) : `insert_range(rg)`と等価
49+
4250
4351
## 戻り値
4452
なし
4553
4654
4755
## 計算量
48-
- Nをこの操作の前の[`size()`](size.md)、Mを[`ranges::distance`](/reference/iterator/ranges_distance.md)`(rg)`として、N + MlogM
56+
- (1) : Nをこの操作の前の[`size()`](size.md)、Mを[`ranges::distance`](/reference/iterator/ranges_distance.md)`(rg)`として、N + MlogM
57+
- (2) : 線形
4958
5059
5160
## 備考
@@ -103,3 +112,6 @@ int main()
103112

104113
## 参照
105114
- [P3372R3 constexpr containers and adaptors](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3372r3.html)
115+
- [P3567R2 flat_meow Fixes](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3567r2.html)
116+
- C++26で(2)の`sorted_equivalent_t`をとるオーバーロードが追加された
117+
- C++26で(1)の効果が、要素のコピーではなくムーブを行うように修正された

reference/flat_map/flat_multimap/swap.md

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,13 @@
66
* cpp23[meta cpp]
77

88
```cpp
9-
void swap(flat_multimap& y) noexcept; // (1) C++23
10-
constexpr void swap(flat_multimap& y) noexcept; // (1) C++26
9+
void swap(flat_multimap& y) noexcept; // (1) C++23
10+
constexpr void swap(flat_multimap& y)
11+
noexcept(is_nothrow_swappable_v<key_container_type> &&
12+
is_nothrow_swappable_v<mapped_container_type> &&
13+
is_nothrow_swappable_v<key_compare>); // (1) C++26
1114
```
15+
* is_nothrow_swappable_v[link /reference/type_traits/is_nothrow_swappable.md]
1216
1317
## 概要
1418
コンテナ内のコンテンツを、同じ型の要素を保持する他の `flat_multimap` オブジェクトである `y` 内のコンテンツと交換する。
@@ -81,6 +85,7 @@ fm2 : {[10,a], [20,b], [30,c]}
8185
- [GCC](/implementation.md#gcc): ??
8286
- [Visual C++](/implementation.md#visual_cpp): ??
8387

84-
8588
## 参照
8689
- [P3372R3 constexpr containers and adaptors](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3372r3.html)
90+
- [P3567R2 flat_meow Fixes](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3567r2.html)
91+
- C++26で、`noexcept`指定が無条件から条件付きに変更された。内部コンテナと比較関数オブジェクトの`swap`が例外を送出しない場合にのみ`noexcept`となる

reference/flat_map/flat_multimap/swap_free.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ namespace std {
1313
template <class Key, class T, class Compare, class KeyContainer, class MappedContainer>
1414
constexpr void
1515
swap(flat_multimap<Key, T, Compare, KeyContainer, MappedContainer>& x,
16-
flat_multimap<Key, T, Compare, KeyContainer, MappedContainer>& y); // (1) C++26
16+
flat_multimap<Key, T, Compare, KeyContainer, MappedContainer>& y)
17+
noexcept(noexcept(x.swap(y))); // (1) C++26
1718
}
1819
```
1920
@@ -87,6 +88,7 @@ fm2 : {[10,a], [20,b], [30,c]}
8788
- [GCC](/implementation.md#gcc): ??
8889
- [Visual C++](/implementation.md#visual_cpp): ??
8990

90-
9191
## 参照
9292
- [P3372R3 constexpr containers and adaptors](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3372r3.html)
93+
- [P3567R2 flat_meow Fixes](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3567r2.html)
94+
- C++26で、`noexcept`指定が条件付きに変更された。メンバ関数[`swap()`](swap.md)`noexcept`条件に従う

reference/flat_set/flat_multiset.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,3 +260,5 @@ int main()
260260
- C++23で`flat_set`が導入された経緯・動機・設計について記載されている
261261
- [P1222R4 A Standard `flat_set`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p1222r4.pdf)
262262
- C++23で導入された`flat_set`の仕様
263+
- [P3567R2 flat_meow Fixes](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3567r2.html)
264+
- C++26で`swap`の条件付き`noexcept``insert_range`のソート済みオーバーロード追加などの修正が行われた

reference/flat_set/flat_multiset/insert_range.md

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,15 @@
77

88
```cpp
99
template<container-compatible-range<value_type> R>
10-
void insert_range(R&& rg); // (1) C++23
10+
void insert_range(R&& rg); // (1) C++23
1111
template<container-compatible-range<value_type> R>
12-
constexpr void insert_range(R&& rg); // (1) C++26
12+
constexpr void insert_range(R&& rg); // (1) C++26
13+
14+
template<container-compatible-range<value_type> R>
15+
constexpr void insert_range(sorted_equivalent_t, R&& rg); // (2) C++26
1316
```
1417
* container-compatible-range[link /reference/exposition-only/container-compatible-range.md]
18+
* sorted_equivalent_t[link /reference/flat_set/sorted_equivalent_t.md]
1519
1620
## 概要
1721
Rangeを挿入し、コンテナを拡張する。
@@ -21,12 +25,31 @@ Rangeを挿入し、コンテナを拡張する。
2125
内部的に `flat_multiset` コンテナは、コンストラクト時に指定された比較オブジェクトによって要素を下位から上位へとソートして保持する。
2226
2327
28+
## 効果
29+
- (1) : メンバ変数として保持しているコンテナ`c`に、以下のように挿入する:
30+
```cpp
31+
ranges::for_each(rg, [&](auto&& e) {
32+
c.insert(c.end(), std::forward<decltype(e)>(e));
33+
});
34+
```
35+
* ranges::for_each[link /reference/algorithm/ranges_for_each.md]
36+
* end()[link /reference/vector/vector/end.md]
37+
* insert[link /reference/vector/vector/insert.md]
38+
* std::forward[link /reference/utility/forward.md]
39+
40+
- 次に、新しく挿入された要素の範囲を`value_comp()`を基準にソートする
41+
- 次に、ソートされた結果の範囲と、既存の要素のソートされた範囲をひとつのソートされた範囲にマージする
42+
43+
- (2) : `insert_range(rg)`と等価
44+
45+
2446
## 戻り値
2547
なし
2648
2749
2850
## 計算量
29-
- Nをこの操作の前の[`size()`](size.md)、Mを[`ranges::distance`](/reference/iterator/ranges_distance.md)`(rg)`として、N + MlogM
51+
- (1) : Nをこの操作の前の[`size()`](size.md)、Mを[`ranges::distance`](/reference/iterator/ranges_distance.md)`(rg)`として、N + MlogM
52+
- (2) : 線形
3053
3154
3255
## 備考
@@ -77,3 +100,5 @@ int main()
77100

78101
## 参照
79102
- [P3372R3 constexpr containers and adaptors](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3372r3.html)
103+
- [P3567R2 flat_meow Fixes](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3567r2.html)
104+
- C++26で(2)の`sorted_equivalent_t`をとるオーバーロードが追加された

0 commit comments

Comments
 (0)