std :: priority_queue复杂类型?

时间:2013-07-28 07:48:34

标签: c++ data-structures struct std priority-queue

我想使用复杂类型的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),因为指针可能无效。

这甚至可能吗?或者我应该使用另一个标准容器吗?

2 个答案:

答案 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;