Russian Qt Forum
Ноябрь 24, 2024, 02:49 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено] std::sort (predicate)  (Прочитано 5675 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Август 31, 2010, 12:07 »

Добрый день

Надо сортировать указатели, определять < для указателей стремно, поэтому решил прорваться через предикат. Фрагмент ниже работает
Код
C++ (Qt)
bool Comp( int * i1, int * i2 )
{
return *i1 > *i2;
}
 
/*
bool Comp( float * f1, float * f2 )
{
return *f1 > *f2;
}
*/

 
template <class T>
struct MyClass {
void SortData( void )
{
std::sort(mData.begin(), mData.end(), Comp);
}
 
std::vector <T> mData;
};
 
int main(int argc, char *argv[])
{
MyClass <int *> test;
test.SortData();
 
// MyClass <float *> test2;
// test2.SortData();
 
return 0;
}
 
Однако если создать еще 1 template класс (раскомментировать части выше) то отсыпает ошибку

Цитировать
error: no matching function for call to 'sort(__gnu_cxx::__normal_iterator<int**, std::vector<int*, std::allocator<int*> > >, __gnu_cxx::__normal_iterator<int**, std::vector<int*, std::allocator<int*> > >, <unknown type>)'

Ну и конечно int и float просто для примера. Как выкрутиться?

Спасибо

« Последнее редактирование: Август 31, 2010, 12:56 от Igors » Записан
Karl-Philipp
Гость
« Ответ #1 : Август 31, 2010, 12:20 »

подсказывали как-то мне здесь: как сортировать указатели на объекты с помощью функторов:

Код
C++ (Qt)
...
struct LessThen {
 bool operator ()(const Value* x, const Value* y) const {
   return *x < *y;
 }
};
 
sort(valuesVector.begin(), valuesVector.end(), LessThen());
...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Август 31, 2010, 12:29 »

подсказывали как-то мне здесь: как сортировать указатели на объекты с помощью функторов:
Это то же самое. Третий аргумент std::sort может быть чем угодно, абы умел сравнить 2 элемента. Типы для него не определены. Проблема в том что все это перестает работать для 2 и более вариантов template
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Август 31, 2010, 12:55 »

Ага, дошло  Улыбающийся  Надо дать тип чтобы он смог разобраться какую ф-цию вызывать. Так работает:
Код
C++ (Qt)
inline bool Comp( const int * i1, const int * i2 )
{
return *i1 < *i2;
}
 
 
inline bool Comp( const float * f1, const float * f2 )
{
return *f1 < *f2;
}
 
template <class T>
struct CompT {
bool operator() ( const T t1, const T t2 )
{
  return Comp(t1, t2);
}
};
 
template <class T>
struct MyClass {
void SortData( void )
{
std::sort(mData.begin(), mData.end(), CompT<T>());
}
 
std::vector <T> mData;
};
 
int main(int argc, char *argv[])
{
MyClass <int *> test;
test.SortData();
 
MyClass <float *> test2;
test2.SortData();
 
return 0;
}
 
« Последнее редактирование: Август 31, 2010, 12:57 от Igors » Записан
BRE
Гость
« Ответ #4 : Август 31, 2010, 12:59 »

Это то же самое. Третий аргумент std::sort может быть чем угодно, абы умел сравнить 2 элемента. Типы для него не определены. Проблема в том что все это перестает работать для 2 и более вариантов template
А как компилятор может определить какую из функций Comp ему использовать?
Код
C++ (Qt)
template <typename T>
bool Comp( T *v1, T *v2 )
{
       return *v1 > *v2;
}
 
template <typename T>
struct MyClass {
       void SortData( void )
       {
               std::sort(mData.begin(), mData.end(), Comp<T> );
       }
 
       std::vector <T*> mData;
};
 
 
int main( int, char ** )
{
       MyClass <int> test;
       test.SortData();
 
       MyClass <float> test2;
       test2.SortData();
 
       return 0;
}
 
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Август 31, 2010, 13:04 »

Код
C++ (Qt)
template <typename T>
bool Comp( T *v1, T *v2 )
{
       return *v1 > *v2;
}
 
Так пройдет для int и float, но не для др. структур требующих более сложного сравнения. Надо вызывать перекрытые ф-ции из Comp (который знает тип)
Записан
BRE
Гость
« Ответ #6 : Август 31, 2010, 13:18 »

Так пройдет для int и float, но не для др. структур требующих более сложного сравнения. Надо вызывать перекрытые ф-ции из Comp (который знает тип)
Код
C++ (Qt)
struct Type
{
   int val;
};
 
bool operator> ( const Type &t1, const Type &t2 )
{
   return t1.val > t2.val;
}
 
...
 
MyClass <Type> test3;
test3.SortData();
 
 
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Август 31, 2010, 13:28 »

То да, но я сортирую указатели, перекрывать для них > < мне кажется опасным
Записан
BRE
Гость
« Ответ #8 : Август 31, 2010, 13:33 »

То да, но я сортирую указатели, перекрывать для них > < мне кажется опасным
А где я перекрыл сравнение указателей?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.168 секунд. Запросов: 23.