什么是目前在C ++中使用最广泛的集合集合

时间:2011-06-09 12:27:27

标签: c++ containers

我在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;

4 个答案:

答案 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_setstd::set基于RB树,因此具有O(log n)搜索时间。

答案 3 :(得分:0)

您可能还想查看HashSet中的Poco C++ libraries课程。