Pet*_*mit 9 c++ priority-queue
我的优先级队列声明为:
std::priority_queue<*MyClass> queue;
class MyClass {
bool operator<( const MyClass* m ) const;
}
Run Code Online (Sandbox Code Playgroud)
没有排序队列中的项目.
怎么了?我不想实现不同的(比较)类.
答案摘要:
问题是,指针地址是排序的.避免这种情况的唯一方法是"比较指针"的类.
现在实现为:
std::priority_queue<*MyClass, vector<*MyClass>, MyClass::CompStr > queue;
class MyClass {
struct CompStr {
bool operator()(MyClass* m1, MyClass* m2);
}
}
Run Code Online (Sandbox Code Playgroud)
Tim*_*imW 11
给Que比较函子ptr_less.
如果你想让ptr_less与std库的其余部分兼容(绑定器,作曲家......):
template<class T>
struct ptr_less
: public binary_function<T, T, bool> {
bool operator()(const T& left, const T& right) const{
return ((*left) <( *right));
}
};
std::priority_queue<MyClass*, vector<MyClass*>, ptr_less<MyClass*> > que;
Run Code Online (Sandbox Code Playgroud)
否则你可以使用简化版本:
struct ptr_less {
template<class T>
bool operator()(const T& left, const T& right) const {
return ((*left) <( *right));
}
};
std::priority_queue<MyClass*, vector<MyClass*>, ptr_less > que;
Run Code Online (Sandbox Code Playgroud)
由于您priority_queue仅包含指针值,因此它将使用指针的默认比较运算符 - 这将按地址对它们进行排序,这显然不是您想要的。如果您更改priority_queue为按值存储类实例,它将使用您定义的运算符。或者,您必须提供比较功能。
| 归档时间: |
|
| 查看次数: |
19503 次 |
| 最近记录: |