2010-09-02 23 views
5

我正在尋找一個容器,以包含像Employee這樣的對象(帶有info:name,salary,phone ....) 可以按名稱排序(a..z)和其他時間按工資排序。 做什麼是最好的方法? 我想到了地圖,但後來我只定義了1個鍵通過 去將不勝感激每一個想法(沒有太先進了,請!)在C++中有超過1個排序方法的STL容器

---更新---

我其實並不需要總是保持2個STL容器,我通常會有1個(說按照姓氏排序的員工),並且根據請求,我不介意創建一個新的STL容器,並將所有元素再次推送到此容器,只有這次才能進行排序通過工資,所以我可以通過該訂單打印它。是否有可能創建map1與名稱排序和map2薪水排序?如果願意的話可以進一步解釋\定義這兩張地圖的例子。我已經使用這個版本的std很小的C++知識(第一個任務我得到)

回答

17

::排序

template <class RandomAccessIterator, class Compare> 
void sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp); 

你可以排序的任何字段(S)你想,提供自己的比較。例如

struct CompareSalary 
{ 
    bool operator() (const Employee& a, const Employee& b) const 
    { 
    return a.salary < b.salary; 
    } 
} 

此外,由於性病::排序是所有容器提供隨機接取迭代器的std ::向量會做得很好兼容。

+0

我想你想'operator()'。 – 2010-09-02 13:16:04

+0

哎呀,你是對的。固定。 – stijn 2010-09-02 13:17:52

6

提供功能給std::sort

bool byName(Employee left, Employee right) { 
    return left.name < right.name; 
} 

std::vector<Employee> employees; 
std::sort(employees.begin(), employees.end(), byName); 
+0

@Ferruccio,其實不是這次。我傳遞了一個指向byName的指針,而不是調用byName。 – 2010-09-02 13:27:35

+0

我剛剛發現並刪除了我的評論。我在考慮byName作爲函數。 :-) – Ferruccio 2010-09-02 13:28:00

+0

@Philip:我會將'const&'添加到參數中,無需爲簡單比較而觸發複製構造函數。 – 2010-09-02 19:03:03

0

基本上你想定義多個比較器,每個執行以滿足不同的分類標準。菲利普波特的這篇文章給出了一個排序標準的例子。你可能想要定義更多像這樣的。

重載小於運算符將使您能夠將std :: sort方法僅與前兩個參數一起使用,但是您僅限於一個排序條件。

8

如果你想同時排序標準,可在同一時間,你也可以考慮Boost MultiIndex

PS:不過既然你提到你是新的C++我不建議使用Boost多指標。它很難理解它的語法

+1

(這是boost,不是stl,但是)除了添加/刪除條目(不包括需要的度假區),這個是訪問以不同方式排序的數據的最有效方式。它有一個「時髦」的聲明,但是在遵循這些文檔並且使用它時非常簡單。 – stefaanv 2010-09-02 13:37:50

0

你想讓它們在任何時候都被排序嗎?像std :: map一樣嗎? (所以你可以用*(coll.begin())訪問最低的元素?)如果是這樣,我要做的是有兩個std :: map,每個都是shared_ptr<T>的,每個都傳遞自己的排序函數,每個排序條件一個。通過這種方式,您不僅限於數據類型的單個「小於」運算符,還可以執行O(log n)插入和刪除(std :: map僅爲二叉樹),並且映射始終是排序的。

但是,您必須同步添加和刪除操作,以確保它們已從兩個地圖中添加和刪除。

+1

你基本上重塑了10%的boost :: multi_index_container ' – MSalters 2010-09-03 08:29:23