Напечатайте повторяющиеся значения один раз в мультикарте - PullRequest
0 голосов
/ 31 октября 2019

У меня есть мультикарта, которая содержит using myMap= std::multimap <std::string, std::string>;

, вот пример данных, которые в нем.

West;Tuulensuu
West;Keskustori
South;Sammonaukio
West;Rautatieasema
West;Tulli
West;Sammonaukio
East;Sammonaukio

Я хотел бы напечатать только значения, но все значения должны быть напечатаны только один раз и должны быть отсортированы.

Я пробовал следующее.

void print_lines(myMap& tramlines)
{
    for (auto it = tramlines.begin(); it != tramlines.end(); ) {
        std::string key = it->second;

        std::cout << it->second << std::endl;

        // Advance to next non-duplicate entry.
        do {
            ++it;
        } while (it != tramlines.end() && key == it->second);
    }
}

Он по-прежнему печатал значения более одного раза. Поэтому я попробовал следующее.

auto uniq = std::unique(tramlines.begin(), tramlines.end());
tramlines.erase(uniq, tramlines.end());

for(auto item : tramlines)
{
    std::cout << item.second << std::endl;
}

Но это дает мне следующую ошибку

Severity    Code    Description Project File    Line    Suppression State
Error   C2679   binary '=': no operator found which takes a right-hand operand of type 'std::pair<const _Kty,_Ty>' (or there is no acceptable conversion)   Prog2Test

Какие у меня варианты здесь? Я не могу найти в Интернете ничего, что указывало бы на печать значений, я нашел много для ключей.

Будет ли итерация по значениям и добавление их для установки и печать их хорошей идеей?

1 Ответ

0 голосов
/ 01 ноября 2019

std::unique не работает, потому что map перебирает pair<const Tkey, Tvalue>. Он хочет перетасовать пары, но не может переписать часть const. Это не сработало бы в любом случае, потому что multimap значения только для данного ключа. unique работает только с полностью отсортированной коллекцией.

К счастью, нетрудно переместить все в набор.

std::set<std::string> unique;
std::transform(tramlines.begin(), tramlines.end(), std::inserter(unique, unique.end()), [](auto& p) { return p.second; });
...