如何使用指针实现c ++ priority_queue的排序方法

Pet*_*mit 9 c++ priority-queue

我的优先级队列声明为:

std::priority_queue<*MyClass> queue;

class MyClass {
    bool operator<( const MyClass* m ) const;
}
Run Code Online (Sandbox Code Playgroud)

没有排序队列中的项目.

怎么了?我不想实现不同的(比较)类.

答案摘要:

问题是,指针地址是排序的.避免这种情况的唯一方法是"比较指针"的类.

现在实现为:

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

class MyClass {
    struct CompStr {
        bool operator()(MyClass* m1, MyClass* m2);
    }
}
Run Code Online (Sandbox Code Playgroud)

Tim*_*imW 11

给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; 
Run Code Online (Sandbox Code Playgroud)

否则你可以使用简化版本:

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; 
Run Code Online (Sandbox Code Playgroud)


180*_*ION 5

由于您priority_queue仅包含指针值,因此它将使用指针的默认比较运算符 - 这将按地址对它们进行排序,这显然不是您想要的。如果您更改priority_queue为按值存储类实例,它将使用您定义的运算符。或者,您必须提供比较功能。