如果我确定某个值尚未进入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?
}
答案 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
的成员。如上所述here,hint
用于在插入新元素时进行性能优化。新元素的插入/位置基于哈希。因此,如果您知道如何为value_type
生成哈希值,则可以预先生成哈希并为容器提供提示。
但是,编译器可能决定不使用它。所以我的假设是:可以使用end()
但它可能没有任何效果。
答案 2 :(得分:1)
我相信提示无用到unordered_set
,就像对unordered_map
没用一样。存在这些方法来维护这些容器。界面与其有序版本兼容(分别为set
和map
)。
在此处阅读更多内容:std::unordered_map insert with hint