【问题标题】:std::priority_queue complex types?std::priority_queue 复杂类型?
【发布时间】:2013-07-28 07:48:33
【问题描述】:
我想使用复杂类型的 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),因为指针可能会变得无效。
这甚至可能吗?还是应该使用另一个标准容器?
【问题讨论】:
标签:
c++
data-structures
struct
std
priority-queue
【解决方案1】:
std::priority_queue 默认使用operator< 对元素进行排序,它要求元素是严格弱排序
你需要为myData类型定义operator<函数
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 中的所有操作都有两个版本:一个采用比较类型的函数对象,另一个使用运算符<.>
【解决方案2】:
你需要定义自己的比较函数,这样priority_queue就会知道哪些item的优先级更高。
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;