![]() |
|
Модераторы: bsa |
![]()
|
|
| m9yt |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 173 Регистрация: 27.2.2010 Репутация: нет Всего: нет |
Привет всем.
Мне необходимо отсортировать контейнер multimap по убыванию, в контейнере находятся объекты моего класса, в котором 2 поля.Сортировать нужно по 1-вому полю типа string. При создании контейнера элементы благополучно сортируются по возрастанию( в классе перегружен оператор <). Но вот что написано в методичке: "некоторые алгоритмы могут не поддерживать используемые в вашей программе контейнеры. Например, алгоритм sort не поддерживает контейнеры, которые не имеют итераторов произвольного доступа. В этом случае следует написать свой алгоритм. Например, для стека алгоритм сортировки может выполняться следующим образом: переписать стек в вектор, отсортировать вектор, переписать вектор в стек. При перемещении элементов ассоциативного контейнера в неассоциативный перемещаются только данные (ключи не перемещаются). И, наоборот, при перемещении элементов неассоциативного контейнера в ассоциативный должен быть сформирован ключ. Вопрос в том, как сформировать этот ключ? Вот мои наработки: Сама функция сортировки. Вектор сортируется как надо, но при вставке в мультисет все записывается наоборот!
|
||||
|
|||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
m9yt, весь смысл подобных контейнеров в том, что данные в них хранятся в упорядоченном виде. Это касается и unordered_map/set, только там порядок определяет не ключ, а его хэш. Именно поэтому sort не применима к ним, так как не имеет смысла. Если нужен обратный порядок, используй reverse_iterator (rbegin(), rend())...
Чтобы данные хранились по убыванию, просто укажи параметром шаблона свою функцию сравнения. По умолчанию, используется стандартный алгоритм std::less(x,y), который возвращает результат операции (x<y). Т.е. достаточно вместо std::less указать std::greater, как ты получишь искомый результат: typedef std::multiset<country, std::greater<counter> > CountryMultiset; Если же тебе необходимо просто изредка сортировать, то тогда нужно копировать в обратном порядке в вектор: std::copy(obl.rbegin(), obl.rend(), std::back_inserter(obl_vec)); Это сообщение отредактировал(а) bsa - 11.5.2010, 00:56 |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |