отображение значений по умолчанию


std::map<int,int> mapy;
++mapy[5];

можно ли предположить, что mapy[5] всегда будет 1? Я имею в виду, будет mapy[5] всегда получить значение по умолчанию 0 Перед'++', даже если не объявлено явно, как в моем коде?

4   51   2010-04-19 16:31:55

4 ответа:

Как только вы получаете доступ к карте с помощью оператора [], если ключ не существует, он добавляется. Инициализатор по умолчанию типа int вызывается - поэтому он получит значение 0.

да, значение по умолчанию будет значением по умолчанию этого типа. Если вы хотите другое значение по умолчанию, вы можете создать класс, который ведет себя как int, но имеет другой конструктор по умолчанию.

да, можно с уверенностью предположить.

карты operator[] указан таким образом:([карта.доступ])

эффекты: если нет ключа эквивалентно x на карте, вставляет value_type(std::move(x), T()) на карте.
возвращает: ссылка mapped_type соответствующую x in *this.

T() использует значение-инициализация для всех T за исключением void([expr.тип.conv] / 2) и значение-инициализация для примитивных результатов в ноль-инициализации([dcl.init] / 7).

поэтому выражение вычисляется как ссылка на объект со значением ноль ([dcl.init] / 5).

The operator++ вызов затем увеличивает этот объект до единицы и вычисляет до единицы.

(все ссылки C++11.)

ответ Rep_Movsd слишком упрощен и, вероятно, приведет к многочисленным чрезвычайно опасным заблуждениям. Примитивные типы данных в C++ не имеют инициализаторов. Луи бренди провел замечательный разговор, в котором он обсудил многие распространенные ошибки C++, сделанные в Facebook, и непонимание того, как работает std::map [], было одной из ошибок, которые он обсуждал, это отличный ресурс, хотя он не идет в дело о том, как работает std::map [].

В общем, ints являются не инициализированы и не определены, как и все примитивные типы. Это, как говорится, при использовании с std:: map[] int имеет значение по умолчанию равное нулю, установленное через процесс, называемый инициализацией значения. Инициализация значения-это процесс, который фактически работает со структурами в целом. Например,

struct Struct {
Struct() : memberVariable() {}
       int memberVariable;
};

всегда будет инициализировать int до нуля. Если бы переменные-члены были другими примитивными типами, они также имели бы определенные значения инициализации. Например, существуют следующие типы инициализируется, через инициализацию значения вот так:

bool = false
float = 0.0 f
enum = (тип enum) 0
указатель = null указатель
указатель на элемент = нулевой указатель на элемент

быть крайне осторожными при работе с данными, которые явно не инициализированы. И последнее, рассмотрим следующий код

map<string, int> myMap;
cout << myMap["Foo"];

этот код не только всегда будет инициализировать целое число 0, но и ввести " 0 " в карте. Просто чтобы быстро повторить, примитивные типы данных не определены, если они не инициализированы, но в некоторых случаях, таких как инициализация значения структуры или карты, инициализируются примитивные данные с определенным значением.