Как отсортировать std::map по значению?
Как вывести содержимое контейнера, начиная с наибольшего значения? Сам контейнер дальше не используется.
Отслеживать
задан 25 июн 2017 в 19:50
337 5 5 серебряных знаков 16 16 бронзовых знаков
Что такое в данном случае «значение»?
26 июн 2017 в 1:15
У контейнера есть ключ, а есть значение.
26 июн 2017 в 12:06
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
map MyMap; MyMap["3"] = 30; MyMap["1"] = 10; MyMap["2"] = 20; MyMap["4"] = 0; for (pair pair : MyMap) < cout cout reverseMyMap; for (pair pair : MyMap) < reverseMyMap[pair.second] = pair.first; >cout ::reverse_iterator it = reverseMyMap.rbegin(); while (it != reverseMyMap.rend()) < cout first << ": " second
1: 10 2: 20 3: 30 4: 0 Reverse: 30: 3 20: 2 10: 1 0: 4
Отслеживать
ответ дан 25 июн 2017 в 21:14
76.9k 6 6 золотых знаков 56 56 серебряных знаков 123 123 бронзовых знака
Плохо, потому, что значения могут совпадать: <<"1", 1>, >
25 июн 2017 в 21:21
ну тогда просто стоит заменить map , на multimap , делов то
25 июн 2017 в 21:41
В целом так и сделал
25 июн 2017 в 23:07
Выполнить итерирование не от .begin() до .end() , а от .rbegin() до .rend() - словом, воспользоваться reverse_iterator .
Отслеживать
ответ дан 25 июн 2017 в 19:55
219k 15 15 золотых знаков 119 119 серебряных знаков 230 230 бронзовых знаков
Нужно отсортировать по ЗНАЧЕНИЮ! А не по ключу.
25 июн 2017 в 20:07
Тогда используйте другой контейнер, в который поместите указатели (чтоб сэкономить память) на элементы вашего map , отсортируйте его соответствующим образом и выводите. Непосредственно пересортировать map , да еще сделав из него multimap , способа не имеется.
25 июн 2017 в 20:12
Если пересортировка выполняется достаточно часто, то лучше использовать boost::multi_index_container с ordered_unique по std::string и ordered_non_unique по int .
Отслеживать
ответ дан 9 авг 2017 в 5:33
111 2 2 бронзовых знака
- c++
- c++11
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.9.3159
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Как отсортировать map по значению c
Как отсортировать std::map не по ключу, а по значению
че то у меня не получается по-человечески это сделать
map
map
counter.insert( make_pair("one",700) );
counter.insert( make_pair("two",12) );
counter.insert( make_pair("three",123) );
counter.insert( make_pair("four",5) );
// сортируем по значению (long)
// по убыванию 🙂
for ( it1 = counter.begin(); it1 != counter.end(); ++it1 )
cout << it1->first << ": " << it1->second << endl;<>
Сообщ. #2 , 23.08.05, 20:06
Unregistered
Ассоциативные контейнеры не сортируются в принципе.
Чтобы отсортировать, надо либо засунуть все в map или скопировать в vector и отсортировать его.
Сообщ. #3 , 23.08.05, 20:16
Рейтинг (т): 1
ну я в map
но я думал, что можно исходный контейнер отсортировать
а то как-то "некрасиво" получается с копированием в др. контейнер
Добавлено 23.08.05, 20:18
как хотя бы сделать, чтоб по убыванию
Сообщ. #4 , 23.08.05, 21:03
Рейтинг (т): -7
softsnap
в map'е информация хранится по ключу, и как ты предлагаешь обращаться по ключу, если там будет в неизвестно каком виде всё "отсортированно".
если нужна сортировка, как тебе уже сказали, юзай vector >
Как отсортировать map по значению?
Нужно отсортировать меп, подскажить как это сделать найболее удобным образом. Ибо гугл подсказывает очень заумные вещи или очень простые, может обитатели тостера поделяться золотой срединой (наработаными хаками).
- Вопрос задан более трёх лет назад
- 1586 просмотров
Комментировать
Решения вопроса 1
Вопрос не имеет смысла, так как map хранит сортированно по ключу (возможен кастомный компаратор) и не позволяет менять этот порядок. Так что по значению - никак. Доставайте оттуда пары, да сортируйте. Какая задача вообще решается?
Ответ написан более трёх лет назад
Нравится 2 1 комментарий

