我正在处理我需要使用优先级队列的程序。根据我的理解,优先级队列自动从最大元素到最小元素对队列进行排序。我创建了一个具有名称和ID号的对象(节点)的简单优先级队列。我试图访问队列中的第一个对象,所以我想我可以使用“前”成员函数。这在我使用标准队列时有效,但是当我使用优先级队列时,我得到了错误
错误:'class std :: priority_queue'没有名为'front'的成员
我也试过使用“top”但是我得到了错误
错误:将'const value_type(aka const node)'作为'this'参数传递 'void :: display()'丢弃限定符[-fpermissive]
这是我的代码:
#include <iostream>
#include <queue>
using namespace std;
struct node
{
node(char n, int i) { name = n; id = i; }
void display() { cout << "name: " << name << " id : " << id << endl; }
friend bool operator < (node a, node b) { return a.id < b.id; }
private:
char name;
int id;
};
int main()
{
queue<node> myqueue; // Actually want a priority_queue<node>
myqueue.push(node('a',5));
myqueue.push(node('b',9));
myqueue.push(node('c',7));
myqueue.front().display(); // Error when using the type I want, even if I call top() instead
}
我将再次指出,如果我使用队列而不是优先级队列,代码就可以工作。如何访问优先级队列的前端?
答案 0 :(得分:3)
您的错误是.display()
不是常量成员函数
它应该是:
void display() const { std::cout << "name: " << name << " id : " << id << '\n';}
顺便说一句,只有使用std::endl
才能明确刷新可能是必要的,因为它可以消除所有良好表现的希望。
答案 1 :(得分:2)
首先,std::priority_queue::front
不存在。我们无法调用某些不存在的东西。
其次,要保持正确。声明您的成员函数const
。
void display() const
{...}
这是因为std::priority_queue::top
的返回类型是const引用。通过const引用(和const值),只能使用const成员函数。在const成员函数内部,不能修改对象,这就是const的含义。
答案 2 :(得分:0)
std :: priority_queue :: front不存在。
使用
std::priority_queue::top
是的,函数display()应该是其他成员提到的const:)
void display() const { std::cout << "name: " << name << " id : " << id << '\n';}