6

如果我确定某个值还没有进入 a unordered_set,并且我要插入这样的值,那么传递这个 setend()迭代器作为提示是否正确?

编辑:

代码:

#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?
}
4

3 回答 3

11

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

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

实际上p是 type std::pair<iterator,bool>,所以p.second告诉你 value 是否被插入,或者它已经存在于集合中,并且p.first是告诉你 value 位置的迭代器。

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

于 2012-04-15T16:36:18.143 回答
2

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

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

于 2012-04-15T16:35:32.450 回答
1

我相信提示是没有用unordered_set,同样的方法是没有用的unordered_map。这些方法的存在是为了维护这些容器的接口与它们的有序版本(分别为set和)兼容。map

在这里阅读更多:std::unordered_map 插入提示

于 2017-11-29T16:35:36.170 回答