Вы просто должны написать собственный компаратор. Здесь вы должны построить полный объект, потому что вы хотите сравнить ключи в соответствии с их значением в конкретной карте. Это должно соответствовать вашим требованиям:
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
. Правильный способ его использования - это создание одного нового экземпляра каждый раз, когда исходная карта могла измениться, или, по крайней мере, очистка и повторная загрузка.