简体   繁体   English

运算符重载对象指针的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;
    }

Above is an example MyInteger class with the < operator overloaded. 上面是示例MyInteger类,其中<运算符已重载。 I am using a priority_queue of MyInteger* but it doesn't seem to recognize the overloaded operator, which results in the elements never being ordered. 我使用的是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

Is it possible to use operator overloading for object pointers? 是否可以对对象指针使用运算符重载? Does it mean I will have to create my own functor to be used instead? 这是否意味着我必须创建自己的仿函数才能使用?

As mentioned by Olaf Dietsche, as you store pointers, the objet adresses are used for sorting, so in most case, order in the container will be equal to order of creation. 正如Olaf Dietsche所提到的,在存储指针时,对象地址用于排序,因此在大多数情况下,容器中的顺序将等于创建顺序。

You'd better store objects in the container. 您最好将对象存储在容器中。 Then it's comparison operator will be used for ordering: 然后它将使用比较运算符进行订购:

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);

Then objects will be ordered correctly (using operator< ). 然后将正确排序对象(使用operator< )。

It is even safer in case integer1 , integer2 or integer3 gets destroyed before myInts (as this one stores copies). 如果integer1integer2integer3myInts之前被销毁(因为它存储副本),则它甚至更安全。

If you really need to save pointers, then you 'ill have to pass a custom comparator to the container. 如果确实需要保存指针,则必须将自定义比较器传递给容器。 See declaring a priority_queue in c++ with a custom comparator . 请参见使用自定义比较器在c ++中声明priority_queue

This should work: 这应该工作:

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

...

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

The order has nothing to do with insertion order, but with the addresses in memory. 该顺序与插入顺序无关,但与内存中的地址有关。

This is because the comparison operator is applied to the addresses of the elements, eg 这是因为比较运算符应用于元素的地址,例如

&integer1 < &integer5 < &integer3

The comparison operator of MyInteger is not considered here. 这里不考虑MyInteger的比较运算符。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM