2013-04-30 3 views
16

In Java hashmap:In unordered_map von C++ 11, wie den Wert eines bestimmten Schlüssels zu aktualisieren?

map.put(key, new_value) 

wird die Eingabe-Taste = Taste mit new_value aktualisieren, wenn es in der hashmap existiert.

Was ist der richtige Weg, um die ähnliche Sache in unordered_map von C++ 11 zu tun?

Ich habe keine API wie updateXXX gefunden, und die Dokumentation sagt die unordered_map :: insert Funktion wird nur gelingen, wenn es kein solches Paar mit einem Schlüssel gibt.

Antwort

21

Wenn Sie wissen, dass sich der Schlüssel in der Karte befindet, können Sie operator[] verwenden, die einen Verweis auf den zugeordneten Wert zurückgibt. Daher wird es sein. Seien Sie jedoch vorsichtig, da dies eine (key, new_value) einfügt, wenn der Schlüssel nicht bereits in der Karte vorhanden ist.

Sie können auch find verwenden, die einen Iterator auf den Wert zurückgibt:

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

Oder 'std :: unordered_map :: at'. Es wird die Ausnahme "std :: out_of_range" ausgelöst, wenn das Element mit dem angegebenen 'key' nicht existiert. – soon

+0

Danke! Ich habe 'unordered_map :: const_iterator it = map.find (key)' verwendet und einen Fehler bekommen, als ich 'it-> second'' 'new_value' 'zuweisen wollte. 'auto' funktioniert perfekt. Ich brauche mehr über C++ zu lernen. – Faraway

+1

@Yeclipse Das ist, weil Sie eine 'const_iterator' verwenden - das bedeutet, dass was der Iterator" zeigt "ist" const "(das heißt, es kann nicht geändert werden). Ändern Sie es in 'unordered_map :: iterator it = map.find (key)' und es wird funktionieren - das ist, was 'auto' daraus ableitet. – Yuushi

2

Ich dachte, dass Java map.put das Element eingefügt, wenn es nicht bereits in der Karte war und es aktualisiert, wenn es in der Karte war siehe, put:


setzte
öffentlichen V put (K-Taste, V-Wert)

Verknüpft den angegebenen Wert mit dem angegebenen Schlüssel in dieser Map. Wenn die Zuordnung zuvor eine Zuordnung für den Schlüssel enthielt, wird der alte Wert ersetzt.

wäre dies äquivalent zu unordered_map::operator[]:

Wenn k den Schlüssel eines Elements in dem Behälter übereinstimmt, gibt die Funktion einen Verweis auf seinen zugeordneten Wert.

Wenn k nicht mit dem Schlüssel eines Elements im Container übereinstimmt, fügt die Funktion ein neues Element mit diesem Schlüssel ein und gibt einen Verweis auf den zugeordneten Wert zurück. Beachten Sie, dass dadurch die Containergröße immer um eins erhöht wird, auch wenn dem Element kein zugewiesener Wert zugewiesen ist (das Element wird mit seinem Standardkonstruktor erstellt).