Tun STL-maps initialisieren primitive Typen einfügen?
Ich habe eine std::map
wie diese:
map<wstring,int> Scores;
Es speichert die Namen der Spieler und erzielt. Wenn jemand bekommt eine Punktzahl, ich würde einfach tun:
Scores[wstrPlayerName]++;
Wenn es kein element in der map mit dem Schlüssel wstrPlayerName
es wird eine zu erstellen, aber muss es initialisieren, um null oder null ist, bevor das Inkrement ein, oder ist es nicht definiert?
Sollte ich testen, ob das element vorhanden ist jedes mal, bevor increment?
Ich habe nur gefragt, weil ich dachte, primitive-Typ sind die Dinge immer undefiniert, wenn erstellt.
Wenn ich etwas schreiben wie:
int i;
i++;
Der compiler warnt mich, dass ich nicht definiert ist und wenn ich das Programm starte ist es in der Regel nicht null ist.
InformationsquelleAutor Calmarius | 2009-02-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
operator[] sieht wie folgt aus:
Wenn Sie rufen Sie es mit einem Schlüssel das ist noch nicht in der Karte an, so werden default-Konstrukt eine neue Instanz von Wert, steckte es in die Karte unter Schlüssel Sie übergeben, und geben Sie einen Hinweis darauf. In diesem Fall haben Sie:
Wert hier ist int, und int-Werte sind default-konstruiert als 0, wenn Sie initialisiert Sie mit int(). Andere primitive Typen initialisiert ähnlich (z.B., double(), lange(), bool(), etc.).
In der Ende-code, setzt ein neues paar (wstrPlayerName, 0) in der Karte, dann liefert eine Referenz auf die int, die man dann erhöhen. So gibt es keine Notwendigkeit, um zu testen, ob das element existiert noch, wenn Sie wollen, Dinge zu starten, von 0.
InformationsquelleAutor Todd Gamblin
Diese wird default-Konstrukt eine neue Instanz von
value
. Für ganze zahlen, die Standard-Konstruktion ist 0, so dass diese wie gewünscht funktioniert.InformationsquelleAutor hazzen
Sollte man nicht testen, ob das Element vorhanden ist, vor der Inkrementierung. Der [] - operator ist genau das, was Sie brauchen, es zu tun, wie schon andere gesagt haben.
Aber was ist, wenn der default-konstruiert Wert würde nicht für Sie arbeiten? In Ihrem Fall ist der beste Weg, um herauszufinden, ob das element bereits vorhanden ist, um zu versuchen, um es einzufügen. Die
insert
member-Funktion fürstd::map
gibt einestd::pair<iterator, bool>
. Ob der insert erfolgreich ist oder fehlschlägt, wird das erste element des Paares auf das gewünschte Objekt (entweder die neue oder die, die bereits vorhanden war). Sie können dann ändern Sie seinen Wert wie Sie sehen, passen.InformationsquelleAutor Michael Kristofik
Überprüfen Sie die Regeln für die Initialisierung.
Siehe Abschnitt 4.9.5 Initialisierung von C++ Prog Lang-oder C++ - std buchen. Je nachdem, ob die variable lokal ist, statische, benutzerdefinierte oder const default-Initialisierung passieren kann.
In Sie Fall, das int genannt wird-POD (Plain old Datatype). Alle auto - (erstellt am heap /lokale variable) POD-variable ist nicht standardmäßig initialisiert. Damit für Sie "ich" oben " nicht den Wert null.
Immer machen Sie eine Gewohnheit der Initialisierung POD bei definierten heap. Sie können auch mit int() zu initialisieren-Wert.
Okay, deine Antwort ist tatsächlich reagieren zu @Calmarius Antwort, das ist jetzt unter (nicht vor), wie lese ich es jetzt. Dies sollte eigentlich ein Kommentar, nicht eine separate Antwort.
Als eine Antwort auf die Frage gepostet, das ist komplett falsch.
InformationsquelleAutor Ketan