Здравствуйте Uk, Вы писали:
Uk>В своей программе создаю STL-вектор из указателей на структуру:
Uk>struct MyClass {
Uk> int x;
Uk>};
Uk>std::vector<MyClass *> m_vecMyClasses;
Uk>Возникла необходимость отсортировать m_vecMyClasses по значению х.
Uk>std::sort(m_vecMyClasses.begin(), m_vecMyClasses.end(), ...)
Uk>Похоже третьим параметром должна идти процедура сравнения, но как правильно описать ее прототип.
Uk>Или же требуется перегрузить оператор <. В моем варианте это представляется, как:
Uk>bool operator<(const MyStruct* & ms1, const MyStruct * & ms2))
Uk>{
Uk> return ms1.x < ms2.x;
Uk>}
Uk>Но это не компилится.
Uk>Или же в принципе правильнее все-таки создавать std::vector<MyClass> m_vecMyClasses, но тогда придется определять для MyClass конструктор по умолчанию и это уже будет не чистая структура.
Uk>Подскажите пожалуйста, в каком направлении двигаться?
По умолчанию для сравнения используется оператор < — но в вашем случае нужно определить объект функцию, либо функцию для сравнения указателей (т.к. в векторе лежат указатели на объекты)
Например так:
// вариант 1 - функция
bool MyClass_Greate(const MyClass* p1, const MyClass* p2)
{
return p1->x > p2->x;
}
// вариант 2 - объект функция
#include <functional>
class SMyClass_Greate : public binary_function<MyClass*,MyClass*,bool>
{
public:
bool operator()(const MyClass* p1, const MyClass* p2)
{
return p1->x > p2->x;
}
};
Здравствуйте _DEBUG, Вы писали:
D>Здравствуйте Uk, Вы писали:
Uk>>В своей программе создаю STL-вектор из указателей на структуру:
Uk>>struct MyClass {
Uk>> int x;
Uk>>};
Uk>>std::vector<MyClass *> m_vecMyClasses;
Uk>>Возникла необходимость отсортировать m_vecMyClasses по значению х.
Uk>>std::sort(m_vecMyClasses.begin(), m_vecMyClasses.end(), ...)
Uk>>Похоже третьим параметром должна идти процедура сравнения, но как правильно описать ее прототип.
Uk>>Или же требуется перегрузить оператор <. В моем варианте это представляется, как:
Uk>>bool operator<(const MyStruct* & ms1, const MyStruct * & ms2))
Uk>>{
Uk>> return ms1.x < ms2.x;
Uk>>}
Uk>>Но это не компилится.
Uk>>Или же в принципе правильнее все-таки создавать std::vector<MyClass> m_vecMyClasses, но тогда придется определять для MyClass конструктор по умолчанию и это уже будет не чистая структура.
Uk>>Подскажите пожалуйста, в каком направлении двигаться?
D>По умолчанию для сравнения используется оператор < — но в вашем случае нужно определить объект функцию, либо функцию для сравнения указателей (т.к. в векторе лежат указатели на объекты)
D>Например так:
D>D>// вариант 1 - функция
D>bool MyClass_Greate(const MyClass* p1, const MyClass* p2)
D>{
D> return p1->x > p2->x;
D>}
D>// вариант 2 - объект функция
D>#include <functional>
D>class SMyClass_Greate : public binary_function<MyClass*,MyClass*,bool>
D>{
D>public:
D> bool operator()(const MyClass* p1, const MyClass* p2)
D> {
D> return p1->x > p2->x;
D> }
D>};
D>
а зачем унаследоваться от binary_function ? Ведь можно создать обычный функтор типа
class MyFunctor
{
public:
bool operator()(const MyClass* p1, const MyClass* p2) const
{
return p1->x > p2->x;
}
}
и использовать метод что то типа sort<,> (,,MyFunctor());