Re[2]: Как отсортировать std::vector<MyClass *>
От: slonnik  
Дата: 28.05.02 05:58
Оценка:
Здравствуйте _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());
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.