Распечатать ключи и значения std :: multimap в алфавитном порядке

Мне нужно распечатать std::multimap в алфавитном порядке, как имена авторов, так и их работы.

#include <string>
#include <map>

int main()
{
    std::multimap<std::string, std::string> authors = {{"Captain", "Nothing"}, {"ChajusSaib", "Foo"}, 
                                                        {"ChajusSaib", "Blah"}, {"Captain", "Everything"}, {"ChajusSaib", "Cat"}};

    for (const auto &b : authors)
    {
        std::cout << "Author:\t" << b.first << "\nBook:\t\t" << b.second << std::endl;
    }

    return 0;   
}

Это распечатывает имена авторов, но не их работы в алфавитном порядке, любая идея о том, как я мог бы напечатать их работы также в алфавитном порядке. Спасибо


person ChajusSaib    schedule 27.06.2015    source источник
comment
coliru.stacked-crooked.com/a/9b786a99a4f8778a   -  person 0x499602D2    schedule 27.06.2015


Ответы (2)


Храните работы в упорядоченном контейнере, например std::map<std::string, std::set<std::string>>.

Вы также должны учитывать влияние того, что произойдет, если ваша программа будет выполнять печать в алфавитном порядке для различных других языков. Как китайский. И ваша исходная программа, и мое решение предполагают, что operator< std :: string может выполнять нужный вам порядок, но это не гарантия для неанглийских языков.

person Puppy    schedule 27.06.2015

Как уже было предложено, просто используйте std::set в качестве сопоставленного типа:

std::multimap<std::string, std::set<std::string>> authors = {{"Captain", {"Nothing", "Everything"}},
                                                            {"ChajusSaib", {"Foo", "Blah", "Cat"}}};

for (auto const &auth : authors) {
    std::cout << "Author: " << auth.first << std::endl;
    std::cout << "Books:" << std::endl;
    for (auto const &book: auth.second)
        std::cout << "\t" << book << std::endl;
    std::cout << std::endl;
}

Демо

person Andreas DM    schedule 27.06.2015