Сортировать std :: unordered_map> по значениям - PullRequest
0 голосов
/ 09 июня 2018

У меня есть std::unordered_map<std::string, std::atomic<unsigned int>>.

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

Но как нельзя скопировать std::atomic<unsigned int>, какое решение наиболее эффективно?

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Другое решение состоит в том, чтобы скопировать unordered_map в multimap со значениями, являющимися ключами, а затем распечатать его:

#include <iostream>
#include <string>
#include <map>
#include <unordered_map>
#include <atomic>
#include <algorithm>
#include <iterator>

int main()
{
    std::unordered_map<std::string, std::atomic<unsigned int>> m;
    for (auto p : std::initializer_list<std::pair<std::string, unsigned int>>{{ "a", 32},{ "b" , 22 },{ "c" , 32 },{ "d" , 22 },{ "e" , 55 } })
        m.emplace(p);

    std::multimap<unsigned int, std::string> printmap;

    std::transform(m.begin(), m.end(), std::inserter(printmap, printmap.end()),
        [](auto const &p) { return std::make_pair(p.second.load(), p.first); });

    for (auto const &p : printmap)
        std::cout << p.first << " - " << p.second << std::endl;

    return 0;
}

Демо: https://ideone.com/MgtMY8

22 - d
22 - b
32 - c
32 - a
55 - e
0 голосов
/ 09 июня 2018

Копирование ваших данных в вектор будет работать, но вам нужно будет предоставить пользовательскую операцию, которая вызывает load() на вашем atomic<unsigned>, чтобы сделать его простым unsigned.Так как вы все равно вынуждены это сделать, вы также можете изменить порядок терминов в паре:

std::vector<pair<unsigned int,std::string>> copy;
std::transform(
    m.begin()
,   m.end()
,   back_inserter(copy)
,   [](const pair<const std::string, std::atomic<unsigned int>>& p) {
        return make_pair(p.second.load(), p.first);
    }
);

Теперь, когда значение является первым, вызов std::sort больше не требует специального компаратора:

std::sort(copy.begin(), copy.end());

Демо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...