2012-05-24 54 views
2

請幫我按值計數排序multimap。按count計數排序multimap

例如,

multimap<char,int> mymultimap; 

mymultimap.insert (pair<char,int>('a',100)); 
mymultimap.insert (pair<char,int>('a',101)); 
mymultimap.insert (pair<char,int>('a',111)); 
mymultimap.insert (pair<char,int>('b',200)); 
mymultimap.insert (pair<char,int>('b',211)); 
mymultimap.insert (pair<char,int>('c',300)); 

應該按以下順序排序後:

c 
b 
a 

我嘗試使用自定義比較是這樣的:

struct comparer 
{ 
    bool operator() (const char& first, const char& second) const 
    { 
     return mymultimap.count(first) < mymultimap.count(second); 
    } 
}; 

但我can` t定義

multimap<char, int, comparer> mymultimap; 

在定義struct comparer之前。

+1

爲什麼不交換密鑰和值?如果你想要基於值索引一個集合,並且你的密鑰在任何情況下都不是唯一的,那麼這似乎是合乎邏輯的。 –

+0

爲什麼要在定義比較之前定義你的多圖? – leftaroundabout

+0

@ Component10鍵和值無關緊要,我想根據每個元素中元素的數量對multimap進行排序。 – Kos

回答

5

這是不可能的。

除非您繼續並創建自定義結構,否則您似乎需要一個結構來跟蹤所有項目(對在這裏),以及一個實際統計它們。

實際選擇主要取決於排序操作是一次性計算還是實際需要同時維護兩者。

如果它是一次性計算,那麼只需要在需要時對其進行計數。

如果您需要維護此訂單,那麼我建議您閱讀Boost.MultiIndex並將其作爲開發自定義類的基礎。

1

這是不可能的。比較器有兩個限制,即比較時,它們總是比較一致。例如:如果'a'小於'b',則必須始終爲真。

在你的比較器中,你違反了這條規則,因爲向multimap添加更多'a'或'b'可能突然導致比較結果發生變化。

multimap使用比較器來組織如何將其元素存儲在內存中。如果兩個元素可以用一種方式進行比較,然後突然以不同的方式進行比較,則multimap中元素的整個組織將不得不改變。如果僅插入一個新元素,multimap不會重新排列其所有現有內容,因爲這樣做效率很低。