对象指针 priority_queue 上的运算符重载

Operator overloading on priority_queue of object pointers

class MyInteger
{
public:
    MyInteger() { }
    MyInteger(int val) { value = val }

    int value;

    bool operator<(const MyInteger* target) const
    {
        return value < target->value;
    }

以上是 MyInteger class 的示例,其中 < 运算符已重载。我正在使用 MyInteger*priority_queue,但它似乎无法识别重载运算符,这导致元素永远不会被排序。

std::priority_queue<MyInteger*> myInts;

MyInteger integer1 = MyInteger(1);
MyInteger integer5 = MyInteger(5);
MyInteger integer3 = MyInteger(3);

myInts.push(&integer1);
myInts.push(&integer5);
myInts.push(&integer3);

// result is same order they went in

是否可以对对象指针使用运算符重载?这是否意味着我必须创建自己的仿函数才能使用?

顺序与插入顺序无关,与内存中的地址有关。

这是因为比较运算符应用于元素的地址,例如

&integer1 < &integer5 < &integer3

这里不考虑MyInteger的比较运算符

正如 Olaf Dietsche 所提到的,当您存储指针时,对象地址用于排序,因此在大多数情况下,容器中的顺序将等于创建顺序。

您最好将对象存储在容器中。然后它的比较运算符将用于排序:

class MyInteger
{
public:
    MyInteger() { }
    MyInteger(int val) { value = val }
    MyInteger( const MyInteger& val ) : value( val.value ) {}

    int value;

    bool operator<(const MyInteger& target) const
    {
        return value < target.value;
    }

};

...

std::priority_queue<MyInteger> myInts;

MyInteger integer1 = MyInteger(1);
MyInteger integer5 = MyInteger(5);
MyInteger integer3 = MyInteger(3);

myInts.push(integer1);
myInts.push(integer5);
myInts.push(integer3);

然后对象将被正确排序(使用 operator<)。

万一 integer1integer2integer3myInts 之前被销毁(因为这个存储副本),它会更安全。

如果您确实需要保存指针,那么您必须将自定义比较器传递给容器。参见 declaring a priority_queue in c++ with a custom comparator

这应该有效:

class CompareMyIntegerPtr
{
public:
    bool operator() (MyInteger* left, MyInteger* right)
    {
        return left->value < right->value;
    }
};

...

std::priority_queue<MyInteger*, std::vector<MyInteger*>, CompareMyIntegerPtr> myInts;