在 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。

谢谢

【问题讨论】:

优先队列必须对队列中的元素进行排序。为此,它需要比较元素。通常使用小于运算符&lt; 来完成。如果您的类型没有小于运算符重载 (operator&lt;),那么您将收到该错误。我建议你get a few good books to read,因为他们会教你这些以及更多。 【参考方案1】:

您需要为heapNode对象提供比较操作。

a) 将operator&lt; 定义为 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 &amp; = 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?

存储在 plist 中的数据在模拟器中有效,但在设备中无效

如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据

如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据