Как отсортировать std::map<> по ключу?
Должно быть всегда отсортированно и так. map — бинарное дерево.
#2
14:39, 24 ноя 2003
for ( std::mapcmpchar_t, mystruct_t>::iterator i= structmap.begin( ); //как много слов. Лучше пользоваться typedef i!= structmap.end( ); ++i; ) < std::cout i->first ' ' i->second std::endl; >
map будет выведен в порядке возрастания i->first (ну, если оператор
#3
15:54, 24 ноя 2003
Семен
_Winnie
Ой, точно отсортированным получается. Правда, кто его просит сортировать-то?
Разве бинарное дерево не может быть неотсортированным? Т. е. в этом случае мне как раз
так и нужно, а если нужно получать элементы в том порядке, в каком они были вставлены?
#4
15:57, 24 ноя 2003
У него в свойствах прописан поиск за логарифмическое время. Потому и должен.
#5
16:02, 24 ноя 2003
Джо
>[i]а если нужно получать элементы в том порядке, в каком они были вставлены[/i]
Для этого можно использовать реализацию hash_map. Найти ее можно, например в STLport.
#6
17:29, 24 ноя 2003
Как отсортировать карту?
.
кто его просит сортировать-то?
User
в 7.1 есть
#7
22:53, 24 ноя 2003
Блин. вот невезуха. когда преподу написал прогу с использованием STL он на меня на орал. он сам выше чистого C не знает.
#8
16:13, 25 ноя 2003
Во дает. А по поводу чего орал? А шаблоны запрещал использовать? Правда, если у вас практикум по С, а не по С++, то справедливо орал.
#9
16:13, 25 ноя 2003
doig-u
Да, смешно, особенно если я не предполагал, что оно должно сортироваться автоматом из-за,
как сказал Семён
>У него в свойствах прописан поиск за логарифмическое время.
Так что можешь ржать и дальше 🙂
stalkerg
Препод — наверное из команды «Старых пердунов-консерваторов».
Всем за помощь спасибо.
Как отсортировать 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-дам собирать.
Map в C++: что это и как с этим работать

В данном уроке мы разберем еще один часто используемый контейнер STL — map.
Что такое map
Это ассоциативный контейнер, который работает по принципу — [ключ — значение]. Он схож по своему применению с вектором и массивом, но есть некоторые различия:
-
Ключом может быть все что угодно. От обычной переменной до класса.
mp1[0] = 7; // ключ - число mp2["zero"] = 4; // ключ - строка pair int, int> p = make_pair(1, 3); mp3[p] = 3; // ключ - пара

Мы можем создать ключ из любых компонентов и он будет — рабочим.
Поэтому можно с легкостью сделать словарь:
- Ключом в нашем случае будет — русское слово.
- А значением — английское.
map string, string> mp; mp["привет"] = "hi";
Добавление, удаление, обращение к элементам происходит за log n. n — в нашем случае размер контейнера.
Как создать map
Сперва понадобится подключить соответствующую библиотеку:
#include
Чтобы создать map нужно воспользоваться данной конструкцией:
map L>, R> > имя>;
- — этот тип данных будет относиться к значению ключа.
- — этот тип данных соответственно относится к значению.
map string, int> mp; // пример
- Ключ — строка.
- Значение — число.
При создании map все его элементы будут иметь значение нуля.
Такж