Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/140: Рейтинг темы: голосов - 140, средняя оценка - 4.54
9 / 9 / 9
Регистрация: 19.09.2011
Сообщений: 272
1

Сортировка map

08.11.2011, 16:20. Показов 27027. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здрасьте. Есть map (я с ним ещё плохо знаком)
C++
1
map <string, list<string> > data;
задача - отсортировать списки в нём (методом sort()).
если знаешь ключи - всё легко
C++
1
2
data[key1].sort();
data[key2].sort();
Вопрос - что делать, если не знаешь сколько ключей и какие они? Использовать for_each? но тогда как выделить контейнер списка из map'а, не зная его ключа?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.11.2011, 16:20
Ответы с готовыми решениями:

Сортировка в map
Как отсортировать в map не по ключу, а по значению для вывода.

Сортировка в map
Доброго времени суток. Имеется структура map: map&lt;string, size_t&gt; words; В ней содержится слово и...

Map контейнер сортировка
Добрый день. Собственно необходимо вывести отсортированный мап контейнер по числу гласных в слове....

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

16
277 / 150 / 25
Регистрация: 05.11.2011
Сообщений: 429
Записей в блоге: 1
08.11.2011, 16:22 2
IcyWind, Итератором. Не?
0
9 / 9 / 9
Регистрация: 19.09.2011
Сообщений: 272
08.11.2011, 16:26  [ТС] 3
Может быть
повторюсь, с map ещё не знаком.
было бы хорошо, если, скажем что-то типо
C++
1
map <string, list<string> > :: iterator p = data.begin()
указывал на первый список, тогда просто *p.sort
но, в map итератор указывает на пару элементов, верно?
поэтому и непонятно...мне бы организовать перебор списков в map, не трогая сами элементы в списках
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
08.11.2011, 16:27 4
map по умолчанию отсортирован. Не?
0
Заблокирован
08.11.2011, 16:29 5
Цитата Сообщение от diagon Посмотреть сообщение
map по умолчанию отсортирован. Не?
Только ключи. А можно отсортировать значения ключей.
0
9 / 9 / 9
Регистрация: 19.09.2011
Сообщений: 272
08.11.2011, 16:29  [ТС] 6
Цитата Сообщение от diagon Посмотреть сообщение
map по умолчанию отсортирован. Не?
Даже, если и да, мне нужно не map отсортировать, а списки в нём
вот так:
C++
1
2
data[key1].sort();
data[key2].sort();
проблема возникает тогда, когда я не знаю значения key1 и key2 и само кол-во ключей
0
Заблокирован
08.11.2011, 16:33 7
http://www.cplusplus.com/reference/stl/map/
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
08.11.2011, 16:37 8
Цитата Сообщение от IcyWind Посмотреть сообщение
Даже, если и да, мне нужно не map отсортировать, а списки в нём
Так как-то
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <map>
#include <list>
#include <string>
#include <algorithm>
 
typedef std::map< std::string, std::list< std::string > > map_t;
 
int main()
{
    map_t map;
    
    for ( map_t::iterator it = map.begin() ; it != map.end() ; ++it ) 
        it->second.sort();
}
Цитата Сообщение от IcyWind Посмотреть сообщение
проблема возникает тогда, когда я не знаю значения key1 и key2
А вот это я не понял.

P.S. по текущему стандарту можно так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <map>
#include <list>
#include <string>
#include <algorithm>
 
typedef std::map< std::string, std::list< std::string > > map_t;
 
int main()
{
    map_t map;
    
    for ( auto &it : map ) 
        it.second.sort();
}
0
Заблокирован
08.11.2011, 16:40 9
Цитата Сообщение от diagon Посмотреть сообщение
А вот это я не понял.
Он имеет ввиду, если он заранее не знает имена ключей, то как он сможет получить доступ к объектам.

