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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.