Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/58: Рейтинг темы: голосов - 58, средняя оценка - 4.64
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446

Сортировка map по значению int в порядке убывания и частично по ключу char :)

07.03.2015, 08:16. Показов 12144. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Помогите, пожалуйста, отсортировать std::map <char, int> a.

Например, у меня есть такие элементы:

5['a']
5['b']
3['f']
8['k']
5['m']
8['w']
1['z']


Нужно получить следущее:

8['k']
8['w']
5['a']
5['b']
5['m']
3['f']
1['z']


Т. е. сначала map сортируется по значению int в порядке убывания, а затем в алфавитном порядке сортируются ключи char, которые имеют одинаковое int-значение.

P.S. Возможно, что ключи-char сортировать не придётся, если их не задеть во время сортировки равных int-значений.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.03.2015, 08:16
Ответы с готовыми решениями:

Сортировка map по ключу и значению
Всем привет. Я создаю map и добавляю туда элементы: map&lt;int,string&gt; m; m=&quot;a&quot;; m=&quot;c&quot;; m=&quot;b&quot;; И как мне его отсортировать по...

Map с поиском как по ключу, так и по значению
Реализовано ли подобное в stl? (или в boost, например) И как в теории выглядит эта реализация? Предполагаю, что это два сбалансированных...

Сортировка Map по ключу
Всем привет! Сортирую Map по ключу через List -&gt; Sort -&gt; Comparator Почему для 'e1.getKey()' не доступен метод 'compareTo()'? ...

35
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
07.03.2015, 08:40
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
P.S. Возможно, что ключи-char сортировать не придётся, если их не задеть во время сортировки равных int-значений.
map автоматически сортироует элементы по ключу. Свободно переставлять их Вы не можете.

Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Т. е. сначала map сортируется по значению int в порядке убывания
тогда int должен быть ключом, а элементы с одинаковыми ключами перестаивать в зависимости от значения char. Естественно, заменить map на multimap
1
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
07.03.2015, 08:41
Перекинуть в вектор и отсортировать стабильной сортировкой по убыванию значений.
1
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
07.03.2015, 09:12  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
Перекинуть в вектор и отсортировать стабильной сортировкой по убыванию значений.
Выберу этот вариант.
Вы имели в виду в pair?
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
07.03.2015, 09:30
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Вы имели в виду в pair?
Вектор пар. Ключ сортировки по убыванию — pair.second.
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
07.03.2015, 09:37  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
Ключ сортировки
Да мне до сих пор не перекинуть map в pair никак. А вы уже ключ сортировки...
C++
1
2
3
4
5
std::map<char, int> a;
std::pair<int, char> b;
 
for (auto i : a)
    b.push_back(std::make_pair(i.second, i.first));     // как правильно записать эту строчку на C++?
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
07.03.2015, 09:42
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
C++
1
std::pair<int, char> b;
У pair нет метода push_back.

Добавлено через 2 минуты
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
C++
1
2
for (auto i : a)
* * b.push_back(std::make_pair(i.second, i.first)); * * // как правильно записать эту строчку на C++?
У вектора есть конструктор, принимающий два итератора.
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
07.03.2015, 09:43  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
У pair нет метода push_back.
Я знаю, что нет. Я хочу узнать, чем заменить push_back.
Или вот так нормально будет?
C++
1
2
3
 
for (auto i : a)
    b = std::make_pair(i.second, i.first);
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
07.03.2015, 09:49
Зачем менять местами ключ и значение?
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
07.03.2015, 09:55  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
Зачем менять местами ключ и значение?
А какая разница (конечно, если только для сортировки)? Ведь в pair нет такого понятия " key и value" - там только first и second.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
07.03.2015, 09:57
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
А какая разница (если только для сортировки)?
Профит от обращения пары мне непонятен, зато в коде появляется лишний цикл.
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
07.03.2015, 10:10  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
Профит от обращения пары мне непонятен, зато в коде появляется лишний цикл.
Профит - сортировка.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
07.03.2015, 10:16
Ок, допустим. Реквестирую окончательный вариант кода.
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
07.03.2015, 10:53  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
Реквестирую окончательный вариант кода.
Так как правильно скопировать map в pair?
C++
1
2
for (auto i : a)
        b = std::make_pair(i.second, i.first);
