Редактирование значения в неупорядоченной карте для данного ключа

Ниже приведен код C ++ для подсчета слов в журнале. Я пытаюсь добавить слово, если его значение не существует, и если оно существует, увеличить его.

unordered_map<string,int>hash;
vector<string> magazine(m);

for(int i = 0;i <m;i++)
{
cin >> magazine[i];
if(hash[magazine[i]]>0)
hash[magazine[i]]++;
else
hash.emplace(magazine[i],1);
}

Но когда я пытаюсь вывести, все ключи магазина дают 0 в качестве значения. Есть идеи почему?

3

Решение

Ваша версия не работает, потому что это if(hash[magazine[i]]>0) вставит элемент в hash если он не существует, этот новый элемент будет иметь сопоставленное значение 0¹. Который означает, что hash.emplace(magazine[i],1); здесь бессмысленно, потому что там будет всегда быть элементом в magazine[i] сейчас. Потому что его ценность будет 0 ваш hash[magazine[i]]++; никогда не будет работать, потому что if никогда не будет true, Оставив вас с картой i элементы, все со значением 0,

operator[] возвращает ссылку на сопоставленное значение, если оно есть, если нет, то вставляет его, а затем возвращает эту ссылку¹.

Это означает, что вы можете выделить if и просто измените его на:

for(int i = 0;i <m;i++)
{
cin >> magazine[i];
++hash[magazine[i]];
}

Что в основном означает: «Получить ссылку на сопоставленное значение для ключа magazine[i], если ничего не найдено, вставьте один и дайте мне тот. Увеличьте эту ссылку.«

¹: Если вставка происходит, элемент инициализируется значением. Потому что ваш сопоставленный тип значения int это приведет к тому, что отображаемое значение будет 0 после вставки.

8

Другие решения

if(hash[magazine[i]]>0) создает новый пункт, если ключ не существует.

То, что вы действительно хотите, это:

if(hash.find(magazine[i])!=hash.end())

Как упоминалось @juanchopanza, вам не нужно ветвление. std::unordered_map::operator [] может справиться с этим так:

hash[magazine[i]]++;
1

Вы случайно создаете новый элемент на карте, выполняя:

if(hash[magazine[i]]>0)

map<>::operator[] делает вставку, инициализацию значения (это значение равно нулю в вашем случае), а затем возвращает ссылку на значение, все очень незаметно.

Как правильно предложено во многих комментариях, лучший способ это:

hash[key]++

Прочитайте больше.

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector