我正在C++中搜索一組容器。我想要一些我可以添加元素的地方,但是他們不會重複多次,並且在那個集合中搜索將會是O(1)。現在什麼是目前事實上的交叉編譯器容器。 我看到一些在boost(如mpl)和未來的C++標準中有一個,但現在和這裏最好使用什麼?什麼是當前在C++中使用最廣泛的集合集合
EDIT在升壓存儲載體的
例:: unordered_set容器。所以對我來說,它似乎很適合我的需要,但我會有很多數據,所以如果有人立即看到一些潛在的錯誤,你可以評論什麼可以出錯。同樣,所有元素都是無指針的排序向量。
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;
。你還可以評論boost :: unsorted_set如何管理更復雜的對象。說一個std:向量。 – 2011-06-09 12:39:39
從機械角度來看,它的工作原理與其他任何物體一樣 - 關鍵是始終提供良好的散列函數,以最大限度地減少衝突並且不會影響性能。對於複雜對象來說,這比對'std :: string'更困難了,它本身已經夠難了。 – 2011-06-09 12:44:02
這一切都取決於你如何爲該矢量對象創建散列函數。例如,你會搜索一個元素一個元素,有點像'memcmp'對數據數組有用,檢查每個元素是否相同,大於或小於彼此,然後確定向量是否相等,當第一次不匹配發生時,是大於還是小於另一個向量?如果你這樣做了,你可以看到散列函數與實際的散列表插入時間相比如何很慢(即與恆定時間相比是線性的)。 – Jason 2011-06-09 12:46:17