3

以下是计算杂志中字数的 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 作为值。知道为什么吗?

4

3 回答 3

8

您的版本不起作用,因为如果它不存在,这if(hash[magazine[i]]>0)将插入一个元素,这个新元素将具有¹ 的映射值。这意味着这在这里毫无意义,因为现在总会有一个元素。因为它的价值将是your will never run 或者因为 the will never be 。为您留下一张元素图,全部带有 value 。hash0hash.emplace(magazine[i],1);magazine[i]0hash[magazine[i]]++;iftruei0

operator[]如果有一个映射值,则返回对映射值的引用,如果没有,则插入一个,然后返回该引用¹。

这意味着您可以将其分解if并更改为:

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

这基本上意味着:“获取对 key 映射值的引用magazine[i],如果找不到,插入一个并给我那个。增加这个引用。

¹:如果发生插入,则元素被值初始化。因为您的映射值类型是int这将导致映射值0在插入之后。

于 2016-10-24T07:28:19.313 回答
1

您无意中通过执行以下操作在地图中创建了一个新元素:

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

map<>::operator[]进行插入,值初始化(在您的情况下该值为零),然后返回值的引用,所有这些都非常谨慎。

正如许多评论中正确建议的那样,最好的方法是:

hash[key]++ 

阅读更多。

于 2016-10-24T07:19:02.240 回答
1

if(hash[magazine[i]]>0)如果密钥不存在,则创建新项目。

你真正想要的是:

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

正如@juanchopanza 提到的,您不需要分支。std::unordered_map::operator []可以这样处理:

hash[magazine[i]]++;
于 2016-10-24T07:19:22.800 回答