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
是否可以对对象指针使用运算符重载?这是否意味着我必须创建自己的仿函数来代替?
答案 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<
)。
如果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;
答案 1 :(得分:0)
订单与广告订单无关,但与内存中的地址无关。
这是因为比较运算符应用于元素的地址,例如
&integer1 < &integer5 < &integer3
此处不考虑MyInteger
的比较运算符。