Как отсортировать map по значению c

от admin

Sort a map by values in C++

This post will discuss how to sort a map by values in C++.

We know that the std::map container sorts its elements by keys by default and not by values. This post provides an overview of some of the available alternatives to accomplish this.

1. Using std::vector function

The idea is to convert the std::map into a std::vector of key-value pairs and sort that vector according to the increasing order of its pair’s second value.

Как отсортировать std::map по значению?

Как вывести содержимое контейнера, начиная с наибольшего значения? Сам контейнер дальше не используется.

Выполнить итерирование не от .begin() до .end() , а от .rbegin() до .rend() — словом, воспользоваться reverse_iterator .

Если пересортировка выполняется достаточно часто, то лучше использовать boost::multi_index_container с ordered_unique по std::string и ordered_non_unique по int .

Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.3.11.43304

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

std :: map, как отсортировать по значению, затем по ключу

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

Решение

std::map будет сортировать свои элементы по keys , Это не заботится о values при сортировке.


Ты можешь использовать std::vector<std::pair<K,V>> затем отсортировать его с помощью std::sort с последующим std::stable_sort :

Первый сорт должен использовать std::sort так как это nlog(n) , а затем использовать std::stable_sort который n(log(n))^2 в худшем случае.

Обратите внимание, что в то время как std::sort выбран по причине производительности, std::stable_sort необходим для правильного упорядочения, так как вы хотите, чтобы упорядочивался по значению.

@gsf отметил в комментарии, вы можете использовать только std::sort если вы выбираете компаратор, который сравнивает values во-первых, и если они равны, сортировать keys ,

Это должно быть эффективно.

Но подождите, есть лучший подход: магазин std::pair<V,K> вместо std::pair<K,V> и тогда вам вообще не нужен компаратор — стандартный компаратор для std::pair было бы достаточно, как это сравнивается first (который V ) будет первый second который K :

Это должно работать отлично.

Другие решения

Ты можешь использовать std::set вместо std::map ,

Вы можете хранить как ключ, так и значение в std::pair и тип контейнера будет выглядеть так:

std::set отсортирует значения как по оригинальным ключам, так и по значениям, которые были сохранены в std::map ,

std::map уже сортирует значения, используя предикат, который вы определили или std::less если вы не предоставите один. std::set также будет хранить элементы в порядке определенного компаратора. Однако ни сет, ни карта не позволяют иметь несколько ключей. Я бы предложил определить std::map<int,std::set<string> если вы хотите сделать это, используя только свою структуру данных. Вы также должны понимать, что std::less для строки будет сортировать лексикографически не по алфавиту.

Читать:
Данные которые вы отправляете не защищены

РЕДАКТИРОВАТЬ: два других ответа имеют смысл. Я предполагаю, что вы хотите упорядочить их в какую-то другую структуру или распечатать.

«Лучший» может означать множество разных вещей. Вы имеете в виду «самый простой», «самый быстрый», «самый эффективный», «наименьший код», «самый читаемый»?

Наиболее очевидный подход состоит в том, чтобы пройти через два раза. На первом проходе упорядочите значения:

Затем на втором проходе, алфавитные слова, но только если их значения совпадают.

Строго говоря, это «пузырьковая сортировка», которая медленная, потому что каждый раз, когда вы делаете своп, вы должны начинать все сначала. Один «проход» заканчивается, когда вы проходите весь список без каких-либо перестановок.

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

How to Sort a Map by Value in C++

In this article we will discuss how to sort a map by value in both ascending and descending order.

A Map store the elements in the sorted order of keys.

For example, we have a map of words and its frequency count as key – value pair i.e.

Now lets insert following elements in to this map,

Map internally stores the above elements in sorted order of keys i.e.

Therefore, iterating over a map will give pair elements in above order. Now what if want to display items of a map in sorted order of keys. For example for above map we want to display the items in descending order of frequency count i.e.

Read More:

For that we need to sort the entries in map by value.

Sorting a Map by Ascending Order of Value

Map contains pairs of key & value. Where first field of std::pair represents the key and second field represents the value.

Therefore, we can sort the pairs by keeping them in a set and using a comparison logic that compares them with their second field instead of first one.

In the below example we will use a comparator as lambda function that compares the 2 pais using teir second field i.e.

We will create a set of pair that will use the above lambda function as compare function and keep the added pairs in sorted order of second field of std::pair.

Then we will copy the elements from map to set and it will store them in sorted order of values.

Похожие статьи