Подсчет экземпляров / гистограммы в C ++ с использованием std :: map - PullRequest
4 голосов
/ 04 ноября 2011

Я видел пример кода, подобный следующему:

std::string s = "Hello World!";
std::map<char, std::size_t> h;

for (std::string::const_iterator i=s.cbegin(); i!=s.cend(); ++i)
{
    ++h[*i];
}

assert(h['l'] == 3);

Кажется, это основано на том, что тип значения обнуляется при первом появлении каждой буквы.Гарантируется ли это даже при использовании чего-то вроде std::size_t, у которого нет конструктора по умолчанию, который обнуляет его?

Ответы [ 2 ]

6 голосов
/ 04 ноября 2011

Действительно, так работает map: оператор [] мутирует и создает объект отображенного типа, если он еще не существует Поскольку size_t значение инициализируется на ноль, все в порядке.

5 голосов
/ 04 ноября 2011

Цитирование MSDN :

POD и скалярные типы всегда инициализируются нулями, если создаются с синтаксисом конструктора по умолчанию.

Итак, если карта создает новые записи при пропущенных ключах, используя конструктор по умолчанию, тогда yes, size_t будет инициализирован нулем.

...