std::map<int,int> mapy;
++mapy[5];
Ist es sicher anzunehmen, dass dies mapy[5]
immer 1 sein wird? Ich meine, wird mapy[5]
immer der Standardwert 0 vor '++' erhalten, auch wenn nicht explizit deklariert, wie in meinem Code?
std::map<int,int> mapy;
++mapy[5];
Ist es sicher anzunehmen, dass dies mapy[5]
immer 1 sein wird? Ich meine, wird mapy[5]
immer der Standardwert 0 vor '++' erhalten, auch wenn nicht explizit deklariert, wie in meinem Code?
Antworten:
Sobald Sie mit dem Operator [] auf die Karte zugreifen, wird der Schlüssel hinzugefügt, wenn er nicht vorhanden ist. Der Standardinitialisierer vom Typ int wird aufgerufen, sodass er den Wert 0 erhält.
int
Anfangswert eines nicht initialisierten Grundelements undefiniert - das heißt, er kann 0 oder -99765521 sein. Hatten Sie jemals eine int
als Klassenvariable nicht initialisierte Variable und war einer dieser verrückten Werte in Ihrem Programm enthalten? Das heißt, ich habe das getestet und es scheint zu funktionieren. #include <stdio.h> #include <map> using namespace std; int main() { map<int,int> m ; for( int i = 0 ; i < 100 ; i++ ) m[i]++ ; for( const pair<int,int>& p : m ) printf( "m[%d] => %d\n", p.first, p.second ) ; }
Ja, das ist sicher anzunehmen.
Die Karte wird wie operator[]
folgt angegeben: ([map.access])
Effekte: Wenn es keinen Schlüssel gibt,
x
der der Karte entspricht, wird er in die Karte eingefügtvalue_type(std::move(x), T())
.
Rückgabe: Ein Verweis auf dasmapped_type
entsprechendex
in*this
.
T()
verwendet Wert-Initialisierung für alle T
außer void
([expr.type.conv] / 2) , und die Mehrwert-Initialisierung für ein primitives Ergebnis in Null-Initialisierung ([dcl.init] / 7) .
Daher ergibt der Ausdruck eine Referenz auf ein Objekt mit dem Wert Null ([dcl.init] / 5) .
Der operator++
Aufruf erhöht dann dieses Objekt auf eins und wertet es auf eins aus.
(Alle Referenzen sind C ++ 11.)
Ja, der Standardwert ist der Standardwert dieses Typs. Wenn Sie einen anderen Standardwert wünschen, können Sie eine Klasse erstellen, die sich wie ein int verhält, aber einen anderen Standardkonstruktor hat.
Die Antwort von Rep_Movsd ist zu stark vereinfacht und führt wahrscheinlich zu zahlreichen äußerst gefährlichen Missverständnissen. Primitive Datentypen in C ++ haben keine Initialisierer. Louis Brandy hatte einen wunderbaren Vortrag, in dem er viele häufige C ++ - Fehler bei Facebook diskutierte. Ein Missverständnis darüber, wie std :: map <> [] funktioniert, war einer der Fehler, die er diskutierte. Dies ist eine ausgezeichnete Ressource, obwohl er dies nicht tut Gehen Sie ins Detail, wie std :: map <> [] tatsächlich funktioniert.
Im Allgemeinen werden Ints nicht initialisiert und sind wie alle primitiven Typen undefiniert. Bei Verwendung mit std :: map <> [] hat der int einen Standardwert von Null, der durch einen Prozess namens Wertinitialisierung festgelegt wird. Die Wertinitialisierung ist ein Prozess, der im Allgemeinen mit Strukturen funktioniert. Zum Beispiel,
struct Struct {
Struct() : memberVariable() {}
int memberVariable;
};
Initialisiert das int immer auf Null. Wenn die Elementvariablen andere primitive Typen wären, hätten sie auch spezifische Initialisierungswerte. Zum Beispiel werden die folgenden Typen durch
Wertinitialisierung wie folgt initialisiert:
bool = false
float = 0.0f
enum = (Aufzählungstyp) 0
Zeiger = Nullzeiger
Zeiger auf Mitglied = Null Elementzeiger
Seien Sie äußerst vorsichtig, wenn Sie mit Daten arbeiten, die nicht explizit initialisiert wurden. Eine letzte Sache, betrachten Sie den folgenden Code
map<string, int> myMap;
cout << myMap["Foo"];
Dieser Code initialisiert nicht nur immer die Ganzzahl auf 0, sondern fügt auch 0 in die Karte ein. Um es kurz zusammenzufassen: Primitive Datentypen sind undefiniert, wenn sie nicht initialisiert werden. In einigen Fällen, z. B. bei einer Struktur- oder Kartenwertinitialisierung, werden die primitiven Daten jedoch mit einem bestimmten Wert initialisiert.
struct
Schlüsselwort zu erstellen . Der von Ihnen angezeigte Code enthält eine Klasse . C ++ hat keine Strukturen. Weiterführende Literatur: stackoverflow.com/a/36917400/560648 stackoverflow.com/a/34108140/560648