Он не знает том, как можно пользоваться итераторами мапа
0
9 / 9 / 9
Регистрация: 19.09.2011
Сообщений: 272
08.11.2011, 16:43  [ТС] 10
Цитата Сообщение от diagon Посмотреть сообщение
Так как-то
А разве в вашем примере списки не будут сортироваться несколько раз?
например, есть ключи key1, в неём 2 элемента val1 и val2.
и тогда при изменении итератора it я сначала попаду в пару [key1;val1], тогда я отсортирую список map_t[key1], а потом попаду в пару [key1;val2] и опять же отсортирую список map_t[key1], не?
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
08.11.2011, 16:45 11
Цитата Сообщение от IcyWind Посмотреть сообщение
А разве в вашем примере списки не будут сортироваться несколько раз?
например, есть ключи key1, в неём 2 элемента val1 и val2.
и тогда при изменении итератора it я сначала попаду в пару [key1;val1], тогда я отсортирую список map_t[key1], а потом попаду в пару [key1;val2] и опять же отсортирую список map_t[key1], не?
Ммм... Что?
У одного ключа не может быть несколько значений.
Может у вас не map, а multimap?
0
9 / 9 / 9
Регистрация: 19.09.2011
Сообщений: 272
08.11.2011, 16:52  [ТС] 12
Тогда я не правильно понимаю, как работает итератор
Пример
C++
1
2
3
4
5
map <string, list<string> > data;
data["aa"].pushback('a');
data["aa"].pushback('b');
data["bb"].pushback('a');
data["cc"].pushback('c');
тогда (как я думал)
C++
1
2
3
4
5
map <string, list<string> > :: iterator p = data.begin //указывает на элемент a в списке aa
++p;//указывает на элемент b в списке aa. p->first = aa. а вот p->second?? неужели = data[aa]??
++p;//указывает на элемент a в списке bb
++p;// на с в списке cc
++p;// указывает на data.end();
поясните, если не так
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
08.11.2011, 16:54 13
Цитата Сообщение от IcyWind Посмотреть сообщение
map <string, list<string> > :: iterator p = data.begin //указывает на элемент a в списке aa
Указывает на список аа
Потом на список bb, потом на cc
0
Заблокирован
08.11.2011, 16:54 14
IcyWind, я ж вам давал ссылочку на материал. Там полная документация с примерами.
0
9 / 9 / 9
Регистрация: 19.09.2011
Сообщений: 272
08.11.2011, 16:56  [ТС] 15
Цитата Сообщение от Bers Посмотреть сообщение
IcyWind, я ж вам давал ссылочку на материал. Там полная документация с примерами.
успел только быстренько просмотреть...
щас получше изучу
0
Заблокирован
08.11.2011, 17:01 16
Цитата Сообщение от IcyWind Посмотреть сообщение
успел только быстренько просмотреть...
щас получше изучу
Если совсем вкратце, итератор мапа содержит два элемента. Первый элемент хранит имя ключа, а второй элемент хранит само значение элемента мапа.

Подробности читайте в документации.
0
9 / 9 / 9
Регистрация: 19.09.2011
Сообщений: 272
08.11.2011, 17:04  [ТС] 17
а......я просто не так понял принцип устройства самого map
думал, иттератор хранит пару "ключ" и "адрес в типе Т", а он хранит "ключ" и "сам тип Т"
Тогда сортировка будет
C++
1
2
3
4
for(map <string, list<string> > :: iterator p = data.begin(); p != data.end(); ++p)
{
        p->second.sort();
}
как вы и показывали....
0
08.11.2011, 17:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.11.2011, 17:04
Помогаю со студенческими работами здесь

Сортировка map по значению
Есть некий map: map&lt;string, int&gt; MyMap; Нужно вывести на экран всё содержимое контейнера в...

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

Сортировка std::map по значению
имеется вот такой вот тип: typedef struct { char domain; set&lt;uint32_t&gt; unique_ip;...

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru