Форум программистов, компьютерный форум CyberForum.ru

Сортировка map - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 41, средняя оценка - 4.80
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 268
08.11.2011, 16:20     Сортировка map #1
Здрасьте. Есть map (я с ним ещё плохо знаком)
C++
1
map <string, list<string> > data;
задача - отсортировать списки в нём (методом sort()).
если знаешь ключи - всё легко
C++
1
2
data[key1].sort();
data[key2].sort();
Вопрос - что делать, если не знаешь сколько ключей и какие они? Использовать for_each? но тогда как выделить контейнер списка из map'а, не зная его ключа?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.11.2011, 16:20     Сортировка map
Посмотрите здесь:

map C++
C++ Сортировка std::map по значению
Сортировка map по значению C++
C++ Как вставить map в map
Приведение map<int, B> к map<int, A> C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Xind
275 / 148 / 7
Регистрация: 05.11.2011
Сообщений: 425
Записей в блоге: 1
08.11.2011, 16:22     Сортировка map #2
IcyWind, Итератором. Не?
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 268
08.11.2011, 16:26  [ТС]     Сортировка map #3
Может быть
повторюсь, с map ещё не знаком.
было бы хорошо, если, скажем что-то типо
C++
1
map <string, list<string> > :: iterator p = data.begin()
указывал на первый список, тогда просто *p.sort
но, в map итератор указывает на пару элементов, верно?
поэтому и непонятно...мне бы организовать перебор списков в map, не трогая сами элементы в списках
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
08.11.2011, 16:27     Сортировка map #4
map по умолчанию отсортирован. Не?
Bers
Заблокирован
08.11.2011, 16:29     Сортировка map #5
Цитата Сообщение от diagon Посмотреть сообщение
map по умолчанию отсортирован. Не?
Только ключи. А можно отсортировать значения ключей.
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 268
08.11.2011, 16:29  [ТС]     Сортировка map #6
Цитата Сообщение от diagon Посмотреть сообщение
map по умолчанию отсортирован. Не?
Даже, если и да, мне нужно не map отсортировать, а списки в нём
вот так:
C++
1
2
data[key1].sort();
data[key2].sort();
проблема возникает тогда, когда я не знаю значения key1 и key2 и само кол-во ключей
Bers
Заблокирован
08.11.2011, 16:33     Сортировка map #7
http://www.cplusplus.com/reference/stl/map/
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
08.11.2011, 16:37     Сортировка map #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();
}
Bers
Заблокирован
08.11.2011, 16:40     Сортировка map #9
Цитата Сообщение от diagon Посмотреть сообщение
А вот это я не понял.
Он имеет ввиду, если он заранее не знает имена ключей, то как он сможет получить доступ к объектам.

Он не знает том, как можно пользоваться итераторами мапа
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 268
08.11.2011, 16:43  [ТС]     Сортировка map #10
Цитата Сообщение от diagon Посмотреть сообщение
Так как-то
А разве в вашем примере списки не будут сортироваться несколько раз?
например, есть ключи key1, в неём 2 элемента val1 и val2.
и тогда при изменении итератора it я сначала попаду в пару [key1;val1], тогда я отсортирую список map_t[key1], а потом попаду в пару [key1;val2] и опять же отсортирую список map_t[key1], не?
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
08.11.2011, 16:45     Сортировка map #11
Цитата Сообщение от IcyWind Посмотреть сообщение
А разве в вашем примере списки не будут сортироваться несколько раз?
например, есть ключи key1, в неём 2 элемента val1 и val2.
и тогда при изменении итератора it я сначала попаду в пару [key1;val1], тогда я отсортирую список map_t[key1], а потом попаду в пару [key1;val2] и опять же отсортирую список map_t[key1], не?
Ммм... Что?
У одного ключа не может быть несколько значений.
Может у вас не map, а multimap?
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 268
08.11.2011, 16:52  [ТС]     Сортировка map #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();
поясните, если не так
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
08.11.2011, 16:54     Сортировка map #13
Цитата Сообщение от IcyWind Посмотреть сообщение
map <string, list<string> > :: iterator p = data.begin //указывает на элемент a в списке aa
Указывает на список аа
Потом на список bb, потом на cc
Bers
Заблокирован
08.11.2011, 16:54     Сортировка map #14
IcyWind, я ж вам давал ссылочку на материал. Там полная документация с примерами.
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 268
08.11.2011, 16:56  [ТС]     Сортировка map #15
Цитата Сообщение от Bers Посмотреть сообщение
IcyWind, я ж вам давал ссылочку на материал. Там полная документация с примерами.
успел только быстренько просмотреть...
щас получше изучу
Bers
Заблокирован
08.11.2011, 17:01     Сортировка map #16
Цитата Сообщение от IcyWind Посмотреть сообщение
успел только быстренько просмотреть...
щас получше изучу
Если совсем вкратце, итератор мапа содержит два элемента. Первый элемент хранит имя ключа, а второй элемент хранит само значение элемента мапа.

Подробности читайте в документации.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.11.2011, 17:04     Сортировка map
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 268
08.11.2011, 17:04  [ТС]     Сортировка map #17
а......я просто не так понял принцип устройства самого map
думал, иттератор хранит пару "ключ" и "адрес в типе Т", а он хранит "ключ" и "сам тип Т"
Тогда сортировка будет
C++
1
2
3
4
for(map <string, list<string> > :: iterator p = data.begin(); p != data.end(); ++p)
{
        p->second.sort();
}
как вы и показывали....
Yandex
Объявления
08.11.2011, 17:04     Сортировка map
Ответ Создать тему
Опции темы

Текущее время: 08:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru