什么时候检查C ++集合/地图中是否已经存在项目?

时间:2019-04-20 21:46:06

标签: c++ dictionary set unordered-map unordered-set

我对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甚至早于地图中的单词。

另一方面,我看到了其他线程鼓励检查该项目是否首先存在。

这里推荐的解决方案是什么?

2 个答案:

答案 0 :(得分:4)

此处的关键是,当word尚未在地图中时,count[word]在地图中创建一个新条目,其关键字为word,值为0。因此++count[word]始终有效;无需检查。

答案 1 :(得分:0)

由于显示的代码的目的是获取最常出现的非禁止词,因此您需要首先检查该词是否在禁止列表中。然后,您可以直接访问count[word](无需检查),因为如果word不在count中,则会插入默认值并将其存储为值(int() ,该值为0)。

对于是否应检查地图或集合中是否存在键,没有一般性规定。这取决于您如何使用它以及您的目标是什么。

顺便说一句,在您显示的代码中,由于有两次(或三个)对count[word]的调用,因此在映射中将有两个(或三个)查找以查找键/值对。使用int c = ++count[word];,然后在其他两个地方引用c可以改善性能。