2010-05-07 4 views
1

Я немного напуган о чем-то вроде этого:оператор станд :: Карта [] и автоматически создаются новые объекты

std::map<DWORD, DWORD> tmap; 
    tmap[0]+=1; 
    tmap[0]+=1; 
    tmap[0]+=1; 

С DWORD, автоматически не инициализируются, я всегда боюсь TMAP [0 ] - случайное число, которое увеличивается. Как карта знает, что нужно инициализировать DWORD, если среда выполнения не знает, как это сделать?

Гарантировано, что результат всегда tmap[0] == 3?

+0

Когда вы используете нестандартные типы, такие как 'DWORD', лучше описать, каковы они на самом деле, даже если вы думаете, что« каждый должен это знать ». – AnT

+1

Не очень родственный, но я действительно ненавижу этот'оператор [] 'вставляет объекты inte на карту, я бы предпочел бы такое же поведение, как попытка получить элемент вне диапазона в'std :: vector' –

+0

@Viktor: Не определено? –

ответ

3

Новый объект, когда вставляется в карту с помощью [] оператора, является значение инициализируется. Это обеспечивается реализацией карты, т. Е. Выполняется в этом смысле «автоматически». Для объектов типа DWORD (при условии, что это скалярный тип) инициализация значения означает нулевую инициализацию.

По определению, данному в 23.3.1.2, operator [] является обобщающим для

(*((insert(make_pair(x, T()))).first)).second 

T() бит новый объект, который превратится в DWORD() в вашем случае. DWORD() будет равен нулю.

+0

Я действительно не знал инициализации значений, существующих для встроенных типов данных. Это облегчает мою жизнь! – user331471

+0

Я вижу. Но если конструктор по умолчанию типа T дорог, а карта уже содержит ключ x, то эта «стенография» болезненно неэффективна! Или я ошибаюсь? – user331471

+0

@ thomas-gies: Вы правы, это действительно будет неэффективно, если оно будет реализовано буквально, как показано выше. Я бы ожидал качественной реализации, чтобы каким-то образом реализовать * эквивалентную * функциональность более разумным образом. – AnT

4

Да. Когда новое значение вставляется в карту по operator[], это значение-инициализировано и для встроенных числовых типов (DWORD - это typedef для встроенного типа), это означает ноль.

0

Да. Если ключ, который вы передали operator[], не существует, то карта будет по умолчанию построить объект и вставить его. В вашем случае это будет делать DWORD(), который даст значение 0.

 Смежные вопросы

  • Нет связанных вопросов^_^