2015-08-27 14 views
12

Załóżmy, że mam mapęCzy elementy dodawane do pliku std :: map zostały zainicjalizowane automatycznie?

std::map<int, double> foo;

to zachowanie w moim piśmie foo[2] += 3.0; zdefiniowane? To znaczy, czy w moim przypadku automatycznie zainicjowano jakieś domyślnie dodane elementy mapy (mam nadzieję, że do 0.0)?

Jeśli nie, czy wprowadzam ciężarówkę o niezdefiniowanym zachowaniu? Jeśli tak, czy mogę zrobić coś ciekawego z alokatorem, aby wymusić inicjalizację na 0.0?

+0

Powiązane: http://stackoverflow.com/questions/2333728/stdmap-default-value – dhke

Odpowiedz

6

Tak, w twoim przypadku będzie to value-initialized (jako 0.0). Według cppreference:

Zwraca odwołanie do wartości, które są mapowane do klucza odpowiednik klucza wykonywania wstawiania jeśli taki klucz nie istnieje.

Jeśli wykonywane jest wstawianie, odwzorowana wartość jest zainicjowana wartością (konstruowana domyślnie dla typów klas, zero inicjowana inaczej) i odwołanie do niej jest zwracane.

+2

"Zinicjalizowane zero". To jest sedno tego. Dziękuję Ci. –

+1

Czy to zawsze było prawdą, czy tylko w C++ 11? C++ 11 robi znacznie więcej, aby wypełnić ustawienia domyślne niż poprzednio, ale nie wiem, czy jest to jeden z tych kontekstów. –

+2

@AaronMcDaid To samo dotyczy C++ 03. – TartanLlama

-1

Tak, są automatycznie inicjowane wartości podczas używania operator[] na nieistniejącym kluczyku. Konkretnie w normie to opisano w §23.4.4.3/1 (gdy mówimy o operator[]):

Efekty: Jeśli nie ma klucza równoważne x na mapie, wstawia value_type(x, T()) na mapie.

Dla większości typów numerycznych, w tym double wyrażenie T() daje element wartości inicjalizacji tego typu, w związku z tym w wyniku czego otrzymano 0.0 w danym przypadku.

+0

Ale "double" tak naprawdę nie ma domyślnego konstruktora. –

+0

Są one w rzeczywistości zainicjalizowane wartością, w przeciwnym razie kod OP wywołałby UB. – juanchopanza

+0

@juanchopanza To właściwie [to samo] (http://stackoverflow.com/a/1613383/493122) dla 'double'. – Shoe

0

N3337 [map.access]/1Efekty: Jeśli nie ma klucza równoważne x na mapie, wkładki value_type(x,T()) na mapie.

T() jest wartości inicjalizacji, co ma miejsce w przypadku wbudowanych typów powoduje zero inicjalizacji. W związku z tym foo[2] wstawi zainicjowany zero double do mapy, aby Twój kod był dobrze zdefiniowany.