2014-01-19 196 views
0

建議任何方法爲key及其值排序multimap。例如 - 輸入- (5,1),(1,9),(1,1),(5,2),(1,2) 並且輸出必須爲- (1,1), (1,2),(1,9),(5,1),(5,2)。如何在multimap中對key和value進行排序?

+0

具有相同密鑰的值的順序是插入順序。這是不可能改變的。 –

+4

將實體複製到'std :: multiset >'。 – WhozCraig

+0

'std :: map >'可能是另一種選擇。 'std :: set'插入了排序的元素,並且可以爲更復雜的元素定義比較。 – radix

回答

1

如果你真的想使用multimap,那麼值的排序總是你插入它們的順序,不能改變,不幸的是,例如在他們被存儲爲(1,9),( 1,1),(1,2),(5,1),(5,2)

如果您可以在multimap上放鬆一下,那麼您可以使用set並將上述對存儲在set中並在對定義中定義你想要的順序。因爲集合按照排序順序存儲值,所以它還會按照您定義的順序存儲對。

+2

這是不正確的 - 插入到multimap中的元素按所使用的鍵排序。插入元素的順序不影響它們的存儲順序。 – millinon

+0

我的意思是說,在一個multimap中,這些對按照它們的鍵的順序存儲,但是根據它們的值沒有正確的排序(在(鍵,值)對中的值),例如在給出的例子中它們被存儲爲(1,9),(1,1),(1,2),(5,1),(5,2)的問題。我想你誤解了我的回答 – user3203860

0

更改密鑰以包含兩個值。設計一個比較器,以正確的順序比較兩對值。

完成此操作後,您可以使用multiset而不是multimap。

1

你只需要它的所有元素複製到multiset<pair<int, int>>

multimap<int, int> a; 
a.insert(pair<int, int>(5, 1)); 
a.insert(pair<int, int>(1, 9)); 
a.insert(pair<int, int>(1, 1)); 
a.insert(pair<int, int>(5, 2)); 
a.insert(pair<int, int>(1, 2)); 

multiset<pair<int, int>> b; 
for (multimap<int, int>::iterator i=a.begin(); i!=a.end(); i++) 
    b.insert(pair<int, int>((*i).first, (*i).second)); 

在此之後,multiset<pair<int, int>> b是你想要的,即{(1,1), (1,2), (1,9), (5,1), (5,2)}

1

答案是emplace_hint。僞代碼將如下所示: -

insert_with_hint(M mmap, K key, V Value) 
{ 
    auto i1 = mmap.equal_range(Key); 
    for (auto i2 = i1.first; i2 != i1.second; ++i2) 
    { 
    if (i2->second > Key) { // <-- Here add your sorting criteria 
      mmap.emplace_hint(i2,Key,Value) 
     return 
    } 
    } 
    mmap.emplace(Key,Value) 
} 
+0

應該是被接受的答案。在創建'std :: multimap'時,我仍然不介意添加額外工作的情況下幫助了我。允許通過key和'equal_range()'(因此'std :: set'或'std :: multiset'不是替代選項)進行訪問,而對運行時的值進行更有效的比較。必須切換到g ++ 4.8(即使使用「std = C++ 11」,4.7也不提供emplace()和emplace_hint()。 – radix

相關問題