Russian Qt Forum

Программирование => С/C++ => Тема начата: Igors от Август 31, 2010, 12:07



Название: [Решено] std::sort (predicate)
Отправлено: Igors от Август 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 просто для примера. Как выкрутиться?

Спасибо



Название: Re: std::sort (predicate)
Отправлено: Karl-Philipp от Август 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());
...


Название: Re: std::sort (predicate)
Отправлено: Igors от Август 31, 2010, 12:29
подсказывали как-то мне здесь: как сортировать указатели на объекты с помощью функторов:
Это то же самое. Третий аргумент std::sort может быть чем угодно, абы умел сравнить 2 элемента. Типы для него не определены. Проблема в том что все это перестает работать для 2 и более вариантов template


Название: [Решено] std::sort (predicate)
Отправлено: Igors от Август 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;
}
 


Название: Re: std::sort (predicate)
Отправлено: BRE от Август 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;
}
 


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


Название: Re: std::sort (predicate)
Отправлено: BRE от Август 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();
 
 


Название: Re: [Решено] std::sort (predicate)
Отправлено: Igors от Август 31, 2010, 13:28
То да, но я сортирую указатели, перекрывать для них > < мне кажется опасным


Название: Re: [Решено] std::sort (predicate)
Отправлено: BRE от Август 31, 2010, 13:33
То да, но я сортирую указатели, перекрывать для них > < мне кажется опасным
А где я перекрыл сравнение указателей?