Является ли значение примитивных типов в std:: map инициализированным?

Рассмотрим следующий код:

map<int,int> m;
for(int i=0;i<10000;++i) m[i]++;
for(int i=0;i<10000;++i) printf("%d",m[i]);

Я думал, что распечатываемые значения будут undefined, потому что примитивные типы не имеют конструктора по умолчанию, но здесь я получил 10000 1 каждый раз, когда я тестировал.

Почему он инициализирован?

Ответ 1

При вызове operator[], и ключ отсутствует, значение инициализируется с помощью выражения mapped_type(), которое является конструктором по умолчанию для типов классов, и нулевой инициализацией для интегральных типов.

Ответ 2

std:: map:: operator [] вставляет новое значение, если оно не существует. Если выполняется вставка, отображаемое значение инициализируется конструктором по умолчанию для типов классов или нулевым инициализированным в противном случае.

Ответ 3

См. https://www.sgi.com/tech/stl/stl_map.h

  _Tp& operator[](const key_type& __k) {
    iterator __i = lower_bound(__k);
    // __i->first is greater than or equivalent to __k.
    if (__i == end() || key_comp()(__k, (*__i).first))
      __i = insert(__i, value_type(__k, _Tp()));
    return (*__i).second;
  }

В вашем примере _Tp - int, а int() - 0

#include <iostream>
using namespace std;
int main() {
  int x = int();
  cout << x << endl;
  return 0;
}

Кроме того:

благодаря @MSalters, который рассказывает о коде выше, это SGI вместо std:: map, но я думаю, что это похоже...

Ответ 4

В стандарте С++ 14, раздел [map.access] текст:

T& operator[](const key_type& x);

  • Эффекты: Если на карте нет ключа, эквивалентного x, вставляет value_type(x, T()) в карту.

Итак, как и сказал Джозеф Гарвин, результат выражения mapped_type() - это то, что вставлено. Эта инициализация называется инициализацией значения.

Значение инициализации значения не так просто, как предлагается в других ответах для типов классов. Это зависит от того, какой тип конструктора имеет тип класса, и является ли класс агрегатом, как объясняется ссылкой cppreference.

Для int, как и в этом вопросе, инициализация значения означает, что для параметра int установлено значение 0.