如何在多映射中按排序顺序打印键的值

How can I print values of a key in sorted order in a multimap

本文关键字:打印 顺序 排序 映射      更新时间:2023-10-16

我需要设计一个数据结构,它基本上存储键值对,其中键是一个整数,其值是一个字符串。

条件1:可能有多个值与一个键关联。

条件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,Eve)之前打印对(78,Alice)

我不会使用多映射。我会用map<int, set<string>>。原因是您需要对键和值进行排序。多映射只会对键进行排序。通过使用集合映射,映射将按键排序,集合将按值排序(假设您给了它正确的比较器)。

如果您想按键和值对键值对进行排序,那么您就不需要多映射,因为它不提供任何对具有相同键的值进行排序的方法。您需要一组配对,并使用自定义比较函数按所需顺序对它们进行排序。类似这样的东西(警告,代码从我的头顶上写下来,没有测试):

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;