我学会了多重映射是<key,value>
对,它允许重复键(与地图不同)。
帮我按键(自动发生)然后按 value (即名称)对多图表进行排序。
int main()
{
multimap<int,string>info; // <key,value>
char name[10000];
int age;
//Input till EOF
while (std::cin >> name >> age){
info.insert( pair<int,string>(age,name) );
}
//sorted output according to key i.e age
map<int,string> :: iterator i;
for(i=info.begin(); i !=info.end(); i++)
cout<<(*i).second<<endl;
}
输入:
DUCHESS 26
玛丽8
BERLIOZ 8
TOULOUSE 7
THOMAS 28
输出:
TOULOUSE 7
BERLIOZ 8
玛丽8
DUCHESS 26
THOMAS 28
这里的年龄(整数)是键,因此它首先按年龄排序,但如果两个或更多年龄与BERLIOZ和MARIE相同,则需要在MARIE之前打印BERLIOZ,因为 B按字母顺序优于M
答案 0 :(得分:2)
multimap
只对键进行排序,而不是值。
您可以通过多种方式解决问题。一种方法是返回使用map
,但存储set
而不是字符串。这样,您就可以对每个键中的键和字符串进行排序。
int main()
{
map<int,set<string>> info;
char name[10000];
int age;
//Input till EOF
while (std::cin >> name >> age) {
info[age].insert(name);
}
// sorted output
map<int,set<string>>::iterator i;
for (i = info.begin(); i != info.end(); ++i)
{
set<string>::iterator j;
for (j = i->second.begin(); j != i->second.end(); ++j)
cout << *j << i->first << endl;
}
}
使用set
的限制是set
中的值必须是唯一的,因此如果您有两个具有相同名称和年龄的人,则无法使用。如果这是一个问题,您可以更改为使用multiset
,或使用list
并在添加所有名称后使用std::sort
对列表进行排序。