Как реализовать метод сортировки для очереди приоритетов c++ с указателями

моя приоритетная очередь объявлена как:

std::priority_queue<*MyClass> queue;

class MyClass {
    bool operator<( const MyClass* m ) const;
}

не сортирует элементы в очереди.

что не так? Я не хотел бы реализовывать другой (Compare) класс.

ответ резюме:

проблема в том, что адреса указателя сортируются. Единственный способ избежать этого-класс, который "сравнивает указатели".

сейчас реализовано так:

std::priority_queue<*MyClass, vector<*MyClass>, MyClass::CompStr > queue;

class MyClass {
    struct CompStr {
        bool operator()(MyClass* m1, MyClass* m2);
    }
}

4 ответов


дайте que функцию сравнения ptr_less.

Если вы хотите, чтобы ptr_less был совместим с остальной частью библиотеки std (связыватели, композиторы,... ):

template<class T>
struct ptr_less
    : public binary_function<T, T, bool> {  
        bool operator()(const T& left, const T& right) const{
            return ((*left) <( *right));
        }
};

std::priority_queue<MyClass*, vector<MyClass*>, ptr_less<MyClass*> > que; 

в противном случае вы можете уйти с упрощенной версии:

struct ptr_less {
    template<class T>
    bool operator()(const T& left, const T& right) const {
        return ((*left) <( *right));
    }
};

std::priority_queue<MyClass*, vector<MyClass*>, ptr_less > que; 

предоставленный вами оператор

все это основано на некоторых предположениях - пожалуйста, разместите свой фактический код, используя копирование и вставку.


поскольку priority_queue содержит только значения указателей, он будет использовать оператор сравнения по умолчанию для указателей - это будет сортировать их по адресу, который, очевидно, не то, что вы хотите. Если вы измените priority_queue чтобы сохранить экземпляры класса по значению, он будет использовать определенный вами оператор. Или, вам придется предоставить функцию сравнения.


не уверен в материале очереди приоритетов, потому что я никогда не использовал его, но для прямой сортировки вы можете сделать это:

class A
{
    friend struct ComparePtrToA;
public:
    A( int v=0 ):a(v){}
private:
    int a;
};

struct ComparePtrToA
{
    bool operator()(A* a1, A* a2) {return a1->a < a2->a;}
};

#include <vector>
#include <algorithm>
int _tmain(int argc, _TCHAR* argv[])
{
    vector<A*> someAs;
    someAs.push_back(new A(1));
    someAs.push_back(new A(3));
    someAs.push_back(new A(2));
    sort( someAs.begin(), someAs.end(), ComparePtrToA() );
}

обратите внимание на утечки памяти, это только пример...

дальнейшее Примечание: это не предназначено для реализации очереди приоритетов! Вектор-это просто пример использования функтора я создал для сравнения двух объектов через их указатели. Хотя я знаю, что такое приоритетная очередь и примерно как она работает, я никогда не использовал Функции STL, которые их реализуют.

Update: я думаю, TimW делает некоторые действительные моменты. Я не знаю, почему он был так подавлен. Я думаю, что мой ответ можно улучшить следующим образом:

class A
{
public:
    A( int v=0 ):a(v){}
    bool operator<( const A& rhs ) { return a < rhs.a; }
private:
    int a;
};

struct ComparePtrToA
{
    bool operator()(A* a1, A* a2) {return *a1 < *a2;}
};

что чище (особенно если вы считаете, что у вас есть контейнер значений, а не указатели - дальнейшая работа не потребуется).