Element umieszczony w mapie na invoke z operator[]
powodu klucza poprzednio niezmapowanego jest wartość zainicjowany. Jeśli nie widzisz tej składni, rozważ specjalne znaczenie w poniższym fragmencie kodu.Pareny są ważne. Wprowadzają inną podróż w dół drzewa inicjacji niż domyślna inicjalizacja. Oba są ważne; oba są określone przez standard językowy.
int i = int();
Jak się okazuje, inicjalizacji wartość dla skalarów (w tym wskaźników) w końcu ulega zerowej inicjalizacji. Chociaż nieparzysty wygląd, wartość wcześniejszego fragmentu-inicjuje wystąpienie int
, które staje się zerową inicjacją, ponieważ int
jest skalarem, a następnie kopiuje je do i
. (Aby być uczciwym, prawie na pewno będzie jakaś przesada, ale podstawy są tak prezentowane).
Niezależnie od tego, z powodu tej funkcji, można mieć pewność, kiedy to zrobić:
m_map[0] += 1;
lub nawet to:
++m_map[0];
jeśli indeks nie został odwzorowany przed, a value- zainicjalizowany element zostanie dodany, co spowoduje zerowanie inicjalizacji dla skalarów, co oznacza, że oficjalnie rozpoczniesz z zero.
Warto wspomnieć, że podobna aktywność ma miejsce dla dowolnego typu z domyślnie zadeklarowanym konstruktorem. Czy to trywialne, czy nie, dzieje się coś ciekawego.
struct S { int a; int b; };
std::map<int, S> mymap;
++mymap[0].a;
Jest członkiem a
odwzorowane na 0
w naszym pojemniku niezawodnie 1
po powyższych sporządzi? Tak, to jest. Ponadto, rozważ to:
struct S { int a; std::string str; };
std::map<int, S> mymap;
++mymap[0].a;
Teraz S
ma nietrywialne niejawny konstruktor (ma się, jak to musi skonstruować str
). Ale czy członek a
zmapowany do 0
w naszym pojemniku jest niezawodny od zera (a zatem 1
po powyższej linii)? Tak, to jest.
Jeśli ciekawi Cię różne ścieżki inicjalizacji, see this question and answer. Lub przejrzyj standard C++ 11, w szczególności: C++ 11 § 8.5 Inicjatory, (p5, p7, p10). Warto przeczytać.
Prawdopodobny duplikat: http://stackoverflow.com/questions/4523959/stdmap-default-value-for-build-in-type – JBentley