2013-04-23 10 views
5

Dieses Stück Code scheint gut funktionieren, mit Standardwert für sie value_type (int) als 0; funktioniert es für alle Fälle?Std :: Karte <string,int> Standardwert Initialisierung des Werts

std::map<std::string,int> w; 
for (const auto& t: str) 
    w[t]++; 

Was ist mit Doppel? Karte? Standard 0.0?

+1

Ich kann nicht verstehen, was Sie tatsächlich fragen. Kannst du umformulieren? –

+0

Sorry für Verwirrung. Die folgenden Antworten sind sehr hilfreich. – wenfeng

Antwort

5

Ja, dieser Code würde für jede Art von Schlüssel funktionieren, einschließlich double. Der Grund dafür ist, dass die nicht-const operator [] eine Referenz auf den Wert am Schlüssel, keine Kopie dieses Werts zurückgibt. Dies ist die Referenz, auf die der Operator ++ angewendet wird.

Das Codefragment, das Sie Werke zeigen, wie folgt:

  • Für jeden Schlüssel t der in dem Behälter strstring Typ,
  • Die Karte w ist für den Schlüssel
  • Da der Eintrag gegeben gesucht ist nicht da, ein neues wird in die Karte eingefügt
  • Da der Schlüssel des Eintrags bekannt ist, aber der Wert nicht, wird ein Standardobjekt für den Wert erstellt
  • Ein Verweis auf das neu-Objekt erzeugt (in diesem Fall int& initialisiert auf Null) an dem von den [] zurück
  • Der ++ Operator auf die Referenz Aufrufer zurückgegeben angelegt wird, die 0 zu 1 (oder 0.0 zu 1.0 ändert usw.)
+0

Danke für die Erklärung! Sehr hilfreich! – wenfeng

+0

Ich sehe. Vielen Dank. Dies ist meine erste Frage zu Stackoverflow. – wenfeng

6

Ja. Wenn Sie den [] -Operator auf einer Karte verwenden und kein Element mit dem gewünschten Schlüssel vorhanden ist, wird ein neues Element eingefügt, dessen Wert initialisiert wird. Für eine ganze Zahl bedeutet dies, dass sie auf Null initialisiert wird.

1

funktioniert es für alle Fälle?

In allen Fällen wird ein neuer Schlüssel einem Wert zugeordnet, der auf T() initialisiert wurde.

T Wenn eine eingebaute oder Plain Old Data Typ, wie int oder double, die auf Null auswertet.

Wenn T eine Klasse ist, versucht die Map, den leeren Konstruktor aufzurufen.

+0

Wenn diese Klasse einen Standardkonstruktor hat. Andernfalls wird das Kompilieren fehlschlagen. – andrjas

Verwandte Themen