Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка multiset 
:(
    Опции темы
m9yt
Дата 10.5.2010, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 27.2.2010

Репутация: нет
Всего: нет



Привет всем.
Мне необходимо отсортировать контейнер multimap по убыванию, в контейнере находятся объекты моего класса, в котором 2 поля.Сортировать нужно по 1-вому полю типа string.
При создании контейнера элементы благополучно сортируются по возрастанию( в классе перегружен оператор <).
Но вот что написано в методичке:
"некоторые алгоритмы могут не поддерживать используемые в вашей программе контейнеры. Например, алгоритм sort не поддерживает контейнеры, которые не имеют итераторов произвольного доступа. В этом случае следует написать свой алгоритм. Например, для стека алгоритм сортировки может выполняться следующим образом: переписать стек в вектор, отсортировать вектор, переписать вектор в стек.
При перемещении элементов ассоциативного контейнера в неассоциативный перемещаются только данные (ключи не перемещаются). И, наоборот, при перемещении элементов неассоциативного контейнера в ассоциативный должен быть сформирован ключ. 
Вопрос в том, как сформировать этот ключ?

Вот мои наработки:
Сама функция сортировки.
Вектор сортируется как надо, но при вставке в мультисет все записывается наоборот!
Код

class cmp{
public:
    bool operator()(country ob1, country ob2){
        return (ob1.get_name()>ob2.get_name());
    }
}; 

Код

void my_sort(multiset<country> & SET)
{
    vector<country> v;
    multiset<country>::iterator p;
    vector<country>::iterator d;
    p=SET.begin();
    for(p; p!=SET.end(); p++)
        v.push_back(*p);
    d=v.begin();
    sort(d, d=v.end(), cmp());
    d=v.begin();
    SET.clear();
    for(d; d!=v.end(); d++)
        SET.insert(*d);
}

PM MAIL   Вверх
bsa
Дата 11.5.2010, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 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
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0411 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.