运算符重载对象指针的priority_queue

时间:2016-11-24 21:13:39

标签: c++ operator-overloading priority-queue

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

    int value;

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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;

答案 1 :(得分:0)

订单与广告订单无关,但与内存中的地址无关。

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

&integer1 < &integer5 < &integer3

此处不考虑MyInteger的比较运算符。