何时检查项目是否已经存在于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]始终有效;不需要检查