将元素推入优先级队列时,二进制表达式的操作数无效

Posted

技术标签:

【中文标题】将元素推入优先级队列时,二进制表达式的操作数无效【英文标题】:invalid operands to binary expression when push element in a priority queue 【发布时间】:2021-06-04 17:02:41 【问题描述】:

我是 C++ 编程新手。我必须创建一个名为 Container 的类的优先级队列。所以我是这样写的:

在 main.cpp 中:

struct Comp
    bool operator() (const Container& a, const Container& b)
        return a<b;
    
;

std::priority_queue<Container, std::list<Container>, Comp> containers;

在 Container.cpp 中:

class Container
public:
    friend bool operator< (const Container& a, const Container& b);
    //...
;

bool operator<(const Container &a, const Container &b) 
    return a.y<b.y;


我不知道为什么,即使我声明了

error: invalid operands to binary expression ('std::__1::__list_iterator<Container, void *>' and 'std::__1::__list_iterator<Container, void *>')
    __sift_up<_Comp_ref>(__first, __last, __comp, __last - __first); 

我该如何解决这个问题?我真的不知道发生了什么:(

【问题讨论】:

【参考方案1】:

它告诉你,你的 it 无法计算 list&lt;Container&gt;::interator 类型的两个迭代器之间的差异。

如果您在CppReference 上查看priority_queue 的要求,它会说容器的迭代器“必须满足 LegacyRandomAccessIterator 的要求。”

lists 迭代器不是随机访问的;它们是双向的。因此,您不能将list 用作priority_queue 的底层容器。

简单修复:使用deque 而不是list

std::priority_queue&lt;Container, std::deque&lt;Container&gt;, Comp&gt; containers;

【讨论】:

以上是关于将元素推入优先级队列时,二进制表达式的操作数无效的主要内容,如果未能解决你的问题,请参考以下文章

队列的应用:优先队列

优先队列不打印推入其中的值[关闭]

如何在实现为二进制堆的优先级队列中保留相同优先级元素的顺序?

逆波兰表达式

简易计算器实现

单调队列单调栈优先队列模板