【问题标题】:When to check if item already exists in C++ set/map?何时检查 C++ 集/映射中是否已存在项目?
【发布时间】:2019-04-20 21:46:05
【问题描述】:

我有一个关于 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 甚至在它甚至存在于地图中之前。

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

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

【问题讨论】:

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


    【解决方案1】:

    这里的关键是当word不在map中时,count[word]在map中创建一个新的entry,key为word,value为0。所以++count[word]总是有效的;无需检查。

    【讨论】:

      【解决方案2】:

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

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

      顺便说一下,在您显示的代码中,由于对count[word] 进行了两次(或三次)调用,因此将在映射中进行两次(或三次)查找以定位键/值对。使用int c = ++count[word];,然后在其他两个地方引用c 可以带来小的性能提升。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-20
        • 2019-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-23
        • 2018-08-22
        相关资源
        最近更新 更多