200
200
201
201
< p class ="text-right "> < small >
202
202
最終更新日時(UTC):
203
- < span itemprop ="datePublished " content ="2024-06-11T13:45:38 ">
204
- 2024年06月11日 13時45分38秒
203
+ < span itemprop ="datePublished " content ="2025-05-15T06:51:25 ">
204
+ 2025年05月15日 06時51分25秒
205
205
</ span >
206
206
< br />
207
207
< span itemprop ="author " itemscope itemtype ="http://schema.org/Person ">
226
226
227
227
< div class ="identifier-type "> function template</ div > < div class ="header "> <map></ div > < h1 itemprop ="name "> < span class ="namespace " title ="namespace std "> std::</ span > < span class ="class " title ="class map "> map::</ span > < span class ="token "> try_emplace</ span > < span class ="cpp cpp17 " title ="C++17で追加 "> (C++17)</ span > </ h1 >
228
228
< div itemprop ="articleBody "> < p > < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="k "> template</ span > < span class ="o "> <</ span > < span class ="n "> class</ span > < span class ="p "> ...</ span > < span class ="n "> Args</ span > < span class ="o "> ></ span >
229
- < span class ="n "> < a href ="../../utility/pair.html "> pair</ a > </ span > < span class ="o "> <</ span > < span class ="n "> iterator</ span > < span class ="p "> ,</ span > < span class ="kt "> bool</ span > < span class ="o "> ></ span > < span class ="n "> try_emplace</ span > < span class ="p "> (</ span > < span class ="k "> const</ span > < span class ="n "> key_type</ span > < span class ="o "> &</ span > < span class ="n "> k</ span > < span class ="p "> ,</ span > < span class ="n "> Args</ span > < span class ="o "> &&</ span > < span class ="p "> ...</ span > < span class ="n "> args</ span > < span class ="p "> );</ span > < span class ="c1 "> // (1)</ span >
229
+ < span class ="n "> < a href ="../../utility/pair.html "> pair</ a > </ span > < span class ="o "> <</ span > < span class ="n "> iterator</ span > < span class ="p "> ,</ span > < span class ="kt "> bool</ span > < span class ="o "> ></ span >
230
+ < span class ="n "> try_emplace</ span > < span class ="p "> (</ span > < span class ="k "> const</ span > < span class ="n "> key_type</ span > < span class ="o "> &</ span > < span class ="n "> k</ span > < span class ="p "> ,</ span > < span class ="n "> Args</ span > < span class ="o "> &&</ span > < span class ="p "> ...</ span > < span class ="n "> args</ span > < span class ="p "> );</ span > < span class ="c1 "> // (1) C++17</ span >
230
231
231
232
< span class ="k "> template</ span > < span class ="o "> <</ span > < span class ="n "> class</ span > < span class ="p "> ...</ span > < span class ="n "> Args</ span > < span class ="o "> ></ span >
232
- < span class ="n "> < a href ="../../utility/pair.html "> pair</ a > </ span > < span class ="o "> <</ span > < span class ="n "> iterator</ span > < span class ="p "> ,</ span > < span class ="kt "> bool</ span > < span class ="o "> ></ span > < span class ="n "> try_emplace</ span > < span class ="p "> (</ span > < span class ="n "> key_type</ span > < span class ="o "> &&</ span > < span class ="n "> k</ span > < span class ="p "> ,</ span > < span class ="n "> Args</ span > < span class ="o "> &&</ span > < span class ="p "> ...</ span > < span class ="n "> args</ span > < span class ="p "> );</ span > < span class ="c1 "> // (2)</ span >
233
+ < span class ="n "> < a href ="../../utility/pair.html "> pair</ a > </ span > < span class ="o "> <</ span > < span class ="n "> iterator</ span > < span class ="p "> ,</ span > < span class ="kt "> bool</ span > < span class ="o "> ></ span >
234
+ < span class ="n "> try_emplace</ span > < span class ="p "> (</ span > < span class ="n "> key_type</ span > < span class ="o "> &&</ span > < span class ="n "> k</ span > < span class ="p "> ,</ span > < span class ="n "> Args</ span > < span class ="o "> &&</ span > < span class ="p "> ...</ span > < span class ="n "> args</ span > < span class ="p "> );</ span > < span class ="c1 "> // (2) C++17</ span >
233
235
234
236
< span class ="k "> template</ span > < span class ="o "> <</ span > < span class ="n "> class</ span > < span class ="p "> ...</ span > < span class ="n "> Args</ span > < span class ="o "> ></ span >
235
- < span class ="n "> iterator</ span > < span class ="n "> try_emplace</ span > < span class ="p "> (</ span > < span class ="n "> const_iterator</ span > < span class ="n "> hint</ span > < span class ="p "> ,</ span > < span class ="k "> const</ span > < span class ="n "> key_type</ span > < span class ="o "> &</ span > < span class ="n "> k</ span > < span class ="p "> ,</ span > < span class ="n "> Args</ span > < span class ="o "> &&</ span > < span class ="p "> ...</ span > < span class ="n "> args</ span > < span class ="p "> );</ span > < span class ="c1 "> // (3)</ span >
237
+ < span class ="n "> iterator</ span >
238
+ < span class ="n "> try_emplace</ span > < span class ="p "> (</ span > < span class ="n "> const_iterator</ span > < span class ="n "> hint</ span > < span class ="p "> ,</ span >
239
+ < span class ="k "> const</ span > < span class ="n "> key_type</ span > < span class ="o "> &</ span > < span class ="n "> k</ span > < span class ="p "> ,</ span >
240
+ < span class ="n "> Args</ span > < span class ="o "> &&</ span > < span class ="p "> ...</ span > < span class ="n "> args</ span > < span class ="p "> );</ span > < span class ="c1 "> // (3) C++17</ span >
236
241
237
242
< span class ="k "> template</ span > < span class ="o "> <</ span > < span class ="n "> class</ span > < span class ="p "> ...</ span > < span class ="n "> Args</ span > < span class ="o "> ></ span >
238
- < span class ="n "> iterator</ span > < span class ="n "> try_emplace</ span > < span class ="p "> (</ span > < span class ="n "> const_iterator</ span > < span class ="n "> hint</ span > < span class ="p "> ,</ span > < span class ="n "> key_type</ span > < span class ="o "> &&</ span > < span class ="n "> k</ span > < span class ="p "> ,</ span > < span class ="n "> Args</ span > < span class ="o "> &&</ span > < span class ="p "> ...</ span > < span class ="n "> args</ span > < span class ="p "> );</ span > < span class ="c1 "> // (4)</ span >
243
+ < span class ="n "> iterator</ span >
244
+ < span class ="n "> try_emplace</ span > < span class ="p "> (</ span > < span class ="n "> const_iterator</ span > < span class ="n "> hint</ span > < span class ="p "> ,</ span >
245
+ < span class ="n "> key_type</ span > < span class ="o "> &&</ span > < span class ="n "> k</ span > < span class ="p "> ,</ span >
246
+ < span class ="n "> Args</ span > < span class ="o "> &&</ span > < span class ="p "> ...</ span > < span class ="n "> args</ span > < span class ="p "> );</ span > < span class ="c1 "> // (4) C++17</ span >
247
+
248
+ < span class ="k "> template</ span > < span class ="o "> <</ span > < span class ="k "> class</ span > < span class ="nc "> K</ span > < span class ="p "> ,</ span > < span class ="n "> class</ span > < span class ="p "> ...</ span > < span class ="n "> Args</ span > < span class ="o "> ></ span >
249
+ < span class ="n "> < a href ="../../utility/pair.html "> pair</ a > </ span > < span class ="o "> <</ span > < span class ="n "> iterator</ span > < span class ="p "> ,</ span > < span class ="kt "> bool</ span > < span class ="o "> ></ span >
250
+ < span class ="n "> try_emplace</ span > < span class ="p "> (</ span > < span class ="n "> K</ span > < span class ="o "> &&</ span > < span class ="n "> k</ span > < span class ="p "> ,</ span > < span class ="n "> Args</ span > < span class ="o "> &&</ span > < span class ="p "> ...</ span > < span class ="n "> args</ span > < span class ="p "> );</ span > < span class ="c1 "> // (5) C++26</ span >
251
+
252
+ < span class ="k "> template</ span > < span class ="o "> <</ span > < span class ="k "> class</ span > < span class ="nc "> K</ span > < span class ="p "> ,</ span > < span class ="n "> class</ span > < span class ="p "> ...</ span > < span class ="n "> Args</ span > < span class ="o "> ></ span >
253
+ < span class ="n "> iterator</ span >
254
+ < span class ="n "> try_emplace</ span > < span class ="p "> (</ span > < span class ="n "> const_iterator</ span > < span class ="n "> hint</ span > < span class ="p "> ,</ span >
255
+ < span class ="n "> K</ span > < span class ="o "> &&</ span > < span class ="n "> k</ span > < span class ="p "> ,</ span >
256
+ < span class ="n "> Args</ span > < span class ="o "> &&</ span > < span class ="p "> ...</ span > < span class ="n "> args</ span > < span class ="p "> );</ span > < span class ="c1 "> // (6) C++26</ span >
239
257
</ code > </ pre > </ div >
240
258
</ p >
241
259
< h2 > 概要</ h2 >
@@ -248,58 +266,49 @@ <h2>概要</h2>
248
266
< li > (2) : 指定された一時オブジェクトのキーが存在しない場合に、要素を直接構築で挿入する</ li >
249
267
< li > (3) : キーを検索するヒントを指定し、指定されたキーが存在しない場合に、要素を直接構築で挿入する</ li >
250
268
< li > (4) : キーを検索するヒントを指定し、指定された一時オブジェクトのキーが存在しない場合に、要素を直接構築で挿入する</ li >
269
+ < li > (5) : < code > key_type</ code > 型と比較可能なキーが存在しない場合に、要素を直接構築で挿入する</ li >
270
+ < li > (6) : キーを検索するヒントを指定し、指定された< code > key_type</ code > 型と比較可能なキーが存在しない場合に、要素を直接構築で挿入する</ li >
251
271
</ ul >
252
272
< h2 > < a class ="cpprefjp-defined-word " data-desc ="関数等の意味論を構成する要素の1つ。Constraints。関数であればオーバーロード解決に参加するための条件、それ以外であれば受け付ける型の条件 "> テンプレートパラメータ制約</ a > </ h2 >
253
273
< ul >
254
- < li > (1)、(3) : < code > value_type</ code > は、< code > < a href ="../../utility/piecewise_construct_t.html "> piecewise_construct</ a > </ code > , < code > < a href ="../../tuple/forward_as_tuple.html "> forward_as_tuple</ a > (k)</ code > , < code > < a href ="../../tuple/forward_as_tuple.html "> forward_as_tuple</ a > (< a href ="../../utility/forward.html "> forward</ a > <Args>(args)...)</ code > から < code > map</ code > に直接構築可能であること</ li >
255
- < li > (2)、(4) : < code > value_type</ code > は、< code > < a href ="../../utility/piecewise_construct_t.html "> piecewise_construct</ a > </ code > , < code > < a href ="../../tuple/forward_as_tuple.html "> forward_as_tuple</ a > (< a href ="../../utility/move.html "> move</ a > (k))</ code > , < code > < a href ="../../tuple/forward_as_tuple.html "> forward_as_tuple</ a > (< a href ="../../utility/forward.html "> forward</ a > <Args>(args)...)</ code > から < code > map</ code > に直接構築可能であること</ li >
274
+ < li > (1)、(3)、(5) : < code > value_type</ code > は、< code > < a href ="../../utility/piecewise_construct_t.html "> piecewise_construct</ a > </ code > , < code > < a href ="../../tuple/forward_as_tuple.html "> forward_as_tuple</ a > (k)</ code > , < code > < a href ="../../tuple/forward_as_tuple.html "> forward_as_tuple</ a > (< a href ="../../utility/forward.html "> forward</ a > <Args>(args)...)</ code > から < code > map</ code > に直接構築可能であること</ li >
275
+ < li > (2)、(4)、(6) : < code > value_type</ code > は、< code > < a href ="../../utility/piecewise_construct_t.html "> piecewise_construct</ a > </ code > , < code > < a href ="../../tuple/forward_as_tuple.html "> forward_as_tuple</ a > (< a href ="../../utility/move.html "> move</ a > (k))</ code > , < code > < a href ="../../tuple/forward_as_tuple.html "> forward_as_tuple</ a > (< a href ="../../utility/forward.html "> forward</ a > <Args>(args)...)</ code > から < code > map</ code > に直接構築可能であること</ li >
276
+ < li > (5), (6) : < code > key_compare::is_transparent</ code > が妥当な式であること</ li >
256
277
</ ul >
257
278
< p > なお、規格に記載はないが、< code > hint</ code > は < code > < a href ="emplace_hint.html "> emplace_hint</ a > </ code > と同様、コンテナの有効な読み取り専用イテレータである必要があるものと思われる。</ p >
258
279
< h2 > 効果</ h2 >
259
280
< ul >
260
- < li > (1)、(3) : < code > map</ code > が < code > k</ code > と同値のキーを持つ要素を持っている場合、何もしない(引数への副作用もない)。そうでなければ、< code > < a href ="../../utility/piecewise_construct_t.html "> piecewise_construct</ a > </ code > , < code > < a href ="../../tuple/forward_as_tuple.html "> forward_as_tuple</ a > (k)</ code > , < code > < a href ="../../tuple/forward_as_tuple.html "> forward_as_tuple</ a > (< a href ="../../utility/forward.html "> forward</ a > <Args>(args)...)</ code > から構築した < code > value_type</ code > 型のオブジェクトを挿入する。</ li >
261
- < li > (2)、(4) : < code > map</ code > が < code > k</ code > と同値のキーを持つ要素を持っている場合、何もしない(引数への副作用もない)。そうでなければ、< code > < a href ="../../utility/piecewise_construct_t.html "> piecewise_construct</ a > </ code > , < code > < a href ="../../tuple/forward_as_tuple.html "> forward_as_tuple</ a > (< a href ="../../utility/move.html "> move</ a > (k))</ code > , < code > < a href ="../../tuple/forward_as_tuple.html "> forward_as_tuple</ a > (< a href ="../../utility/forward.html "> forward</ a > <Args>(args)...)</ code > から構築した < code > value_type</ code > 型のオブジェクトを挿入する。</ li >
281
+ < li > (1)、(3)、(5) : < code > map</ code > が < code > k</ code > と同値のキーを持つ要素を持っている場合、何もしない(引数への副作用もない)。そうでなければ、< code > < a href ="../../utility/piecewise_construct_t.html "> piecewise_construct</ a > </ code > , < code > < a href ="../../tuple/forward_as_tuple.html "> forward_as_tuple</ a > (k)</ code > , < code > < a href ="../../tuple/forward_as_tuple.html "> forward_as_tuple</ a > (< a href ="../../utility/forward.html "> forward</ a > <Args>(args)...)</ code > から構築した < code > value_type</ code > 型のオブジェクトを挿入する。</ li >
282
+ < li > (2)、(4)、(6) : < code > map</ code > が < code > k</ code > と同値のキーを持つ要素を持っている場合、何もしない(引数への副作用もない)。そうでなければ、< code > < a href ="../../utility/piecewise_construct_t.html "> piecewise_construct</ a > </ code > , < code > < a href ="../../tuple/forward_as_tuple.html "> forward_as_tuple</ a > (< a href ="../../utility/move.html "> move</ a > (k))</ code > , < code > < a href ="../../tuple/forward_as_tuple.html "> forward_as_tuple</ a > (< a href ="../../utility/forward.html "> forward</ a > <Args>(args)...)</ code > から構築した < code > value_type</ code > 型のオブジェクトを挿入する。</ li >
262
283
</ ul >
263
284
< h2 > < a class ="cpprefjp-defined-word " data-desc ="関数呼び出し式の評価結果となるオブジェクト・値 "> 戻り値</ a > </ h2 >
264
285
< ul >
265
- < li > (1)、(2) : イテレータと < code > bool</ code > 値の < code > < a href ="../../utility/pair.html "> pair</ a > </ code > を返す。< ul >
286
+ < li > (1)、(2)、(5) : イテレータと < code > bool</ code > 値の < code > < a href ="../../utility/pair.html "> pair</ a > </ code > を返す。< ul >
266
287
< li > 挿入された場合には、< code > first</ code > に挿入された要素へのイテレータ、< code > second</ code > に < code > true</ code > が設定される。</ li >
267
288
< li > 挿入されなかった場合には、< code > first</ code > に < code > k</ code > と等価のキーを持つ既存の要素へのイテレータ、< code > second</ code > に < code > false</ code > が設定される。</ li >
268
289
</ ul >
269
290
</ li >
270
- < li > (3)、(4) :< ul >
291
+ < li > (3)、(4)、(6) :< ul >
271
292
< li > 挿入された場合には、挿入された要素へのイテレータを返す。</ li >
272
293
< li > 挿入されなかった場合には、< code > k</ code > と等価のキーを持つ既存の要素へのイテレータを返す。</ li >
273
294
</ ul >
274
295
</ li >
275
296
</ ul >
276
297
< h2 > < a class ="cpprefjp-defined-word " data-desc ="関数等の意味論を構成する要素の1つ。Complexity。関数が使うアルゴリズムの空間計算量・時間計算量 "> 計算量</ a > </ h2 >
277
298
< ul >
278
- < li > (1)、(2) : < code > < a href ="emplace.html "> emplace</ a > </ code > と同じ。</ li >
279
- < li > (3)、(4) : < code > < a href ="emplace_hint.html "> emplace_hint</ a > </ code > と同じ。</ li >
299
+ < li > (1)、(2)、(5) : < code > < a href ="emplace.html "> emplace</ a > </ code > と同じ。</ li >
300
+ < li > (3)、(4)、(6) : < code > < a href ="emplace_hint.html "> emplace_hint</ a > </ code > と同じ。</ li >
280
301
</ ul >
281
302
< h2 > 備考</ h2 >
282
303
< ul >
283
- < li >
284
- < p > 概要に記載されているように、本メンバ関数は指定されたキーと等価の要素が既に存在する場合には、引数に副作用が発生しない。 < br / >
285
- 一方、 < code > < a href =" emplace.html " > emplace </ a > </ code > 、 < code > < a href =" emplace_hint.html " > emplace_hint </ a > </ code > 、 < code > < a href =" insert.html " > insert </ a > </ code > にはそのような規定は無く、挿入がされなかった場合でも引数に副作用(引数からのムーブ)が発生してしまう可能性があるため、注意が必要である。 </ p >
304
+ < li > 概要に記載されているように、本メンバ関数は指定されたキーと等価の要素が既に存在する場合には、引数に副作用が発生しない。 < ul >
305
+ < li > 一方、 < code > < a href =" emplace.html " > emplace </ a > </ code > 、 < code > < a href =" emplace_hint.html " > emplace_hint </ a > </ code > 、 < code > < a href =" insert.html " > insert </ a > </ code > にはそのような規定は無く、挿入がされなかった場合でも引数に副作用(引数からのムーブ)が発生してしまう可能性があるため、注意が必要である。 </ li >
306
+ </ ul >
286
307
</ li >
287
- < li >
288
- < p > このメンバ関数の機能テストマクロは以下の通り。 </ p >
289
- < table border ="1 " bordercolor ="#888 " style ="border-collapse:collapse ">
290
- < thead >
291
- < tr >
292
- < th > マクロ名</ th >
293
- < th > 値</ th >
294
- </ tr >
295
- </ thead >
296
- < tbody >
297
- < tr >
298
- < td > < code > __cpp_lib_map_try_emplace</ code > </ td >
299
- < td > < code > 201411</ code > </ td >
300
- </ tr >
301
- </ tbody >
302
- </ table >
308
+ < li > (5), (6) :< ul >
309
+ < li > < code > is_transparent</ code > は、標準ライブラリの< code > < a href ="../../functional/less.html "> std::less</ a > </ code > 、< code > < a href ="../../functional/greater.html "> std::greater</ a > </ code > といった関数オブジェクトの、< code > void</ code > に対する特殊化で定義される。それ以外のテンプレートパラメータで< code > is_transparent</ code > が定義されないのは、互換性のためである。</ li >
310
+ < li > これらの< a class ="cpprefjp-defined-word " data-desc ="同名の関数を異なる引数・テンプレート・制約などで複数定義すること。または同名の関数の集合 "> オーバーロード</ a > は、< code > map<string, int></ code > のようなコンテナに対し、検索操作で文字列リテラルを渡した際に、キー型の一時オブジェクトが生成されるコストを減らすためにある。</ li >
311
+ </ ul >
303
312
</ li >
304
313
</ ul >
305
314
< h2 > 例</ h2 >
@@ -371,6 +380,10 @@ <h2>参照</h2>
371
380
< li > < a href ="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4006.html " target ="_blank "> N4006 An improved emplace() for unique-key maps</ a > </ li >
372
381
< li > < a href ="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4240.html " target ="_blank "> N4240 Improved insertion interface for unique-key maps (Revision 2)</ a > </ li >
373
382
< li > < a href ="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4279.html " target ="_blank "> N4279 Improved insertion interface for unique-key maps (Revision 2.3)</ a > </ li >
383
+ < li > < a href ="https://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2363r5.html " target ="_blank "> P2363R5: Extending associative containers with the remaining heterogeneous overloads</ a > < ul >
384
+ < li > C++26で< code > template <class K></ code > のバージョンが追加された</ li >
385
+ </ ul >
386
+ </ li >
374
387
</ ul > </ div >
375
388
376
389
</ div >
0 commit comments