0

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

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

4

2 回答 2

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 中的所有操作都有两个版本:一个采用比较类型的函数对象,另一个使用运算符<。

于 2013-07-28T07:54:27.217 回答
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;
于 2013-07-28T07:54:54.433 回答