2013-04-23 13 views
5

Ten fragment kodu wydaje się działać dobrze, z domyślną wartością dla nich value_type (int) jako 0; działa to we wszystkich przypadkach?std :: mapowanie <string,int> domyślna inicjalizacja wartości

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

Co z podwójnym? mapę? domyślnie 0.0?

+1

Nie mogę zrozumieć, o co właściwie pytasz. Czy możesz powtórzyć? –

+0

Przepraszamy za zamieszanie. Poniższe odpowiedzi są bardzo pomocne. – wenfeng

Odpowiedz

5

Tak, ten kod zadziała na dowolny typ klucza, w tym double. Powodem tego jest to, że niestanowiący wartości operator [] zwraca wartość odniesienia dla klucza, a nie kopię tej wartości. Jest to odniesienie, do którego zostanie zastosowany operator ++.

Kod fragment, które wykazują działa następująco:

  • Dla każdej kluczowej t typu string w pojemniku str,
  • Mapa w jest poszukiwany za dany klucz
  • Od wejścia nie ma tam, nowy został wstawiony do mapy
  • Ponieważ klucz wpisu jest znany, ale wartość nie jest, domyślny obiekt dla wartości zostanie utworzony
  • odniesienie do nowo utworzonego obiektu (w tym przypadku int& zerowany) jest zwrócony do wywołującego
  • Operator ++ stosuje się odniesienia zwróconej od [], która zmienia 0 do 1 (lub 0.0 do 1.0 itp.)
+0

Dzięki za wyjaśnienie! Bardzo pomocne! – wenfeng

+0

Rozumiem. Dzięki. To jest moje pierwsze pytanie na temat stackoverflow. – wenfeng

6

Tak. Kiedy używasz operatora-[] na mapie i nie ma elementu z pożądanym kluczem, wstawiany jest nowy element, który jest zainicjalizowany wartością. W przypadku liczby całkowitej oznacza to, że jest ona inicjalizowana do zera.

1

czy to działa we wszystkich przypadkach?

We wszystkich przypadkach nowy klucz zostanie powiązany z wartością zainicjowaną na T().

Kiedy T jest wbudowany lub Plain Old Data typu, takich jak int lub double, że ma wartość zero.

Gdy klasa T jest klasą, mapa podejmie próbę wywołania pustego konstruktora.

+0

Jeśli ta klasa ma domyślny konstruktor. W przeciwnym razie nie uda się skompilować. – andrjas

Powiązane problemy