我对C ++ STL中的set,unordered_set,map,unordered_map有一个一般性的问题。
我经常看到代码,在尝试更改其值之前会先检查该项目是否已在集合/地图中。
我想知道,什么时候建议在尝试修改之前在集合/地图中手动检查某项是否已经存在?
例如:
unordered_set<string> banwords(banned.begin(), banned.end());
unordered_map<string, int> count;
string word = "test";
if (banwords.find(word) == banwords.end()){
++count[word];
if (count[word] > maxpair.second){
maxpair.first = word;
maxpair.second = count[word];
}
}
不进行任何检查来确定单词中是否已经存在单词,而是假定count[word] = 0
甚至早于地图中的单词。
另一方面,我看到了其他线程鼓励检查该项目是否首先存在。
这里推荐的解决方案是什么?
答案 0 :(得分:4)
此处的关键是,当word
尚未在地图中时,count[word]
在地图中创建一个新条目,其关键字为word
,值为0。因此++count[word]
始终有效;无需检查。
答案 1 :(得分:0)
由于显示的代码的目的是获取最常出现的非禁止词,因此您需要首先检查该词是否在禁止列表中。然后,您可以直接访问count[word]
(无需检查),因为如果word
不在count
中,则会插入默认值并将其存储为值(int()
,该值为0)。
对于是否应检查地图或集合中是否存在键,没有一般性规定。这取决于您如何使用它以及您的目标是什么。
顺便说一句,在您显示的代码中,由于有两次(或三个)对count[word]
的调用,因此在映射中将有两个(或三个)查找以查找键/值对。使用int c = ++count[word];
,然后在其他两个地方引用c
可以改善性能。