web-dev-qa-db-fra.com

Dans unordered_map de C ++ 11, comment mettre à jour la valeur d'une clé particulière?

Dans la table de hachage de Java:

map.put(key, new_value) 

mettra à jour l'entrée de key = key avec new_value si elle existe dans le hashmap.

Quelle est la bonne façon de faire la même chose dans unordered_map de C++ 11?

Je n'ai pas trouvé d'API comme updateXXX, et la documentation indique que le unordered_map :: insert La fonction ne réussira que s'il n'y a pas de paire avec une clé.

25
Faraway

Si vous savez que la clé se trouve sur la carte, vous pouvez utiliser operator[] qui renvoie une référence à la valeur mappée. Ce sera donc map[key] = new_value. Soyez prudent, car cela insérera un (key, new_value) si la clé n'existe pas déjà dans la carte.

Vous pouvez également utiliser find qui renvoie un itérateur à la valeur:

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

Si le type value n'a pas de constructeur par défaut, vous pouvez utiliser:

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

Cela présente également tous les autres avantages de l'opérateur et de l'insertion en place vs [].

1
N3UR0CHR0M

Je pensais que Java map.put a inséré l'élément s'il n'était pas déjà dans la carte et l'a mis à jour s'il était dans la carte, voir put:

mettre

put V public (touche K, valeur V)

Associe la valeur spécifiée à la clé spécifiée dans cette carte. Si la carte contenait auparavant un mappage pour la clé, l'ancienne valeur est remplacée.

Ce serait équivalent à nordered_map :: operator [] :

Si k correspond à la clé d'un élément du conteneur, la fonction renvoie une référence à sa valeur mappée.

Si k ne correspond à la clé d'aucun élément du conteneur, la fonction insère un nouvel élément avec cette clé et renvoie une référence à sa valeur mappée. Notez que cela augmente toujours la taille du conteneur d'une unité, même si aucune valeur mappée n'est affectée à l'élément (l'élément est construit à l'aide de son constructeur par défaut).

0
RichardBruce