Сортировка карты пары и двойной - PullRequest
0 голосов
/ 28 июня 2018

У меня есть карта как: map< pair < int , int > , long double> valore. Где пара представляет мою систему координат и удваивает значение в (i, j) координатах.

Теперь я должен отсортировать эту карту от меньшего к большему двойнику (очевидно, координаты должны быть связаны с соответствующим двойником). Кто-нибудь может мне помочь?

Ответы [ 3 ]

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

Как уже упоминали другие, невозможно напрямую отсортировать карту по значениям. Один из способов сортировки карты по значениям заключается в следующем.

  • Создание вектора с элементами карты в паре. то есть pair<Value, Key>. В вашем случае это будет vector< pair<double, pair<int, int> > >
  • Сортируйте вектор (используя пользовательскую функцию сортировки), теперь ваши элементы отсортированы по значениям.

См. Следующий пример. (скомпилировано с опцией -std=c++11)

#include <bits/stdc++.h>
using namespace std;

/* custom compare function. ascending order. Compares first elemens of p1 & p2 */
static bool custom_compare(const pair< double, pair<int, int> > & p1, const pair<double, pair<int, int> > & p2) {
        return p1.first < p2.first;
}

void sortfn(map<pair<int, int>, double>& m) {

        /* vector if pairs to hold values. */
        vector< pair<double, pair<int, int> > > vec;

        /* traverse the map and populate the vector */
        for (auto it = m.begin(); it != m.end(); it++) {
                vec.push_back(make_pair(it->second, it->first));
        }

        /* call sort method on the vector with custom compare method */
        sort(vec.begin(), vec.end(), custom_compare);

        for (auto it = vec.begin(); it != vec.end(); it++) {
                cout<<it->first<<" ( "<<it->second.first<<", "<<it->second.second<<" )"<<endl;

        }
}
int main() {

        map<pair<int, int>, double> m;

        m.insert(make_pair(make_pair(0, 0), 5));
        m.insert(make_pair(make_pair(1, 1), 0));
        m.insert(make_pair(make_pair(2, 2), 10));

        sortfn(m);



        return 0;
}

выход

0 ( 1, 1 )
5 ( 0, 0 )
10 ( 2, 2 )
0 голосов
/ 28 июня 2018

Поскольку приведенная ниже карта содержит первый аргумент в виде пары целых чисел и второй аргумент в виде двойного, сортировка по первому аргументу (паре целых чисел) невозможна.

 map< pair < int , int > , long double> valore

Для сортировки на основе координат необходимо написать пользовательскую функцию.

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

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

class Comparator {
    std::map<std::pair<int, int>, double>& orig_map;

public:
    Comparator(std::map<std::pair<int, int>, double>& orig_map)
    : orig_map(orig_map) {}

    bool operator () (const std::pair<int, int>& first,
            const std::pair<int, int>& second) const {
        return orig_map[first] < orig_map[second];
    }
};

Вы можете использовать его для создания специально заказанной карты из исходной карты:

std::map< pair < int , int > , long double> valore;
// load the map valore ...

// build a copy of valore sorted according to its value
Comparator comp(map);
std::map<std::pair<int, int>, double, Comparator> val_sorted(valore.begin(),
    valore.end(), comp);

Вы можете выполнить итерацию val_sorted, она отсортирована по значениям

Осторожно: никогда не вставляйте в val_sorted и элемент, который не существует в valore. Правильный способ его использования - это создание одного нового экземпляра каждый раз, когда исходная карта могла измениться, или, по крайней мере, очистка и повторная загрузка.

...