如何在多映射中按排序顺序打印键的值
How can I print values of a key in sorted order in a multimap
我需要设计一个数据结构,它基本上存储键值对,其中键是一个整数,其值是一个字符串。
条件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;
相关文章:
- 如何在C++中递归地按相反顺序打印集合
- 首先按给定顺序打印所有数字,然后使用 Array 打印所有字符和其他符号
- 按字母顺序打印存储在字符数组中的信息
- 视觉C++未按所需顺序打印
- C++使用相反的顺序打印带有逗号的列表
- C/C++ - 用于按顺序打印数字的 sem_t 类型的单个信号量
- 对象指针打印结果以相反的顺序进行
- 链表缺少节点并在打印时颠倒顺序
- 如何以相反顺序C 打印整数的单个数字
- 我不知道如何创建一个以数字/字母顺序打印出我的整数或字符串的程序
- 在 C Linux 中使用三个线程使用信号量同步按顺序打印 3 4 5 50 次
- 以相反的顺序打印链表的后半部分
- 我如何附加双链接以指向正确的节点,以相反的顺序打印
- 为什么在打印东西时没有保留顺序,先用cerr,然后用cout
- 按字母顺序打印结构输入C
- 按顺序打印时遇到问题,二叉树的后顺序等
- 打印所有可能的组合,包括重复,顺序也很重要
- 按特定顺序打印队列
- C++ 中的打印顺序
- 为什么这段代码的打印顺序不像我预期的那样工作?