对象指针 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<
)。
万一 integer1
、integer2
或 integer3
在 myInts
之前被销毁(因为这个存储副本),它会更安全。
如果您确实需要保存指针,那么您必须将自定义比较器传递给容器。参见 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;
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<
)。
万一 integer1
、integer2
或 integer3
在 myInts
之前被销毁(因为这个存储副本),它会更安全。
如果您确实需要保存指针,那么您必须将自定义比较器传递给容器。参见 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;