|
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-22T05:47:43"> |
| 204 | + 2025年05月22日 05時47分43秒 |
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"><unordered_map></div><h1 itemprop="name"><span class="namespace" title="namespace std">std::</span><span class="class" title="class unordered_map">unordered_map::</span><span class="token">insert_or_assign</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="k">class</span> <span class="nc">M</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">insert_or_assign</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">M</span><span class="o">&&</span> <span class="n">obj</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">insert_or_assign</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> |
| 231 | + <span class="n">M</span><span class="o">&&</span> <span class="n">obj</span><span class="p">);</span> <span class="c1">// (1) C++17</span> |
230 | 232 |
|
231 | 233 | <span class="k">template</span> <span class="o"><</span><span class="k">class</span> <span class="nc">M</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">insert_or_assign</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">M</span><span class="o">&&</span> <span class="n">obj</span><span class="p">);</span> <span class="c1">// (2)</span> |
| 234 | +<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> |
| 235 | + <span class="n">insert_or_assign</span><span class="p">(</span><span class="n">key_type</span><span class="o">&&</span> <span class="n">k</span><span class="p">,</span> |
| 236 | + <span class="n">M</span><span class="o">&&</span> <span class="n">obj</span><span class="p">);</span> <span class="c1">// (2) C++17</span> |
| 237 | + |
| 238 | +<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="k">class</span> <span class="nc">M</span><span class="o">></span> |
| 239 | +<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> |
| 240 | + <span class="n">insert_or_assign</span><span class="p">(</span><span class="n">K</span><span class="o">&&</span> <span class="n">k</span><span class="p">,</span> |
| 241 | + <span class="n">M</span><span class="o">&&</span> <span class="n">obj</span><span class="p">);</span> <span class="c1">// (3) C++26</span> |
233 | 242 |
|
234 | 243 | <span class="k">template</span> <span class="o"><</span><span class="k">class</span> <span class="nc">M</span><span class="o">></span>
|
235 |
| -<span class="n">iterator</span> <span class="n">insert_or_assign</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">M</span><span class="o">&&</span> <span class="n">obj</span><span class="p">);</span> <span class="c1">// (3)</span> |
| 244 | +<span class="n">iterator</span> |
| 245 | + <span class="n">insert_or_assign</span><span class="p">(</span><span class="n">const_iterator</span> <span class="n">hint</span><span class="p">,</span> |
| 246 | + <span class="k">const</span> <span class="n">key_type</span><span class="o">&</span> <span class="n">k</span><span class="p">,</span> |
| 247 | + <span class="n">M</span><span class="o">&&</span> <span class="n">obj</span><span class="p">);</span> <span class="c1">// (4) C++17</span> |
236 | 248 |
|
237 | 249 | <span class="k">template</span> <span class="o"><</span><span class="k">class</span> <span class="nc">M</span><span class="o">></span>
|
238 |
| -<span class="n">iterator</span> <span class="n">insert_or_assign</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">M</span><span class="o">&&</span> <span class="n">obj</span><span class="p">);</span> <span class="c1">// (4)</span> |
| 250 | +<span class="n">iterator</span> |
| 251 | + <span class="n">insert_or_assign</span><span class="p">(</span><span class="n">const_iterator</span> <span class="n">hint</span><span class="p">,</span> |
| 252 | + <span class="n">key_type</span><span class="o">&&</span> <span class="n">k</span><span class="p">,</span> |
| 253 | + <span class="n">M</span><span class="o">&&</span> <span class="n">obj</span><span class="p">);</span> <span class="c1">// (5) C++17</span> |
| 254 | + |
| 255 | +<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="k">class</span> <span class="nc">M</span><span class="o">></span> |
| 256 | +<span class="n">iterator</span> |
| 257 | + <span class="n">insert_or_assign</span><span class="p">(</span><span class="n">const_iterator</span> <span class="n">hint</span><span class="p">,</span> |
| 258 | + <span class="n">K</span><span class="o">&&</span> <span class="n">k</span><span class="p">,</span> |
| 259 | + <span class="n">M</span><span class="o">&&</span> <span class="n">obj</span><span class="p">);</span> <span class="c1">// (6) C++26</span> |
239 | 260 | </code></pre></div>
|
240 | 261 | </p>
|
241 | 262 | <h2>概要</h2>
|
242 | 263 | <p>引数 <code>k</code> で指定されたキーが存在しなければ対応する値を引数 <code>obj</code> のキーとして要素を挿入し(<code>insert</code>)、さもなければ(<code>or</code>)、そのキーに対応する値に引数 <code>obj</code> を代入する(<code>assign</code>)。</p>
|
243 | 264 | <p>引数 <code>hint</code> は、<code>k</code> を検索する際のヒントに使用される。(が、実際に使用されることはないものと思われる。<code><a href="emplace_hint.html">emplace_hint</a></code> の備考を参照)</p>
|
| 265 | +<ul> |
| 266 | +<li>(1) : <code>key_type</code>型のキーをとって挿入もしくは代入する</li> |
| 267 | +<li>(2) : <code>key_type</code>型の一時オブジェクトのキーをとって挿入もしくは代入する</li> |
| 268 | +<li>(3) : <code>key_type</code>と比較可能な<code>K</code>型のキーをとって挿入もしくは代入する</li> |
| 269 | +<li>(4) : 挿入位置のヒントをともない、<code>key_type</code>型のキーをとって挿入もしくは代入する</li> |
| 270 | +<li>(5) : 挿入位置のヒントをともない、<code>key_type</code>型の一時オブジェクトのキーをとって挿入もしくは代入する</li> |
| 271 | +<li>(6) : 挿入位置のヒントをともない、<code>key_type</code>と比較可能な<code>K</code>型のキーをとって挿入もしくは代入する</li> |
| 272 | +</ul> |
244 | 273 | <h2><a class="cpprefjp-defined-word" data-desc="関数等の意味論を構成する要素の1つ。Constraints。関数であればオーバーロード解決に参加するための条件、それ以外であれば受け付ける型の条件">テンプレートパラメータ制約</a></h2>
|
245 | 274 | <ul>
|
246 |
| -<li>(1)、(3) : <code><a href="../../type_traits/is_assignable.html">is_assignable_v</a><mapped_type&, M&&></code> が <code>true</code> であること。<code>value_type</code> は、<code>k</code>, <code><a href="../../utility/forward.html">forward</a><M>(obj)</code> から <code>map</code> に直接構築可能であること</li> |
247 |
| -<li>(2)、(4) : <code><a href="../../type_traits/is_assignable.html">is_assignable_v</a><mapped_type&, M&&></code> が <code>true</code> であること。<code>value_type</code> は、<code><a href="../../utility/move.html">move</a>(k)</code>, <code><a href="../../utility/forward.html">forward</a><M>(obj)</code> から <code>map</code> に直接構築可能であること</li> |
| 275 | +<li>(3), (6) : <code>key_compare::is_transparent</code> が妥当な式であること</li> |
| 276 | +</ul> |
| 277 | +<h2><a class="cpprefjp-defined-word" data-desc="関数等の意味論を構成する要素の1つ。Mandates。満たさなければプログラムが不適格となる要件。この要件は、オーバーロード解決によって選択された関数内での`static_assert`の定数条件式や、関数に対するdelete宣言などで表現できる">適格要件</a></h2> |
| 278 | +<ul> |
| 279 | +<li>(1)、(3)、(4)、(6) : <code><a href="../../type_traits/is_assignable.html">is_assignable_v</a><mapped_type&, M&&></code> が <code>true</code> であること。<code>value_type</code> は、<code>k</code>, <code><a href="../../utility/forward.html">forward</a><M>(obj)</code> から <code>map</code> に直接構築可能であること</li> |
| 280 | +<li>(2)、(5) : <code><a href="../../type_traits/is_assignable.html">is_assignable_v</a><mapped_type&, M&&></code> が <code>true</code> であること。<code>value_type</code> は、<code><a href="../../utility/move.html">move</a>(k)</code>, <code><a href="../../utility/forward.html">forward</a><M>(obj)</code> から <code>map</code> に直接構築可能であること</li> |
248 | 281 | </ul>
|
249 | 282 | <h2>効果</h2>
|
250 | 283 | <ul>
|
251 |
| -<li>(1)、(3) : <code>unordered_map</code> が <code>k</code> と同値のキーを持つ要素 <code>e</code> を持っている場合、<code>e.second</code> に <code><a href="../../utility/forward.html">forward</a><M>(obj)</code> を代入する。そうでなければ、<code>k</code>, <code><a href="../../utility/forward.html">forward</a><M>(obj)</code> から構築した <code>value_type</code> 型のオブジェクトを挿入する。</li> |
252 |
| -<li>(2)、(4) : <code>unordered_map</code> が <code>k</code> と同値のキーを持つ要素 <code>e</code> を持っている場合、<code>e.second</code> に <code><a href="../../utility/forward.html">forward</a><M>(obj)</code> を代入する。そうでなければ、<code><a href="../../utility/move.html">move</a>(k)</code>, <code><a href="../../utility/forward.html">forward</a><M>(obj)</code> から構築した <code>value_type</code> 型のオブジェクトを挿入する。</li> |
| 284 | +<li>(1)、(3)、(4)、(6) : <code>unordered_map</code> が <code>k</code> と同値のキーを持つ要素 <code>e</code> を持っている場合、<code>e.second</code> に <code><a href="../../utility/forward.html">forward</a><M>(obj)</code> を代入する。そうでなければ、<code>k</code>, <code><a href="../../utility/forward.html">forward</a><M>(obj)</code> から構築した <code>value_type</code> 型のオブジェクトを挿入する。</li> |
| 285 | +<li>(2)、(5) : <code>unordered_map</code> が <code>k</code> と同値のキーを持つ要素 <code>e</code> を持っている場合、<code>e.second</code> に <code><a href="../../utility/forward.html">forward</a><M>(obj)</code> を代入する。そうでなければ、<code><a href="../../utility/move.html">move</a>(k)</code>, <code><a href="../../utility/forward.html">forward</a><M>(obj)</code> から構築した <code>value_type</code> 型のオブジェクトを挿入する。</li> |
253 | 286 | </ul>
|
254 | 287 | <h2><a class="cpprefjp-defined-word" data-desc="関数呼び出し式の評価結果となるオブジェクト・値">戻り値</a></h2>
|
255 | 288 | <ul>
|
256 |
| -<li>(1)、(2) : イテレータと <code>bool</code> 値の <code><a href="../../utility/pair.html">pair</a></code> を返す。<ul> |
| 289 | +<li>(1)、(2)、(3) : イテレータと <code>bool</code> 値の <code><a href="../../utility/pair.html">pair</a></code> を返す。<ul> |
257 | 290 | <li>挿入された場合には、<code>first</code> に挿入された要素へのイテレータ、<code>second</code> に <code>true</code> が設定される。</li>
|
258 | 291 | <li>代入された場合には、<code>first</code> に代入された要素へのイテレータ、<code>second</code> に <code>false</code> が設定される。</li>
|
259 | 292 | </ul>
|
260 | 293 | </li>
|
261 |
| -<li>(3)、(4) :<ul> |
| 294 | +<li>(4)、(5)、(6) :<ul> |
262 | 295 | <li>挿入された場合には、挿入された要素へのイテレータを返す。</li>
|
263 | 296 | <li>代入された場合には、代入された要素へのイテレータを返す。</li>
|
264 | 297 | </ul>
|
265 | 298 | </li>
|
266 | 299 | </ul>
|
267 | 300 | <h2><a class="cpprefjp-defined-word" data-desc="関数等の意味論を構成する要素の1つ。Complexity。関数が使うアルゴリズムの空間計算量・時間計算量">計算量</a></h2>
|
268 | 301 | <ul>
|
269 |
| -<li>(1)、(2) : <code><a href="emplace.html">emplace</a></code> と同じ。</li> |
270 |
| -<li>(3)、(4) : <code><a href="emplace_hint.html">emplace_hint</a></code> と同じ。</li> |
| 302 | +<li>(1)、(2)、(3) : <code><a href="emplace.html">emplace</a></code> と同じ。</li> |
| 303 | +<li>(4)、(5)、(6) : <code><a href="emplace_hint.html">emplace_hint</a></code> と同じ。</li> |
271 | 304 | </ul>
|
272 | 305 | <h2>備考</h2>
|
273 | 306 | <ul>
|
274 |
| -<li> |
275 |
| -<p>規格にはこの関数の<a class="cpprefjp-defined-word" data-desc="問題が発生したときに、現在実行位置を過去に通過・記録した位置に戻し、文脈情報を添えて紐づけられた処理(例外ハンドラー)を呼び出す仕組み。またはその事態">例外</a>安全性についての記載が無いが、<code><a href="emplace.html">emplace</a></code> や <code><a href="emplace_hint.html">emplace_hint</a></code> と等価と考えて問題ないと思われる。</p> |
276 |
| -</li> |
277 |
| -<li> |
278 |
| -<p>規格にはこの関数が呼ばれた後のイテレータや要素へのポインタ・参照の有効性についての記載が無いが、<code><a href="emplace.html">emplace</a></code> や <code><a href="emplace_hint.html">emplace_hint</a></code> と等価と考えて問題ないと思われる。</p> |
279 |
| -</li> |
280 |
| -<li> |
281 |
| -<p>このメンバ関数の<code><a href="../../../lang/cpp17/feature_test_macros.html">機能テストマクロ</a></code>は以下の通り。</p> |
282 |
| -<table border="1" bordercolor="#888" style="border-collapse:collapse"> |
283 |
| -<thead> |
284 |
| -<tr> |
285 |
| -<th>マクロ名</th> |
286 |
| -<th>値</th> |
287 |
| -</tr> |
288 |
| -</thead> |
289 |
| -<tbody> |
290 |
| -<tr> |
291 |
| -<td><code>__cpp_lib_unordered_map_try_emplace</code></td> |
292 |
| -<td><code>201411</code></td> |
293 |
| -</tr> |
294 |
| -</tbody> |
295 |
| -</table> |
| 307 | +<li>規格にはこの関数の<a class="cpprefjp-defined-word" data-desc="問題が発生したときに、現在実行位置を過去に通過・記録した位置に戻し、文脈情報を添えて紐づけられた処理(例外ハンドラー)を呼び出す仕組み。またはその事態">例外</a>安全性についての記載が無いが、<code><a href="emplace.html">emplace</a></code> や <code><a href="emplace_hint.html">emplace_hint</a></code> と等価と考えて問題ないと思われる。</li> |
| 308 | +<li>規格にはこの関数が呼ばれた後のイテレータや要素へのポインタ・参照の有効性についての記載が無いが、<code><a href="emplace.html">emplace</a></code> や <code><a href="emplace_hint.html">emplace_hint</a></code> と等価と考えて問題ないと思われる。</li> |
| 309 | +<li>(3), (6) :<ul> |
| 310 | +<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> |
| 311 | +<li>これらの<a class="cpprefjp-defined-word" data-desc="同名の関数を異なる引数・テンプレート・制約などで複数定義すること。または同名の関数の集合">オーバーロード</a>は、<code>map<string, int></code>のようなコンテナに対し、検索操作で文字列リテラルを渡した際に、キー型の一時オブジェクトが生成されるコストを減らすためにある。</li> |
| 312 | +</ul> |
296 | 313 | </li>
|
297 | 314 | </ul>
|
298 | 315 | <h2>例</h2>
|
@@ -405,6 +422,10 @@ <h2>参照</h2>
|
405 | 422 | <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>
|
406 | 423 | <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>
|
407 | 424 | <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>
|
| 425 | +<li><a href="http://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2363r5.html" target="_blank">P2363R5 Extending associative containers with the remaining heterogeneous overloads</a><ul> |
| 426 | +<li>C++26で<code>template <class K></code>のバージョンが追加された</li> |
| 427 | +</ul> |
| 428 | +</li> |
408 | 429 | </ul></div>
|
409 | 430 |
|
410 | 431 | </div>
|
|
0 commit comments