在unordered_set中插入一个新元素:提示应该是end()吗?

时间:2012-04-15 16:26:11

标签: c++ stl c++11

如果我确定某个值尚未进入unordered_set,并且我要插入这样的值,那么将此end()迭代器作为提示传递是否正确?

编辑:

代码:

#include <unordered_set>
using namespace std;

unordered_set<int> someset;

int main(){
    auto it=someset.find(0);
    if(it==someset.end()) someset.insert(it, 0);    //correct? possible performance boost if the set is actually populated?
}

3 个答案:

答案 0 :(得分:8)

我认为,您可以简单地调用insert函数,返回的值将告诉您是否插入了值,或者它是否已存在于集合中。

auto p = someset.insert(value);
if (!p.second) 
{
   std::cout << "value was already present in the set" << std::endl;
}

实际上p的类型为std::pair<iterator,bool>,因此p.second会告诉您是否已插入值,或者它是否已存在于集合中,p.first是迭代器告诉你价值的位置。

请记住,这比您的方法更快,因为我的解决方案会减少整体工作。

答案 1 :(得分:2)

我假设您指的是iterator insert ( const_iterator hint, value_type&& val );,它是C ++ 11 unordered_set的成员。如上所述herehint用于在插入新元素时进行性能优化。新元素的插入/位置基于哈希。因此,如果您知道如何为value_type生成哈希值,则可以预先生成哈希并为容器提供提示。

但是,编译器可能决定不使用它。所以我的假设是:可以使用end()但它可能没有任何效果。

答案 2 :(得分:1)

我相信提示无用unordered_set,就像对unordered_map没用一样。存在这些方法来维护这些容器。界面与其有序版本兼容(分别为setmap)。

在此处阅读更多内容:std::unordered_map insert with hint