我在C ++中搜索一个set容器。我想要一些我可以添加元素的东西,但它们不会重复多次,并且在该集合中搜索将是O(1)。现在什么是当前的defacto交叉编译器容器。 我在boost(如mpl)中看到了一些,未来的c ++标准中有一个,但现在最好用什么呢?
修改
在boost :: unordered_set容器中存储vector的示例。所以对我而言似乎很适合我的需求,但我会有很多数据,所以如果有人立即看到一些潜在的错误,你可以评论什么可能出错。同样,所有元素都是带有指针的排序向量。
vector<string> values1;
values1.push_back("aaa");
values1.push_back("bbb");
values1.push_back("ccc");
vector<string> values2;
values2.push_back("aa");
values2.push_back("bbb");
values2.push_back("ccc");
vector<string> values3;
values3.push_back("aaa");
values3.push_back("bbb");
vector<string> values4;
values4.push_back("aaa");
values4.push_back("bbb");
values4.push_back("ccc");
values4.push_back("ddd");
vector<string> values5;
values5.push_back("aaa");
values5.push_back("bbb");
values5.push_back("ccc");
vector<string> values6;
values6.push_back("aaa");
values6.push_back("bbb");
values6.push_back("ccc");
values6.push_back("ddd");
boost::unordered_set<vector<string> > collection;
collection.insert(values1); // 1
cout << collection.size() << endl;
collection.insert(values2); // 2
cout << collection.size() << endl;
collection.insert(values3); // 3
cout << collection.size() << endl;
collection.insert(values4); // 4
cout << collection.size() << endl;
collection.insert(values5); // 4
cout << collection.size() << endl;
collection.insert(values6); // 4
cout << collection.size() << endl;
答案 0 :(得分:8)
如果您有支持C ++ 0x的编译器,则可以使用std::unordered_set。
如果您不处于这种情况,则可以在Microsoft VC ++中将拦截作为stdext::hash_set,或者通常使用boost::unordered_set。后者是目前可移植性最好的选择,等待更广泛的C ++ 0x可用性。正如@Nemo的评论中所指出的那样,对std::tr1::unordered_set
也有广泛的支持,作为Boost使用的替代方案。
[std::set
将为O(log n),因为它基于搜索树。要获得O(1),您需要使用基于哈希表的容器,同时适当考虑成员对象的哈希函数的有效实现。]
答案 1 :(得分:4)
C ++ 03:boost::unordered_set
C ++ 0x:std::unordered_set
较旧的实现(VC ++中的stdext::hash_set
)不是交叉编译器。
注意:boost::unordered_set
接口已重新用于std::unordered_set
,因此迁移也很容易
编辑有趣的添加==&gt;如果表现令人担忧,并且您想要快速测试缺席,您可能会对查找Bloom过滤器感兴趣。
答案 2 :(得分:1)
你需要使用一个基于哈希表的集合来获得O(1)搜索时间(即不变的搜索时间),这样就可以std::unordered_set
和/或{{1 }}。当前的C ++ 03 boost::unordered_set
和std::set
基于RB树,因此具有O(log n)搜索时间。
答案 3 :(得分:0)
您可能还想查看HashSet中的Poco C++ libraries课程。