我想使用复杂类型的std :: priority_queue:
typedef struct
{
uint8_t data;
uint64_t moredata;
}myData;
typedef struct
{
boost::mutex someQueueLock;
std::priority_queue<myData> myQueue; //does not work
}
我不想使用一个充满指针的队列(priority_queue),因为指针可能无效。
这甚至可能吗?或者我应该使用另一个标准容器吗?
答案 0 :(得分:2)
std::priority_queue默认使用operator<
对元素进行排序,它要求元素严格弱序
您需要为operator<
类型
myData
函数
bool operator<(const myData& lhs, const myData& rhs)
{
return lhs.data < rhs.data;
}
§23.6.4.1 类模板priority_queue
具有随机访问迭代器和支持操作front(),push_back()和pop_back()的任何序列容器都可用于实例化priority_queue。特别地,可以使用矢量(23.3.6)和双端(23.3.3)。实例化priority_queue还涉及提供函数或函数对象以进行优先级比较;该库假定函数或函数对象定义严格弱排序(25.4)。
§25.4
25.4中的所有操作都有两个版本:一个采用Compare类型的函数对象,另一个使用运算符&lt;。
答案 1 :(得分:1)
您需要定义自己的比较函数,以便priority_queue知道哪些项具有更高的优先级。
bool MyCompare(const myData& left, const myData& right)
{
// todo: return true if left has higher priority than right
}
std::priority_queue<myData, std::vector<myData>, MyCompare> queue;