何时检查项目是否已经存在于C++ SET/MAP中? 关于C++中的SET、无序、集、映射、无序等问题,我有一个一般性的问题。

何时检查项目是否已经存在于C++ SET/MAP中? 关于C++中的SET、无序、集、映射、无序等问题,我有一个一般性的问题。,c++,dictionary,set,unordered-map,unordered-set,C++,Dictionary,Set,Unordered Map,Unordered Set,我经常看到这样的代码:在试图更改某个项的值之前,检查该项是否已经在集合/映射中 我想知道,在试图修改集合/映射之前,什么时候应该手动检查集合/映射中是否已经存在某个项 例如: unordered_set<string> banwords(banned.begin(), banned.end()); unordered_map<string, int> count; string word = "test"; if (banwords.find(word) == banw

我经常看到这样的代码:在试图更改某个项的值之前,检查该项是否已经在集合/映射中

我想知道,在试图修改集合/映射之前,什么时候应该手动检查集合/映射中是否已经存在某个项

例如:

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中,而是假设count[word]=0,然后它才存在于映射中

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


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

因为您显示的代码的目的是获取最常出现的非禁用单词,所以您需要首先检查该单词是否在禁用列表中。然后,您可以直接访问count[word],而无需进行检查,因为如果word不在count中,它将被插入,默认值存储为int值,即0

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


顺便说一句,在您展示的代码中,由于有两个或三个count[word]调用,因此在映射中会有两个或三个查找来定位键/值对。使用int c=++count[word];,然后在另外两个地方引用c可以稍微提高性能。

因为您显示的代码的目标是获取最常出现的非禁止单词,所以您需要首先检查该单词是否在禁止列表中。然后,您可以直接访问count[word],而无需进行检查,因为如果word不在count中,它将被插入,默认值存储为int值,即0

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

顺便说一句,在您展示的代码中,由于有两个或三个count[word]调用,因此在映射中会有两个或三个查找来定位键/值对。使用int c=++count[word];,然后,在其他两个位置引用c可以稍微提高性能。

这里的关键是,当word不在映射中时,count[word]会在映射中创建一个新条目,其关键字为word,值为0。因此,++count[word]始终有效;无需检查。

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