名前空間
変種
操作

std::unordered_map<Key,T,Hash,KeyEqual,Allocator>::operator[]

提供: cppreference.com
 
 
 
 
T& operator[](const Key& key );
(1) (C++11以上)
T& operator[]( Key&& key );
(2) (C++11以上)

key と等しいキーにマップされる値を指す参照を返します。 そのようなキーが存在しない場合は挿入を行います。


1) キーが存在しない場合、 std::piecewise_construct, std::forward_as_tuple(key), std::tuple<>() からその場で構築された value_type オブジェクトが挿入されます。 この関数は return this->try_emplace(key).first->second; と同等です。(C++17以上)
デフォルトのアロケータが使用される場合、これはキーが key からコピー構築され、マップされる値が値初期化される結果となります。
-
value_typestd::piecewise_construct, std::forward_as_tuple(key), std::tuple<>() から EmplaceConstructible でなければなりません。 デフォルトのアロケータが使用される場合、これは key_typeCopyConstructible でなければならず、 mapped_typeDefaultConstructible でなければならないことを意味します。
2) キーが存在しない場合、 std::piecewise_construct, std::forward_as_tuple(std::move(key)), std::tuple<>() からその場で構築された value_type オブジェクトが挿入されます。 この関数は return this->try_emplace(std::move(key)).first->second;(C++17以上) と同等です。
デフォルトのアロケータが使用される場合、これはキーが key からムーブ構築され、マップされた値が値初期化される結果となります。
-
value_typestd::piecewise_construct, std::forward_as_tuple(std::move(key)), std::tuple<>() から EmplaceConstructible でなければなりません。 デフォルトのアロケータが使用される場合、これは key_typeMoveConstructible でなければならず、 mapped_typeDefaultConstructible でなければならないことを意味します。

挿入が行われ、それによってコンテナの再ハッシュが発生した場合、すべてのイテレータが無効化されます。 そうでなければ、イテレータは影響を受けません。 参照は無効化されません。 再ハッシュは新しい要素数が max_load_factor()*bucket_count() より大きい場合にのみ発生します。

目次

[編集]引数

key - 探す要素のキー

[編集]戻り値

キー key を持つ要素が存在しなければ、新しい要素のマップされた値を指す参照。 そうでなければ、 key と等しいキーを持つ既存の要素のマップされた値を指す参照。

[編集]例外

何らかの操作によって例外が投げられた場合、挿入は効果を持ちません。

[編集]計算量

平均的なケース: 一定、ワーストケース: サイズに比例。

[編集]ノート

発行された C++11 および C++14 標準では、この関数は mapped_typeDefaultInsertable であり、 key_type*thisCopyInsertable または MoveInsertable であることが要求されると規定されていました。 この仕様は欠陥であり、 LWG issue 2469 で修正され、上の説明にはこの issue の解決が反映されています。

しかし、実装のひとつ (libc++) は、 value_type オブジェクトを emplace するのではなく、議論の余地はあるものの、発行された標準によって要求される通りに、 key_type および mapped_type オブジェクトを2つの別々のアロケータの construct() 呼び出しによって構築することが知られています。

operator[] は、キーが存在しない場合にそれを挿入するため、非 const です。 この動作を望まない場合やコンテナが const の場合は、 at() を使用することができます。

insert_or_assign()operator[] より多くの情報を返し、マップされた型のデフォルト構築可能性を要求しません。

(C++17以上)

[編集]

#include <iostream>#include <string>#include <vector>#include <unordered_map>   int main(){std::unordered_map<char, int> letter_counts {{'a', 27}, {'b', 3}, {'c', 1}};   std::cout<<"initially:\n";for(constauto&pair : letter_counts){std::cout<< pair.first<<": "<< pair.second<<'\n';}   letter_counts['b']=42;// update an existing value letter_counts['x']=9;// insert a new value   std::cout<<"after modifications:\n";for(constauto&pair : letter_counts){std::cout<< pair.first<<": "<< pair.second<<'\n';}   // count the number of occurrences of each word// (the first call to operator[] initialized the counter with zero)std::unordered_map<std::string, size_t> word_map;for(constauto&w :{"this", "sentence", "is", "not", "a", "sentence", "this", "sentence", "is", "a", "hoax"}){++word_map[w];}   for(constauto&pair : word_map){std::cout<< pair.second<<" occurrences of word '"<< pair.first<<"'\n";}}

出力例:

initially: a: 27 b: 3 c: 1 after modifications: a: 27 b: 42 c: 1 x: 9 2 occurrences of word 'a' 1 occurrences of word 'hoax' 2 occurrences of word 'is' 1 occurrences of word 'not' 3 occurrences of word 'sentence' 2 occurrences of word 'this'

[編集]関連項目

境界チェック付きで指定された要素にアクセスします
(パブリックメンバ関数)[edit]
要素を挿入します。 キーがすでに存在している場合は現在の要素に代入します
(パブリックメンバ関数)[edit]
キーが存在しなければその場で挿入します。 キーが存在している場合は何もしません
(パブリックメンバ関数)[edit]
close