Есть ли C ++ функция для сортировки карты? - PullRequest
1 голос
/ 14 февраля 2020

Я хочу знать, как я могу отсортировать ordered_map в C ++ на основе значений. Есть ли какая-нибудь функция для этого?

Ответы [ 5 ]

3 голосов
/ 14 февраля 2020

A map - ассоциативный контейнер . В отличие от последовательных контейнеров , где вы можете контролировать местоположение элемента, ассоциативный контейнер сам контролирует порядок элементов. Как только ассоциативный контейнер создан, порядок не может быть изменен.

В стандарте C ++ нет ordered_map. Существует std::map, которое является деревом (и, следовательно, элементы уже выглядят отсортированными на основе компаратора) и std::unordered_map, которое представляет собой таблицу ha sh (элементы несколько упорядочены на основе ха sh из ключ).

1 голос
/ 14 февраля 2020

Вы не можете реально изменить элементы std::map. Однако вы можете использовать std::vector, чтобы сначала скопировать элементы в векторе, а затем использовать std::sort(). Сортировать элементы по std::map.

#include<iostream>
#include <map>
#include <vector>
#include <algorithm>

typedef std::pair<std::string,int> pair;

int main()
{
    // input map
    std::map<std::string,int> map = {
        {"two", 2}, {"one", 1}, {"four", 4}, {"three", 3}
    };

    // create an empty vector of pairs
    std::vector<pair> vec;

    // copy key-value pairs from the map to the vector
    std::copy(map.begin(),
            map.end(),
            std::back_inserter<std::vector<pair>>(vec));

    // sort the vector by increasing order of its pair's second value
    // if second value are equal, order by the pair's first value
    std::sort(vec.begin(), vec.end(),
            [](const pair& l, const pair& r) {
                if (l.second != r.second)
                    return l.second < r.second;

                return l.first < r.first;
            });

    // print the vector
    for (auto const &pair: vec) {
        std::cout << '{' << pair.first << "," << pair.second << '}' << '\n';
    }

    return 0;
}
1 голос
/ 14 февраля 2020

Этот ответ охватывает случай, когда вы ссылаетесь на значения внутри самой карты.

Прежде всего, вам нужен контейнер std::map. В стандартной библиотеке нет ordered_map, только map или unordered_map.

Вы можете снабдить map собственным компаратором, чтобы он сортировал его так, как вам хочется. Например:

struct MyOrder
{
    constexpr bool operator()(MyType a, MyType b) const 
    {
        // return true, so that a < b accodring to your definition
    }
};

и используйте его как

std::map<MyType, MyOrder> myMap;
0 голосов
/ 14 февраля 2020

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

Для сортировки по значениям можно просто создать перевернутая карта :

template <typename T1, typename T2>
std::map<T2, T1> invert(const std::map<T1, T2> & m)
{
    std::map<T2, T1> ret;
    for (const auto& e : m)
        ret[e.second] = e.first;
    return ret;
}

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

0 голосов
/ 14 февраля 2020

Вы не можете переставить элементы (ordered_) map (/ set).

Вы можете скопировать значения (и / или ключи) в std::vector и std::sort, которые.

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