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

ここでは年齢 (整数) がキーであるため、年齢に関して最初にソートされますが、2 つ以上の年齢が BERLIOZ と MARIE のように同じである場合、B はアルファベット順で M よりも優れているため、BERLIOZ を MARIE の前に出力することが望まれます。

4

1 に答える 1

2

Amultimapは、値ではなくキーのみをソートします。

ソリューションにアプローチする方法はいくつかあります。1 つの方法は、 の使用に戻ることですが、文字列ではなく を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;
    }
}

a を使用する際の制限は、aset内の値setが一意でなければならないことです。そのため、名前と年齢が同じ 2 人がいる場合は機能しません。それが問題になる場合は、 を使用するように変更するmultisetか、を使用して、すべての名前が追加されたらlistを使用してリストを並べ替えます。std::sort

于 2013-08-01T19:57:56.630 に答える