web-dev-qa-db-ja.com

C ++ 11のunordered_mapで、特定のキーの値を更新する方法は?

Javaのハッシュマップでは:

map.put(key, new_value) 

ハッシュマップに存在する場合、key = keyのエントリをnew_valueで更新します。

C++ 11のunordered_mapで同様のことを行う正しい方法は何ですか?

UpdateXXXのようなAPIが見つかりませんでした。ドキュメントには、 unordered_map :: insert 関数は、そのようなキーとのペアがない場合にのみ成功します。

25
Faraway

キーがマップにあることがわかっている場合は、マップされた値への参照を返すoperator[]を利用できます。したがって、map[key] = new_valueになります。ただし、キーがまだマップに存在しない場合は、(key, new_value)が挿入されるので注意してください。

値にイテレータを返すfindを使用することもできます。

auto it = map.find(key)
if(it != map.end()) 
    it->second = new_value;
35
Yuushi

タイプvalueにデフォルトのコンストラクターがない場合は、次を使用できます。

map.emplace(key, new_value).first->second = new_value;

これには、emplaceと[]演算子および挿入のその他すべての利点もあります。

1
N3UR0CHR0M

私はJavaのmap.put要素がまだマップにない場合は挿入し、マップにある場合は更新しました。putを参照してください:

プット

公開V put(Kキー、V値)

指定された値をこのマップの指定されたキーに関連付けます。マップに以前にキーのマッピングが含まれていた場合、古い値が置き換えられます。

これは nordered_map :: operator [] と同等です。

Kがコンテナ内の要素のキーと一致する場合、関数はマップされた値への参照を返します。

kがコンテナ内のどの要素のキーとも一致しない場合、関数はそのキーを持つ新しい要素を挿入し、そのマッピングされた値への参照を返します。これにより、マッピングされた値が要素に割り当てられていない場合でも、常にコンテナサイズが1増加します(要素はデフォルトのコンストラクターを使用して構築されます)。

0
RichardBruce