2017-12-05 3 views
1

Ich habe eine std::vector<MyString> welche Daten nicht eindeutig sind. Tatsächlich werden die meisten Strings wiederholt. Und ich muss die einzigartigen und ihre Wiederholungszahl finden.Wie werden neue std :: map-Einträge nur durch Schlüsseleinfügung initialisiert?

Ich benutze Karte:

std::map<MyString,unsigned short> stringsMap; 
....... 
if (stringsMap.find(currentString) == stringsMap.end()) 
{ 
    stringsMap[ currentString ] = 0; 
} 

stringsMap[ currentString ]++; 
........ 

Haben Sie Ideen haben, wie es auf weniger Zeilen getan werden könnte?

Es könnte in einer Zeile getan werden: stringsMap[ currentString ]++; jedoch kurze hat unbestimmten Wert standardmäßig.

+6

Der Anfangswert nicht unbestimmt ist. Es ist 0. ['operator []'] (http://en.cppreference.com/w/cpp/container/map/operator_at) value-initialisiert den Wert eines fehlenden Schlüssels. –

+0

Kannst du mir eine Bestätigung geben? –

+0

Einfach die gesamte "if" -Anweisung loswerden. Wenn '[currentString]' noch nicht existiert, wird es hinzugefügt und sein Wert auf 0 initialisiert, bevor dann operator ++ 'darauf angewendet wird. –

Antwort

3

Es könnte in einer Zeile erfolgen: stringsMap [currentString] ++; jedoch hat short standardmäßig einen unbestimmten Wert.

Das ist nicht wahr, definiert ist Wert auch in documentation angegeben:

Wenn eine Insertion durchgeführt wird, das abgebildet Wert Wert initialisiert (default-konstruiert für Klassentypen, null- sonst initialisiert) und eine Referenz darauf zurückgegeben wird.

Schwerpunkt liegt bei mir.

So ist es völlig in Ordnung, Einzeiler zu schreiben:

stringsMap[ currentString ]++; 

und dies ist gängige Praxis und auch als Beispiel in der Dokumentation gegeben:

// count the number of occurrences of each word 
// (the first call to operator[] initialized the counter with zero) 
std::map<std::string, size_t> word_map; 
for (const auto &w : { "this", "sentence", "is", "not", "a", "sentence", 
         "this", "sentence", "is", "a", "hoax"}) { 
    ++word_map[w]; 
} 
1

jedoch kurz hat unbestimmten Wert standardmäßig.

Nr Für einen nicht vorhandenen Schlüssel wird die Karte T(), um den Wert des neu erstellten Eintrag zu initialisieren, die effektiv für unsigned short-0 auswertet.

Siehe std::map::operator[] documentation (Hervorhebung von mir):

1) Fügt value_type(key, T()), wenn der Schlüssel nicht existiert. Diese Funktion entspricht return insert(std::make_pair(key, T())).first->second;
- key_type muss die Anforderungen von CopyConstructible erfüllen.
- mapped_type müssen die Anforderungen von CopyConstructible und DefaultConstructible erfüllen.
Wenn eine Einfügung ausgeführt wird, wird der gemappte Wert initialisiert (standardmäßig für Klassenarten erstellt, wird 0-initialisiert, andernfalls), und es wird ein Verweis darauf zurückgegeben.

So schreibt nur

std::map<MyString,unsigned short> stringsMap; 
....... 
stringsMap[ currentString ]++; 

ist völlig in Ordnung. Der gesamte if Block ist redundant und wird nicht benötigt.


1) Das ist nicht wirklich wahr ist, war es @Remy Lebau ‚s Schwerpunkt

Verwandte Themen