我有被存儲在std::multimap<int, S>
一個S類:基於類成員對同一個鍵的multimap元素進行排序?
class S{
int _secondKey{0};
int _thirdKey{0};
};
我想存儲相同關鍵的要素,基於排序的_secondKey
類構件上,然後_thirdKey
構件。
這可能在C++中完成嗎?我使用GCC 5.3
我有被存儲在std::multimap<int, S>
一個S類:基於類成員對同一個鍵的multimap元素進行排序?
class S{
int _secondKey{0};
int _thirdKey{0};
};
我想存儲相同關鍵的要素,基於排序的_secondKey
類構件上,然後_thirdKey
構件。
這可能在C++中完成嗎?我使用GCC 5.3
可能的解決方案是讓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>;
謝謝你,有趣!性能與multimap相比如何? – user997112
這是不可能的,但你可以創建另一個std::multimap
對象與鍵和值翻轉(使value_type
是key_type
),如果你需要的馬對於特定的操作,只是暫時排序。它很好地顯示here。
具體使用'multimap'?不可以。[帶有重複鍵的元素將以插入順序存儲](http://en.cppreference.com/w/cpp/container/multimap/insert)。 – BoBTFish
我開始寫一個基於std :: map>的實現,但是如果你想在你隱藏記錄時像創建一個空集,那麼你需要編寫一個自定義的getter和setter和iterator做一個新的鑰匙,以及類似的事情。 –