Skip to content

Commit c057325

Browse files
committed
map::try_emplace : C++26の異種混合ルックアップに対応 #1189
1 parent c036064 commit c057325

1 file changed

Lines changed: 39 additions & 20 deletions

File tree

reference/map/map/try_emplace.md

Lines changed: 39 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,34 @@
77

88
```cpp
99
template <class... Args>
10-
pair<iterator, bool> try_emplace(const key_type& k, Args&&... args); // (1)
10+
pair<iterator, bool>
11+
try_emplace(const key_type& k, Args&&... args); // (1) C++17
1112

1213
template <class... Args>
13-
pair<iterator, bool> try_emplace(key_type&& k, Args&&... args); // (2)
14+
pair<iterator, bool>
15+
try_emplace(key_type&& k, Args&&... args); // (2) C++17
1416

1517
template <class... Args>
16-
iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args); // (3)
18+
iterator
19+
try_emplace(const_iterator hint,
20+
const key_type& k,
21+
Args&&... args); // (3) C++17
1722

1823
template <class... Args>
19-
iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args); // (4)
24+
iterator
25+
try_emplace(const_iterator hint,
26+
key_type&& k,
27+
Args&&... args); // (4) C++17
28+
29+
template <class K, class... Args>
30+
pair<iterator, bool>
31+
try_emplace(K&& k, Args&&... args); // (5) C++26
32+
33+
template <class K, class... Args>
34+
iterator
35+
try_emplace(const_iterator hint,
36+
K&& k,
37+
Args&&... args); // (6) C++26
2038
```
2139
* pair[link /reference/utility/pair.md]
2240
@@ -32,44 +50,43 @@ iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args);
3250
- (2) : 指定された一時オブジェクトのキーが存在しない場合に、要素を直接構築で挿入する
3351
- (3) : キーを検索するヒントを指定し、指定されたキーが存在しない場合に、要素を直接構築で挿入する
3452
- (4) : キーを検索するヒントを指定し、指定された一時オブジェクトのキーが存在しない場合に、要素を直接構築で挿入する
53+
- (5) : `key_type`型と比較可能なキーが存在しない場合に、要素を直接構築で挿入する
54+
- (6) : キーを検索するヒントを指定し、指定された`key_type`型と比較可能なキーが存在しない場合に、要素を直接構築で挿入する
3555
3656
3757
## テンプレートパラメータ制約
38-
- (1)、(3) : `value_type` は、[`piecewise_construct`](/reference/utility/piecewise_construct_t.md), [`forward_as_tuple`](/reference/tuple/forward_as_tuple.md)`(k)`, [`forward_as_tuple`](/reference/tuple/forward_as_tuple.md)`(`[`forward`](/reference/utility/forward.md)`<Args>(args)...)` から `map` に直接構築可能であること
39-
- (2)、(4) : `value_type` は、[`piecewise_construct`](/reference/utility/piecewise_construct_t.md), [`forward_as_tuple`](/reference/tuple/forward_as_tuple.md)`(`[`move`](/reference/utility/move.md)`(k))`, [`forward_as_tuple`](/reference/tuple/forward_as_tuple.md)`(`[`forward`](/reference/utility/forward.md)`<Args>(args)...)` から `map` に直接構築可能であること
58+
- (1)、(3)、(5) : `value_type` は、[`piecewise_construct`](/reference/utility/piecewise_construct_t.md), [`forward_as_tuple`](/reference/tuple/forward_as_tuple.md)`(k)`, [`forward_as_tuple`](/reference/tuple/forward_as_tuple.md)`(`[`forward`](/reference/utility/forward.md)`<Args>(args)...)` から `map` に直接構築可能であること
59+
- (2)、(4)、(6) : `value_type` は、[`piecewise_construct`](/reference/utility/piecewise_construct_t.md), [`forward_as_tuple`](/reference/tuple/forward_as_tuple.md)`(`[`move`](/reference/utility/move.md)`(k))`, [`forward_as_tuple`](/reference/tuple/forward_as_tuple.md)`(`[`forward`](/reference/utility/forward.md)`<Args>(args)...)` から `map` に直接構築可能であること
60+
- (5), (6) : `key_compare::is_transparent` が妥当な式であること
4061
4162
なお、規格に記載はないが、`hint` は [`emplace_hint`](emplace_hint.md) と同様、コンテナの有効な読み取り専用イテレータである必要があるものと思われる。
4263
4364
4465
## 効果
45-
- (1)、(3) : `map` が `k` と同値のキーを持つ要素を持っている場合、何もしない(引数への副作用もない)。そうでなければ、[`piecewise_construct`](/reference/utility/piecewise_construct_t.md), [`forward_as_tuple`](/reference/tuple/forward_as_tuple.md)`(k)`, [`forward_as_tuple`](/reference/tuple/forward_as_tuple.md)`(`[`forward`](/reference/utility/forward.md)`<Args>(args)...)` から構築した `value_type` 型のオブジェクトを挿入する。
46-
- (2)、(4) : `map` が `k` と同値のキーを持つ要素を持っている場合、何もしない(引数への副作用もない)。そうでなければ、[`piecewise_construct`](/reference/utility/piecewise_construct_t.md), [`forward_as_tuple`](/reference/tuple/forward_as_tuple.md)`(`[`move`](/reference/utility/move.md)`(k))`, [`forward_as_tuple`](/reference/tuple/forward_as_tuple.md)`(`[`forward`](/reference/utility/forward.md)`<Args>(args)...)` から構築した `value_type` 型のオブジェクトを挿入する。
66+
- (1)、(3)、(5) : `map` が `k` と同値のキーを持つ要素を持っている場合、何もしない(引数への副作用もない)。そうでなければ、[`piecewise_construct`](/reference/utility/piecewise_construct_t.md), [`forward_as_tuple`](/reference/tuple/forward_as_tuple.md)`(k)`, [`forward_as_tuple`](/reference/tuple/forward_as_tuple.md)`(`[`forward`](/reference/utility/forward.md)`<Args>(args)...)` から構築した `value_type` 型のオブジェクトを挿入する。
67+
- (2)、(4)、(6) : `map` が `k` と同値のキーを持つ要素を持っている場合、何もしない(引数への副作用もない)。そうでなければ、[`piecewise_construct`](/reference/utility/piecewise_construct_t.md), [`forward_as_tuple`](/reference/tuple/forward_as_tuple.md)`(`[`move`](/reference/utility/move.md)`(k))`, [`forward_as_tuple`](/reference/tuple/forward_as_tuple.md)`(`[`forward`](/reference/utility/forward.md)`<Args>(args)...)` から構築した `value_type` 型のオブジェクトを挿入する。
4768
4869
4970
## 戻り値
50-
- (1)、(2) : イテレータと `bool` 値の [`pair`](/reference/utility/pair.md) を返す。
71+
- (1)、(2)、(5) : イテレータと `bool` 値の [`pair`](/reference/utility/pair.md) を返す。
5172
- 挿入された場合には、`first` に挿入された要素へのイテレータ、`second` に `true` が設定される。
5273
- 挿入されなかった場合には、`first` に `k` と等価のキーを持つ既存の要素へのイテレータ、`second` に `false` が設定される。
53-
- (3)、(4) :
74+
- (3)、(4)、(6) :
5475
- 挿入された場合には、挿入された要素へのイテレータを返す。
5576
- 挿入されなかった場合には、`k` と等価のキーを持つ既存の要素へのイテレータを返す。
5677
5778
5879
## 計算量
59-
- (1)、(2) : [`emplace`](emplace.md) と同じ。
60-
- (3)、(4) : [`emplace_hint`](emplace_hint.md) と同じ。
80+
- (1)、(2)、(5) : [`emplace`](emplace.md) と同じ。
81+
- (3)、(4)、(6) : [`emplace_hint`](emplace_hint.md) と同じ。
6182
6283
6384
## 備考
6485
- 概要に記載されているように、本メンバ関数は指定されたキーと等価の要素が既に存在する場合には、引数に副作用が発生しない。
65-
一方、[`emplace`](emplace.md)、[`emplace_hint`](emplace_hint.md)、[`insert`](insert.md) にはそのような規定は無く、挿入がされなかった場合でも引数に副作用(引数からのムーブ)が発生してしまう可能性があるため、注意が必要である。
66-
67-
- このメンバ関数の機能テストマクロは以下の通り。
68-
69-
| マクロ名 | 値 |
70-
|-----------------------------|----------|
71-
| `__cpp_lib_map_try_emplace` | `201411` |
72-
86+
- 一方、[`emplace`](emplace.md)、[`emplace_hint`](emplace_hint.md)、[`insert`](insert.md) にはそのような規定は無く、挿入がされなかった場合でも引数に副作用(引数からのムーブ)が発生してしまう可能性があるため、注意が必要である。
87+
- (5), (6) :
88+
- `is_transparent`は、標準ライブラリの[`std::less`](/reference/functional/less.md)、[`std::greater`](/reference/functional/greater.md)といった関数オブジェクトの、`void`に対する特殊化で定義される。それ以外のテンプレートパラメータで`is_transparent`が定義されないのは、互換性のためである。
89+
- これらのオーバーロードは、`map<string, int>`のようなコンテナに対し、検索操作で文字列リテラルを渡した際に、キー型の一時オブジェクトが生成されるコストを減らすためにある。
7390
7491
7592
## 例
@@ -129,3 +146,5 @@ false, 114, false
129146
- [N4006 An improved emplace() for unique-key maps](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4006.html)
130147
- [N4240 Improved insertion interface for unique-key maps (Revision 2)](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4240.html)
131148
- [N4279 Improved insertion interface for unique-key maps (Revision 2.3)](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4279.html)
149+
- [P2363R5: Extending associative containers with the remaining heterogeneous overloads](https://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2363r5.html)
150+
- C++26で`template <class K>`のバージョンが追加された

0 commit comments

Comments
 (0)