我需要设计一个基本上存储键值对的数据结构,键是一个整数,值是一个字符串。
条件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,Eve)之前打印对(78,Alice)
答案 0 :(得分:2)
我不会使用multimap。我使用map<int, set<string>>
。原因是您需要对键和值进行排序。多图只会对键进行排序。通过使用集合映射,映射将按键排序,集合将按值排序(假设您为其提供了正确的比较器)。
答案 1 :(得分:1)
如果要按键和值对键值对进行排序,则不需要多图,它不提供任何方法来对具有相同键的值进行排序。您需要一组对,使用自定义比较功能,按您想要的顺序对它们进行排序。这样的事情(警告,代码写在我的头顶,没有经过测试):
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;