在 boost::heap::priority_queue 中推送结构对象时出错
Posted
技术标签:
【中文标题】在 boost::heap::priority_queue 中推送结构对象时出错【英文标题】:Errors when pushing structure object in boost::heap::priority_queue 【发布时间】:2018-06-11 06:22:34 【问题描述】:我有一个结构,其对象将被推入boost::heap::priority_queue
。
typedef struct
int i, j;
double deltaQ;
heapNode;
int main()
double a[] = 0.03, 0.01, 0.04, 0.02, 0.05;
heapNode node;
boost::heap::priority_queue<heapNode> maxHeap;
for(int i = 0; i < 5; i++)
node.deltaQ = a[i];
node.i = i;
node.j = i;
maxHeap.push(node);//error
for(int i = 0; i < 5; i++)
node = maxHeap.top();
cout << node.deltaQ << " " << node.i << " " << node.j;
cout << "\n";
maxHeap.pop();
这段代码给出了一个编译器错误,
error: no match for 'operator<' (operand types are 'const heapNode' and 'const heapNode')|
对此有任何解决方案,我使用的是 codeBlocks 16.01。
谢谢
【问题讨论】:
优先队列必须对队列中的元素进行排序。为此,它需要比较元素。通常使用小于运算符<
来完成。如果您的类型没有小于运算符重载 (operator<
),那么您将收到该错误。我建议你get a few good books to read,因为他们会教你这些以及更多。
【参考方案1】:
您需要为heapNode
对象提供比较操作。
a) 将operator<
定义为 heapNode 的成员
struct heapNode
int i, j;
double deltaQ;
bool operator<(const heapNode& theOther) const
// your comparison operation
return this->deltaQ < theOther.deltaQ;
;
b) 你可以将仿函数对象作为比较器传递给 priority_queue 构造函数
explicit priority_queue(value_compare const & = value_compare());
定义函子
struct cmp
bool operator () (const heapNode& lhs, const heapNode& rhs) const
return lhs.deltaQ < rhs.deltaQ;
;
将它传递给priority_queue的ctor
cmp c;
boost::heap::priority_queue<heapNode,boost::heap::compare<cmp>> maxHeapc;
【讨论】:
【参考方案2】:在你的 heapNode 结构中,你需要重载 operator。
struct HeapNode
int i, j;
double deltaQ;
bool operator<(const HeapNode& other)
*return true if current HeapNode is less than other, else false*
;
heapNode;
http://en.cppreference.com/w/cpp/language/operators 对您来说是一个很好的入门指南。
【讨论】:
以上是关于在 boost::heap::priority_queue 中推送结构对象时出错的主要内容,如果未能解决你的问题,请参考以下文章
在 React 应用程序中在哪里转换数据 - 在 Express 中还是在前端使用 React?