map <int, int> значения по умолчанию - PullRequest
59 голосов
/ 19 апреля 2010
std::map<int,int> mapy;
++mapy[5];

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

Ответы [ 4 ]

92 голосов
/ 19 апреля 2010

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

19 голосов
/ 16 мая 2018

Да, можно предположить.

Значение карты operator[] определяется следующим образом: ([map.access])

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

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

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

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

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

8 голосов
/ 19 апреля 2010

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

2 голосов
/ 16 мая 2018

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

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

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

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

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

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

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

Этот код не только всегда инициализирует целое число 0, но также вставляет 0 в карту. Для простоты, примитивные типы данных не определены, если не инициализированы, но в некоторых случаях, например, при инициализации значения структуры или карты инициализируются примитивные данные с определенным значением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...