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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> критерий сортировки для stl::set 
:(
    Опции темы
shuttle
Дата 9.9.2009, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



вот тип критерия сортировки
Код

template <class T>
class RuntimeCmp
{
public:
    enum cmp_mode {normal, reverse};    
private:
    cmp_mode mode;
public:
    RuntimeCmp(cmp_mode m=reverse):mode(m){}

    bool operator()(const T& t1, const T& t2) const
    {
        return (mode==normal)? t1<t2:t2<t1;
    }

    bool operator==(const RuntimeCmp& rc)
    {
        return return mode==rc.mode;
    }
};


определяю тип множетсва, по умолчанию normal - сортировка по возрастанию.
Код

typedef multiset<int, RuntimeCmp<int>> IntSet;

Куда надо здесь записать reverse что бы была сортировка по убыванию
--------------------
PM MAIL   Вверх
andrew_121
Дата 9.9.2009, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



Цитата(shuttle @  9.9.2009,  12:38 Найти цитируемый пост)
Куда надо здесь записать reverse что бы была сортировка по убыванию 

При инстанцировании.
Код

#include <set>
#include <iostream>

template <class T>
class RuntimeCmp
{
public:
    enum cmp_mode {normal, reverse};    
private:
    cmp_mode mode;
public:
    RuntimeCmp(cmp_mode m=reverse):mode(m){}
    bool operator()(const T& t1, const T& t2) const {
        return (mode==normal)? t1<t2:t2<t1;
    }
    bool operator==(const RuntimeCmp& rc) {
        return return mode==rc.mode;
    }
};

typedef std::multiset<int, RuntimeCmp<int> > IntSet;

int main(int, const char**) {

    IntSet set1;
    for ( int idx = 0; idx < 128; idx++ ) {
        set1.insert(idx);
    }
    
    IntSet set2(RuntimeCmp<IntSet::value_type>::normal);
    for ( int idx = 0; idx < 128; idx++ ) {
        set2.insert(idx);
    }
    
    return 0;
}


по умолчанию reverse


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
azesmcar
Дата 9.9.2009, 14:43 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



shuttle

А почему не так?
Код

template <class T> struct normal {
    bool operator()(const T& t1, const T& t2) const { return t1 < t2; }
};
template <class T> struct reverse {
    bool operator()(const T& t1, const T& t2) const { return t2 < t1; }
};

std::set<int, normal<int> > t;

или так
Код


template <class T, bool REV> struct compare {};

template <class T> struct compare<T, false> {
    bool operator()(const T& t1, const T& t2) const { return t1 < t2; }
};

template <class T> struct compare<T, true> {
    bool operator()(const T& t1, const T& t2) const { return t2 < t1; }
};

std::set<int, compare<int, false> > t; // normal
std::set<int, compare<int, true> > t; // reverse

а вообще..зачем это надо? чем std::less не нравится? используй reverse_iterator если нужно читать в обратном порядке и дело с концом.

Это сообщение отредактировал(а) azesmcar - 9.9.2009, 14:44
PM   Вверх
shuttle
Дата 9.9.2009, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Немного ошибся

Код

RuntimeCmp(cmp_mode m=reverse):mode(m){}


тут по умочанию сортировка по убыванию. Сам в конструкторе изменил normal на reverse
--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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