C++优先级队列,按对象的唯一指针的特定方法升序排列
C++ priority queue in ascending order by specific method for unique pointers to objects
我有一个名为Foo
的类,每个Foo
对象都有一个称为yVal
的方法。我想要的是按Foo.yVal()
升序排列的Foo
对象的优先级队列
我使运算符>和运算符<在Foo
中到此:
bool operator> (const Foo &f){
return yVal() > f.yVal();
}
bool operator< (const Foo &f){
return yVal() < f.yVal();
}
所以我有以下代码:
priority_queue<unique_ptr<Foo>, vector<unique_ptr<Foo>>, greater<unique_ptr<Foo>> > Queue;
但这并不是按照Foo.yVal()
的升序对优先级队列进行排序。相反,它只是按照某种未知的随机顺序对它们进行排序。我在运算符>和运算符<他们甚至没有接到电话。所以我试着用lambda来代替:
auto cmp = [](Foo left, Foo right) {return left.xVal() > right.xVal();};
priority_queue<unique_ptr<Foo>, vector<unique_ptr<Foo>>, decltype(cmp) > Queue(cmp);
但这给了我一个"非静态数据成员声明为auto"的错误。
理想情况下,我希望与更大的<>以及操作员过载。如果不能,请有人告诉我lambda有什么问题(对lambda不太熟悉,如果可能的话,我会尽量避免(。
我也尝试过使用函子,但函子上的auto再次给了我相同的"非静态数据成员声明auto"错误。
您得到了未知的随机顺序,因为当您有greater<T>
时执行以下操作
// pseudocode
cmp(T lhs, T rhs) {
return lhs > rhs;
}
您的代码中的T
是什么?T
就是unique_ptr<Foo>
,C++库中有operator>(unique_ptr<>,unique_ptr<>)
吗?是的,在这里可以看到,这个操作符在比较时使用unique_ptr::get
方法:
// Psuedocode when greater used:
cmp (unique_ptr<Foo>& lhs, unique_ptr<Foo>& rhs)
{
lhs.get () > rhs.get()
}
unique_ptr::get
返回什么?它返回指向CCD_ 15的指针,因此您正在比较指向Foo
实例的指针。结果是不可预测的。代码编译并执行,但它并没有达到您所期望的效果。
如何修复lambda:
队列中存储了哪些对象?Foo
还是unique_ptr<Foo>
?您正在存储unique_ptr<Foo>
,因此lambda的参数应声明为采用此类型。
auto cmp = [](const unique_ptr<Foo>& left, const unique_ptr<Foo>& right)
{ ^^^^^^^^^^^^^^^^
return left->yVal() > right->yVal();
}; ^^
priority_queue<unique_ptr<Foo>, vector<unique_ptr<Foo>>, decltype(cmp) > Queue(cmp);
因为unique_ptr
的实例无法复制,所以必须通过引用传递它们。也可以使用->
运算符访问yVal
方法。
EDIT:带有函数对象的版本。
// comparator as function object with overloaded operator()
struct Cmp {
bool operator()(const std::unique_ptr<Foo>& left, const std::unique_ptr<Foo>& right) const {
return left->xVal() > right->xVal();
}
};
class YourClass {
public:
std::priority_queue<std::unique_ptr<Foo>, std::vector<std::unique_ptr<Foo>>, Cmp> Queue;
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 按对象的特定方法按升序排列的C++优先级队列
- 按升序打印矢量的所有元素直到它为空而没有重复项的最有效方法是什么?
- 有没有更简单的方法可以从用户那里获取三个数字并按升序打印它们?
- 重载比较符号"<"时,C++升序排序的正确方法