如何在多图中按排序顺序打印键的值
Posted
技术标签:
【中文标题】如何在多图中按排序顺序打印键的值【英文标题】:How can I print values of a key in sorted order in a multimap 【发布时间】:2015-06-24 21:16:22 【问题描述】:我需要设计一个数据结构,它基本上存储键值对,键是整数,值是字符串。
条件1:一个键可能有多个值。
条件2:我需要按降序打印这个map中存储的所有key。
条件3:虽然Keys(整数)以降序打印,但它们对应的值(字符串)必须以字典(升序)顺序打印。
示例输入:
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) 之前打印 pair(78, Alice)
【问题讨论】:
您需要支持按键查找,还是只支持上述操作?此外,您需要以多高的效率执行此操作是否有任何时间限制? @templatetypedef 我们确实需要按键查找..效率越高越好。 【参考方案1】:我不会使用多图。我会使用map<int, set<string>>
。原因是您需要对键和值进行排序。多图只会对键进行排序。通过使用集合映射,映射将按键排序,集合将按值排序(假设您为其提供了正确的比较器)。
【讨论】:
这可能是最简单的,但是带有自定义比较的多图也可以做到... 不,不会。比较函数只是传递两个键来比较,而不是键和值。如果您建议比较查找值-ewww,那将是可怕的表现。或者取决于实现一个无限递归和堆栈转储。 好吧,我想建议一些更骇人听闻的东西……按照自定义比较的思路,可以访问两个组件的数据本身。我确定超出了学习练习的范围...... @GabeSechan 我修改了我的代码以使用 map如果您想同时按键和值对键值对进行排序,那么您不需要多重映射,它不提供任何方法来对具有相同键的值进行排序。您需要一组配对,并具有自定义比较功能,可按您想要的顺序对它们进行排序。像这样的东西(警告,我脑子里写的代码,未经测试):
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;
【讨论】:
虽然不允许使用非唯一键...等等,为什么 multimap 不能与自定义比较一起使用?比较需要指向包含这两个方面的东西都是...... 它确实允许非唯一键。它不允许使用非唯一的键值对,但如果需要,只需使用多重集而不是集。你不能给多映射一个同时查看键和值的比较,它不会编译。 对我来说更大的问题是,如果您需要检查给定键是否有任何值,则不能。您只能检查给定对是否在数据结构中。以上是关于如何在多图中按排序顺序打印键的值的主要内容,如果未能解决你的问题,请参考以下文章