Как отсортировать std::vector<MyClass *>
От: Uk  
Дата: 27.05.02 19:16
Оценка:
В своей программе создаю STL-вектор из указателей на структуру:
struct MyClass {
int x;
};
std::vector<MyClass *> m_vecMyClasses;

Возникла необходимость отсортировать m_vecMyClasses по значению х.
std::sort(m_vecMyClasses.begin(), m_vecMyClasses.end(), ...)
Похоже третьим параметром должна идти процедура сравнения, но как правильно описать ее прототип.
Или же требуется перегрузить оператор <. В моем варианте это представляется, как:
bool operator<(const MyStruct* & ms1, const MyStruct * & ms2))
{
return ms1.x < ms2.x;
}
Но это не компилится.
Или же в принципе правильнее все-таки создавать std::vector<MyClass> m_vecMyClasses, но тогда придется определять для MyClass конструктор по умолчанию и это уже будет не чистая структура.
Подскажите пожалуйста, в каком направлении двигаться?
Re: Как отсортировать std::vector<MyClass *>
От: _DEBUG Беларусь  
Дата: 27.05.02 21:52
Оценка: 10 (1)
Здравствуйте 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;
    }
};
\n Give me MSDN and I'll show you the world
Re: Как отсортировать std::vector<MyClass *>
От: Dima2  
Дата: 28.05.02 03:47
Оценка:
Здравствуйте Uk, Вы писали:

Uk>Подскажите пожалуйста, в каком направлении двигаться?


Пролистай назад, я похожее спрашивал на прошлой неделе, и найдеш еще кое что интересное.
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...
Пока на собственное сообщение не было ответов, его можно удалить.