Надеюсь, что вы поможете ускорить реквест хотя бы небольшими кусочками кода.

Не по теме:

Я не хочу обсуждать целый месяц сортировку map'а. :)

0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
07.03.2015, 11:04
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Т. е. сначала map сортируется по значению int в порядке убывания, а затем в алфавитном порядке сортируются ключи char, которые имеют одинаковое int-значение.
Используйте set и перегрузку operator<.
C++
1
2
3
4
5
6
7
8
struct my_value
{
   my_value(int i,char c):int_v(i),char_v(c){}
   bool operator<(const my_value&value)const{return int_v>value.int_v||(int_v==value.int_v&&char_v<value.char_v);}
   int int_v;
   char char_v;
};
std::set<my_value>a;
2
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
07.03.2015, 11:25  [ТС]
Renji, спасибо. Но мне хотелось бы попробовать реализовать с помощью pair.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
07.03.2015, 11:33
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Так как правильно скопировать map в pair?
Такие формулировки провоцируют на придирки к словам.
map — контейнер из множества пар. Невозможно скопировать множество объектов в один такого же типа.
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
C++
1
2
for (auto i : a)
* * * * b = std::make_pair(i.second, i.first);
Ок, создал пару с нужным порядком элементов. Теперь нужно добавить ее в вектор.
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
07.03.2015, 11:40  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
Такие формулировки провоцируют на придирки к словам.
Так не придирайтесь. Я ещё не изучал C++ вообще, только ANSI C, поэтому могу давать неточные формулировки.
Цитата Сообщение от 0x10 Посмотреть сообщение
Теперь нужно добавить ее в вектор.
Т. е. мне нужно скопировать map в vector<pair<int, char>>?
1
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
07.03.2015, 11:45
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Т. е. мне нужно скопировать map в vector<pair<int, char>>?
Да, об этом я сказал дважды (посты 3 и 5). Построение одной коллекции по другой реализуется алгоритмом std::transform.
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
07.03.2015, 12:05  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
Построение одной коллекции по другой реализуется алгоритмом std::transform.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <map>
#include <cstdio>
#include <cctype>
#include <vector>
#include <utility>
#include <iostream>
#include <algorithm>
 
std::map<char, int> a;
std::vector<std::pair<int, char>> b;
 
int main(void) {
    
    int c;
    unsigned long long sum = 0;
    while ((c = getchar()) != EOF)
        if (isalpha(c)) {
            ++a[tolower(c)];
            ++sum;
        }
    
    std::transform(...);    // ну и что мне написать вместо трёх точек :)
    
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.03.2015, 12:05
Помогаю со студенческими работами здесь

MyDictionary: сортировка по ключу, поиск значения по ключу, поиск ключа по значению
Задан интерфейс ІMyDictionary. Его реализует класс MyDictionary, который позволяет определить коллекцию пар &quot;ключ-значение&quot;. ...

Сортировка словаря по ЗНАЧЕНИЮ(не по ключу)
Собственно, как это сделать? Вот мой код: import sys from pprint import pprint #iter_count = int(sys.argv) # Помещаем дзен из...

Как использовать std::map<char,int> в C++/CLI
как использовать std::map&lt;char,int&gt; в С++/CLI при объявление в классе пишит член класса управляемый не может относиться к типу...

Сортировка map по значению
Здорова господа!!! Есть массив: map&lt;string, int&gt; m; m=3; m=2; m=10; Нужно найти максимальный элемент массива? Пытаюсь...

Сортировка map по значению
Добрый день:) Как можно отсортировать map по возрастанию/убыванию float(неважно ключ это или значение) Программа- частотный анализ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru