以下是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作为值。知道为什么吗?
答案 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]++
答案 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 []