编辑给定键的无序映射中的值

时间:2016-10-24 07:11:28

标签: c++ unordered-map emplace

以下是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 个答案:

答案 0 :(得分:8)

您的版本不起作用,因为如果if(hash[magazine[i]]>0)不存在,hash会将元素插入0,此新元素的映射值将为hash.emplace(magazine[i],1);¹。这意味着magazine[i]在这里毫无意义,因为总是现在是0的元素。由于hash[magazine[i]]++;的价值将为if,因此true将永远不会i。留下0元素的地图,所有元素都有价值if

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

这意味着您可以将for(int i = 0;i <m;i++) { cin >> magazine[i]; ++hash[magazine[i]]; } 分解出来,只需将其更改为:

magazine[i]

这基本上意味着:“获取对键int的映射值的引用,如果没有找到,请插入一个并给我一个。增加此引用。

¹:如果发生插入,则元素被初始化。由于您的映射值类型为0,因此插入后的映射值将为{{1}}。

答案 1 :(得分:1)

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

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

map<>::operator[]执行插入,值初始化(在您的情况下该值为零),然后非常谨慎地返回值的引用。 < / p>

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

hash[key]++ 

Read more.

答案 2 :(得分:1)

如果密钥不存在,

SELECT count(product_id) AS count_likes, product_count FROM '._DB_PREFIX_.'count_likes WHERE product_id = '.$product_id.' AND ip-address = "'.trim($ip_address).'"; 会创建项。

你真正想要的是:

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

正如@juanchopanza所提到的,你不需要分支。 if(hash.find(magazine[i])!=hash.end()) 可以像这样处理它:

std::unordered_map::operator []