std::map
будет сортировать свои элементы по keys
. При сортировке он не заботится о values
.
Вы можете использовать std::vector<std::pair<K,V>>
затем отсортировать его с помощью std::sort
с последующим std::stable_sort
:
std::vector<std::pair<K,V>> items;
//fill items
//sort by value using std::sort
std::sort(items.begin(), items.end(), value_comparer);
//sort by key using std::stable_sort
std::stable_sort(items.begin(), items.end(), key_comparer);
Первый сорт должен использовать std::sort
, так как это nlog(n)
, а затем использовать std::stable_sort
, который находится в самом худшем случае n(log(n))^2
.
Обратите внимание, что в то время как std::sort
выбран по соображениям удобства, std::stable_sort
необходим для правильного заказа, так как вы хотите сохранить заказ по значению.
@gsf отметил в комментарии, вы могли бы использовать толькоstd::sort
, если вы выбираете компаратор, который сравнивает values
первый, и если они равны, сортировать keys
.
auto cmp = [](std::pair<K,V> const & a, std::pair<K,V> const & b)
{
return a.second != b.second? a.second < b.second : a.first < b.first;
};
std::sort(items.begin(), items.end(), cmp);
Это должно быть эффективным.
Но подождите, есть лучший подход: магазин std::pair<V,K>
вместо std::pair<K,V>
и тогда вам не нужно делать компаратор на всех — стандарт Comparer для std::pair
будет достаточно, так как он сравнивает first
(который V
) первый тогда second
который K
:
std::vector<std::pair<V,K>> items;
//...
std::sort(items.begin(), items.end());
это должно отлично работать.
Вы используете std :: map для хранения данных? – Raxvan
Поместите std :: pair s в список и отсортируйте его. –
Wilbert
@ Raxvan да, его сохранено на карте. –