Валерий Демидов @Fraideron Автор вопроса
Алгоритм Хафмана реализовывал, потом понял, что просто list можно использовать. Спасибо за ответ.
Как отсортировать map по значению c
Здравствуйте Акул, Вы писали:
А>Доброго времени суток!
А>простенький вопрос, каким образом отсортировать map по значению? (по float-у)
Никаким. map — контейнер, отсортированный по значению ключа.
Алексей Кирдин
Re[2]: как сортировать map по значению
| От: | Акул | www.kyrs.ru |
| Дата: | 28.05.02 13:01 | |
| Оценка: |
Здравствуйте Kaa, Вы писали:
Kaa>Здравствуйте Акул, Вы писали:
А>>Доброго времени суток!
А>>простенький вопрос, каким образом отсортировать map по значению? (по float-у)
Kaa>Никаким. map — контейнер, отсортированный по значению ключа.
а существует контейнер, который отсортирован по значению?
Re[3]: как сортировать map по значению
| От: | Bell |
| Дата: | 28.05.02 13:06 |
| Оценка: |
Здравствуйте Акул, Вы писали:
А>а существует контейнер, который отсортирован по значению?
std::set
Варианты:
Нужные значения из map добавляешь в новый set, в результате получаешь отсортированные значения.
Можно все это запихать в vector, и потом применить к нему алгоритм std::sort
Любите книгу — источник знаний (с) М.Горький
Re[4]: как сортировать map по значению
| От: | Акул | www.kyrs.ru |
| Дата: | 28.05.02 13:12 | |
| Оценка: |
Здравствуйте Bell, Вы писали:
B>Здравствуйте Акул, Вы писали:
А>>а существует контейнер, который отсортирован по значению?
B>std::set
B>Варианты:
B>Нужные значения из map добавляешь в новый set, в результате получаешь отсортированные значения.
B>Можно все это запихать в vector, и потом применить к нему алгоритм std::sort
но это уже будет не map.
Re[5]: как сортировать map по значению
| От: | Kaa | http://blog.meta.ua/users/kaa/ |
| Дата: | 28.05.02 13:22 | |
| Оценка: |
Здравствуйте Акул, Вы писали:
А>но это уже будет не map.
Ты лучше объясни, что тебе надо сделать. Все это, я считаю, от неправильного понимания задачи.
Если что-то упорядочено, то оно упорядочено по ключу. Если тебе нужен порядок по значению ключа, значит, надо пересортировать контейнер, в котором ключем теперь является бывшее значение, а то, что было ключем, стало значением.
Если тебе одновременно надо 2 отношения порядка на одних и тех же данных, тогда можно создать объект-дескриптор (читай умный указатель с подсчетом ссылок), который будет на самом деле владеть данными, а в контейнерах сохранять его копии, и для каждого из 2-х контейнеров указать свой способ сортировки.
При этом:
Данные будут храниться 1 раз, а в контейнерах будет дублироваться указатель на эти данные.
В каждом из контейнеров будет свой порядок (в одном ключем будет твой первоначальный ключ, в другом — твое первоначатльное значение)
Так зачем тебе нужна двойная сортировка?
Алексей Кирдин
Re[6]: как сортировать map по значению
| От: | Акул | www.kyrs.ru |
| Дата: | 29.05.02 05:12 | |
| Оценка: |
Здравствуйте Kaa, Вы писали:
Kaa>Здравствуйте Акул, Вы писали:
А>>но это уже будет не map.
Kaa>Ты лучше объясни, что тебе надо сделать. Все это, я считаю, от неправильного понимания задачи.
Kaa>Если что-то упорядочено, то оно упорядочено по ключу. Если тебе нужен порядок по значению ключа, значит, надо пересортировать контейнер, в котором ключем теперь является бывшее значение, а то, что было ключем, стало значением.
Kaa>Если тебе одновременно надо 2 отношения порядка на одних и тех же данных, тогда можно создать объект-дескриптор (читай умный указатель с подсчетом ссылок), который будет на самом деле владеть данными, а в контейнерах сохранять его копии, и для каждого из 2-х контейнеров указать свой способ сортировки.
Kaa>При этом:
Kaa>Данные будут храниться 1 раз, а в контейнерах будет дублироваться указатель на эти данные.
Kaa>В каждом из контейнеров будет свой порядок (в одном ключем будет твой первоначальный ключ, в другом — твое первоначатльное значение)
Kaa>Так зачем тебе нужна двойная сортировка?
Двойная сортировка не нужна, я возможно map не по его прямому назначению использую. Задача простая: есть набор GUID-дов (ключ) со своими значениями, нада найти GUID с максимальным значением, обработать это значение и удалить из map, взять следующий GUID с максимальным значением и т.д.
Задача легко решается из без map, но с ним удобней данные по GUID-дам собирать.