2013-03-23 78 views
7

ALL,STL中是否有排序的容器?

STL中是否有排序的容器? 我的意思是如下:

我有一個std :: vector,其中Foo是一個自定義的類。我也有一個比較類的比較,它將比較Foo類的字段。

現在,某個地方在我的代碼我做:

std::sort(myvec.begin(), myvec.end(), comparator); 

將根據我在比較中定義的規則排序向量。

現在我想在該向量中插入Foo類的元素。 如果我可以,我想這樣寫:

mysortedvector.push_back(Foo()); 

,並會發生什麼樣的是,向量將根據比較它的地方把這個新元素。

相反,現在我必須寫:

myvec.push_back(Foo()); 
std::sort(myvec.begin(), myvec.end(), comparator); 

這只是浪費時間,因爲載體已經排序,所有我需要的是新的元素適當的地方。由於我的程序的性質,我不能使用std :: map <>,因爲我沒有鍵/值對,只是一個簡單的向量。

如果我使用stl :: list我需要在每次插入後再次調用排序。

非常感謝您提供任何建議。

+2

什麼'的std :: set'? – us2012 2013-03-23 01:50:23

+0

如果你知道它會去哪裏,你可以使用insert() – james82345 2013-03-23 01:58:10

+0

@ us2012,我看着std :: set。問題是那些對象將會呈現在網格中,用戶可以根據所有類成員對它們進行排序,並以任何他們認爲合適的方式修改它們。由於std :: set成員是const定義的,所以這個容器不適合我。 – Igor 2013-03-24 03:13:33

回答

21

是,std::setstd::multisetstd::mapstd::multimap使用std::less作爲默認的比較操作的所有排序。所使用的基礎數據結構通常是平衡二叉搜索樹,如紅黑樹。因此,如果您向這些數據結構添加元素,然後遍歷包含的元素,則輸出將按排序順序排列。將N個元素添加到數據結構的複雜度將爲O(N log N),或者與使用任何常見的O(log N)複雜度排序對N個元素的向量進行排序相同。

在您的特定情況下,由於您沒有鍵/值對,因此std::setstd::multiset可能是您最好的選擇。

+0

很好的解釋! – Arun 2013-03-23 04:03:41

0

我不認爲功能存在於STL,一個std ::向量只能與排序分區nth_elementstable_partitionpartial_sortstable_sort排序

您可以創建但是性病的包裝::矢量

​​3210
+0

有一些boost容器可能有助於http://www.boost.org/doc/libs/1_51_0/doc/html/container/non_standard_containers.html – james82345 2013-03-23 02:27:00

+1

當你說「STL中不存在的功能」時,我假設你在談論一個分類插入算法? ...正如我在我的答案中指出的,有排序的容器... – Jason 2013-03-23 02:39:06

+0

@Jason是的,沒有爲std :: vector插入算法。 – james82345 2013-03-23 02:49:10