200200
201201 < p class ="text-right "> < small >
202202 最終更新日時(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秒
205205 </ span >
206206 < br />
207207 < span itemprop ="author " itemscope itemtype ="http://schema.org/Person ">
226226
227227 < 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 >
228228< 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 >
230231
231232< 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 >
233235
234236< 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 >
236241
237242< 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 >
239257</ code > </ pre > </ div >
240258</ p >
241259< h2 > 概要</ h2 >
@@ -248,58 +266,49 @@ <h2>概要</h2>
248266< li > (2) : 指定された一時オブジェクトのキーが存在しない場合に、要素を直接構築で挿入する</ li >
249267< li > (3) : キーを検索するヒントを指定し、指定されたキーが存在しない場合に、要素を直接構築で挿入する</ li >
250268< li > (4) : キーを検索するヒントを指定し、指定された一時オブジェクトのキーが存在しない場合に、要素を直接構築で挿入する</ li >
269+ < li > (5) : < code > key_type</ code > 型と比較可能なキーが存在しない場合に、要素を直接構築で挿入する</ li >
270+ < li > (6) : キーを検索するヒントを指定し、指定された< code > key_type</ code > 型と比較可能なキーが存在しない場合に、要素を直接構築で挿入する</ li >
251271</ ul >
252272< h2 > < a class ="cpprefjp-defined-word " data-desc ="関数等の意味論を構成する要素の1つ。Constraints。関数であればオーバーロード解決に参加するための条件、それ以外であれば受け付ける型の条件 "> テンプレートパラメータ制約</ a > </ h2 >
253273< 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 >
256277</ ul >
257278< p > なお、規格に記載はないが、< code > hint</ code > は < code > < a href ="emplace_hint.html "> emplace_hint</ a > </ code > と同様、コンテナの有効な読み取り専用イテレータである必要があるものと思われる。</ p >
258279< h2 > 効果</ h2 >
259280< 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 >
262283</ ul >
263284< h2 > < a class ="cpprefjp-defined-word " data-desc ="関数呼び出し式の評価結果となるオブジェクト・値 "> 戻り値</ a > </ h2 >
264285< 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 >
266287< li > 挿入された場合には、< code > first</ code > に挿入された要素へのイテレータ、< code > second</ code > に < code > true</ code > が設定される。</ li >
267288< li > 挿入されなかった場合には、< code > first</ code > に < code > k</ code > と等価のキーを持つ既存の要素へのイテレータ、< code > second</ code > に < code > false</ code > が設定される。</ li >
268289</ ul >
269290</ li >
270- < li > (3)、(4) :< ul >
291+ < li > (3)、(4)、(6) :< ul >
271292< li > 挿入された場合には、挿入された要素へのイテレータを返す。</ li >
272293< li > 挿入されなかった場合には、< code > k</ code > と等価のキーを持つ既存の要素へのイテレータを返す。</ li >
273294</ ul >
274295</ li >
275296</ ul >
276297< h2 > < a class ="cpprefjp-defined-word " data-desc ="関数等の意味論を構成する要素の1つ。Complexity。関数が使うアルゴリズムの空間計算量・時間計算量 "> 計算量</ a > </ h2 >
277298< 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 >
280301</ ul >
281302< h2 > 備考</ h2 >
282303< 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 >
286307</ 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 >
303312</ li >
304313</ ul >
305314< h2 > 例</ h2 >
@@ -371,6 +380,10 @@ <h2>参照</h2>
371380< 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 >
372381< 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 >
373382< 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 >
374387</ ul > </ div >
375388
376389 </ div >
0 commit comments