2015-06-24 20 views
0

我需要設計一個基本上存儲鍵 - 值對的數據結構,鍵是一個整數,它的值是一個字符串。我怎樣才能以排序順序在一個multimap中打印一個鍵的值

條件1:可能存在多個與Key關聯的值。

條件2:我需要打印存儲在此地圖中的所有按鍵降序排列。條件3:雖然鍵(整數)按降序排列,但它們的對應值(字符串)必須按字典順序(按升序排列)打印。

樣品輸入:

78 Eve          
99 Bob          
78 Alice          

預期輸出:

99 Bob 
78 Alice 
78 Eve 

通知鍵是降序排列,而這些值按升序排列。

爲此,我已經提出了下面的代碼在C++:如下所示

#include <iostream> 
#include <map> 

using namespace std; 

int main() 
{ 
    int N; 
    string name; 
    int marks; 
    multimap<int, string, greater<int>> studMap; 
    multimap<int, string, greater<int>>::iterator itBeg, itEnd; 
    typedef multimap<int, string, greater<int>>::iterator mapIter; 

    cin >> N; // total no. of key-value pairs input by user 

    while (N--) 
    { 
     cin >> name >> marks; // pairs of value-key input by user - N times 
     studMap.insert(pair<int, string>(marks, name)); 
    } 

    for (itBeg = studMap.begin(); itBeg != studMap.end(); itBeg = itEnd) 
    { 
     marks = itBeg->first; 

     pair<mapIter, mapIter> keyRange = studMap.equal_range(marks); 

     for (itEnd = keyRange.first; itEnd != keyRange.second; ++itEnd) 
     { 
      cout << marks << " " << itEnd->second << endl; 
     } 
    } 
    return 0; 
} 

但是我正在輸出:

99 Bob 
78 Eve 
78 Alice 

而我需要對(78,愛麗絲)至(78,Eve)之前打印

+0

您需要支持按鍵查找,還是隻需要上述操作?此外,是否有任何時間限制你需要做到這一點的能力? – templatetypedef

+0

@templatetypedef我們確實需要通過關鍵字查找。它的效率越高,它就越好。 –

回答

2

我不會使用multimap。我會用map<int, set<string>>。原因是你需要對你的鍵和值進行排序。多圖只會對鍵進行排序。通過使用集合的映射,映射將按鍵進行排序,集合將按值排序(假設您給出了正確的比較器)。

+0

這可能是最簡單的,但具有自定義比較的多圖也可以做到這一點... – mark

+0

不,它不會。比較功能只是通過兩個鍵進行比較,而不是鍵和值。如果你建議比較查看值-ewww,那將是可怕的表現。或者取決於實現一個inifinite遞歸和stackdump。 –

+0

好吧,我建議的東西一頭髮更黑 - 我認爲...沿自定義比較的行可以訪問這兩個組件的數據本身。我確定在學習練習的範圍之外... – mark

1

如果您想通過鍵和值對鍵值對進行排序,那麼您不需要一個multimap,它不提供任何方式使用同一個鍵對值進行排序。您需要一組對,並使用自定義比較函數按照您想要的順序對它們進行排序。像這樣的東西(警告,代碼寫在我的頭頂,未經測試):

using KeyValue = std::pair<int, std::string>; 

struct CompareKeyValue { 
    bool operator()(const KeyValue& lhs, const KeyValue& rhs) const { 
     if (lhs.first != rhs.first) 
      return lhs.first > rhs.first; // Reverse order 
     else 
      return lhs.second < rhs.second; 
    } 
}; 

std::set<KeyValue, CompareKeyValue> my_data; 
+0

雖然不允許使用非唯一鍵......等等,爲什麼multimap不能使用自定義比較?比較需要指向包含兩個方面的東西都是... – mark

+0

它確實允許非唯一鍵。它不允許使用非唯一的鍵值對,但是如果您需要,可以使用multiset而不是一組。你不能給一個multimap一個比較關鍵字和值的比較,它不會編譯。 –

+0

對我來說更大的問題是,如果您需要檢查給定密鑰是否有任何值,則不能。您只能檢查給定對是否在數據結構中。 –

相關問題