2016-03-31 3 views
4

Siehe Code unten:sollte ich ++ wordCount [Schlüssel] für unordered_map <string, int> verwenden, wenn Schlüssel in WordCount nicht existiert?

unordered_map<string, int> wordCount; 
for(string word: words) 
    ++wordCount[word]; 

Frage:

Gibt es hier für ++wordCount[word]; verwenden, wenn Wort in WORDCOUNT nicht existiert? Ich habe immer jemanden gesehen, der so benutzt hat, aber ich bin mir nicht wirklich sicher.

Erklärung here sagte:

Wenn k nicht den Schlüssel eines Elements in dem Behälter passen, die Funktion mit diesem Schlüssel ein neues Element eingefügt und liefert eine Referenz auf seinen abgebildet Wert. Beachten Sie, dass dadurch der Container immer um eins vergrößert wird, auch wenn dem Element kein zugewiesener Wert zugewiesen ist (das Element wird mit seinem Standardkonstruktor erstellt).

und ich weiß, dass int is uninitialized in default. Also, ich denke, es ist nicht sicher, den Kartenwert direkt so zu erhöhen, ist das richtig?

+0

Ich denke, ein Standard-konstruierter int ist 0 ... z. 'int()' – dreamlax

Antwort

5

Zitiert cppreference des docs auf operator[]

Wenn der Standardverteiler verwendet wird, führt dies in der Schlüsselkopie Wesen von Schlüsseln aufgebaut und der abgebildete Wert Wert initialisiert wird.

Das Schlüsselwort ist value-initialized. Ein int Wert initialisiert ist Null.

Hier ist die official reference (C 14 ++ 23.5.4.3 Absatz 2 [unord.map.elem]):

Effekte: Wenn die unordered_map enthält nicht bereits ein Element, dessen Schlüssel äquivalent zu k, der erste Operator fügt den Wert value_type(k, mapped_type()) ein und der zweite Operator fügt den Wert value_type(std::move(k), mapped_type()) ein.

Hinweis der mapped_type(), die für mapped_type = int Nullwertbyte int konstruieren wäre.

Verwandte Themen