Вы полагаетесь на его ценность? Строковый литерал не обязательно должен иметь один и тот же адрес при его различном использовании (особенно при использовании в разных единицах перевода). Таким образом, вы можете на самом деле создать два значения:
counter["apple"] = 1;
counter["apple"] = 1;
Кроме того, вы не получаете никакой сортировки, поскольку происходит сортировка по адресу. Используйте std::string
, у которого нет этой проблемы, поскольку он знает о содержимом и чей operator<
сравнивает лексикографический:
map<std::string, int> counter;
counter["apple"] = 1;
assert(++counter["apple"] == 2);