1

我了解到多重映射是<key,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;
}

输入:

公爵夫人 26
玛丽 8
柏辽兹 8
图卢兹 7
托马斯 28

输出:
图卢兹 7
柏辽兹 8
玛丽 8
公爵夫人 26
托马斯 28

这里年龄(整数)是键,所以它首先按年龄排序,但如果两个或更多年龄与 BERLIOZ 和 MARIE 中的相同,则希望在 MARIE 之前打印 BERLIOZ,因为B 在字母顺序上优于 M

4

1 回答 1

2

Amultimap仅对键进行排序,而不对值进行排序。

有多种方法可以解决问题。一种方法是返回使用 a map,但存储 aset而不是字符串。这样,您就可以对每个集合中的键和字符串进行排序。

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;
    }
}

使用 a 的限制是 aset中的值set必须是唯一的,因此如果您有两个具有相同姓名和年龄的人,它将不起作用。如果这是一个问题,您可以更改为使用 a multiset,或使用 a并在将所有名称添加到list列表后使用它对列表进行排序。std::sort

于 2013-08-01T19:57:56.630 回答