Ниже приведен код 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 в качестве значения. Есть идеи почему?
Ваша версия не работает, потому что это 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
после вставки.
if(hash[magazine[i]]>0)
создает новый пункт, если ключ не существует.
То, что вы действительно хотите, это:
if(hash.find(magazine[i])!=hash.end())
Как упоминалось @juanchopanza, вам не нужно ветвление. std::unordered_map::operator []
может справиться с этим так:
hash[magazine[i]]++;
Вы случайно создаете новый элемент на карте, выполняя:
if(hash[magazine[i]]>0)
map<>::operator[]
делает вставку, инициализацию значения (это значение равно нулю в вашем случае), а затем возвращает ссылку на значение, все очень незаметно.
Как правильно предложено во многих комментариях, лучший способ это:
hash[key]++