Сортировка карты STL в c ++ по значению - PullRequest
0 голосов
/ 03 мая 2020

У меня есть следующая карта:

map<int, int> mp;
mp[11] = 5;
mp[3] = 7;
mp[1] = 3;

Если я итерирую по карте, как:

for(auto it: mp) {
    cout<<it.first<<" "<<it.second<<'\n';
}

, то результат будет:

1 3
3 7
11 5

Но я хочу, чтобы какой ключ имел большее значение, этот ключ появится первым. Пример вывода для случая:

3 7
11 5
1 3

Как я могу это сделать?

Ответы [ 3 ]

1 голос
/ 03 мая 2020

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

    map<int, int> mp;
    mp[11] = 5;
    mp[3] = 7;
    mp[1] = 3;
    std::multimap<int, int> mulp;
    std::transform(mp.begin(), mp.end(), std::inserter(mulp, mulp.begin()),
        [](const std::pair<int, int> &p){
            return std::make_pair(p.second, p.first);
        });
    for(auto it = mulp.rbegin(); it != mulp.rend(); ++it) {
        cout<<it->second<<" "<<it->first<<'\n';
    }

0 голосов
/ 03 мая 2020

Вы выбрали неправильный контейнер для своих требований, так как std::map выполняет сортировку только по ключам.

Поэтому вы можете переключиться на использование std::vector<std::pair<int, int>>, например:

#include <iostream>
#include <vector>

int main() {
    std::vector<std::pair<int, int>> v;
    v.emplace_back(11, 5);
    v.emplace_back(3, 7);
    v.emplace_back(1, 3);

    std::sort(
        std::begin(v), std::end(v),
        [](auto&& lhs, auto&& rhs) {
            return lhs.second > rhs.second;
        }
    );

    for (auto const& i : v) {
        std::cout << i.first << " " << i.second << std::endl;
    }
}

, и результат будет:

3 7
11 5
1 3
0 голосов
/ 03 мая 2020

Вы не можете по определению. Карта - это структура данных, которая сортирует свой элемент по ключу.

...