2017-03-09 45 views
0

我有被存儲在std::multimap<int, S>一個S類:基於類成員對同一個鍵的multimap元素進行排序?

class S{ 
    int _secondKey{0}; 
    int _thirdKey{0}; 
}; 

我想存儲相同關鍵的要素,基於排序的_secondKey類構件上,然後_thirdKey構件。

這可能在C++中完成嗎?我使用GCC 5.3

+0

具體使用'multimap'?不可以。[帶有重複鍵的元素將以插入順序存儲](http://en.cppreference.com/w/cpp/container/multimap/insert)。 – BoBTFish

+0

我開始寫一個基於std :: map >的實現,但是如果你想在你隱藏記錄時像創建一個空集,那麼你需要編寫一個自定義的getter和setter和iterator做一個新的鑰匙,以及類似的事情。 –

回答

1

可能的解決方案是讓std::map<int,std::vector<S>>而不是std::multimap<int, S>和排序,因爲你需要時插入:

S newvalue = ...; 
auto &v = mymap[ newvalue._secondKey ]; 
auto it = std::lower_bound(v.begin(), v.end(), newvalue, thirdKeyCmp); 
v.insert(it, newvalue); 

或者乾脆使用std::set<S>與排序由第二和第三鍵自定義比較:

bool cmpS(const S &s1, const S &s2) { 
    return std::tie(s1._secondKey, s1._thirdKey) < std::tie(s2._secondKey, s2._thirdKey); 
} 

using myset = std::set<S,cmpS>; 
+0

謝謝你,有趣!性能與multimap相比如何? – user997112

0

這是不可能的,但你可以創建另一個std::multimap對象與鍵和值翻轉(使value_typekey_type),如果你需要的馬對於特定的操作,只是暫時排序。它很好地顯示here

相關問題