访问优先队列c ++中的第一个元素

Accessing first element in Priority Queue c++

我正在编写需要使用优先级队列的程序。根据我的理解,优先级队列会自动从最大元素到最小元素对队列进行排序。我创建了一个简单的对象(节点)优先级队列,该队列具有名称和 ID 号。我试图访问队列中的第一个对象,所以我想我可以只使用 "front" 成员函数。这在我使用标准队列时有效,但当我使用优先级队列时出现错误

error: 'class std::priority_queue' has no member named 'front'

我也试过使用 "top" 但后来我得到了错误

error: passing 'const value_type (aka const node)' as 'this' argument of 'void::display()' discards qualifiers [-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
}

我要再次指出,如果我使用队列而不是优先级队列,代码就可以工作。如何访问优先队列的前端?

首先,std::priority_queue::front不存在。我们只是不能调用不存在的东西。

其次,保持常量正确。声明您的成员函数 const.

void display() const
{...}

这是因为std::priority_queue::top的return类型是const引用。通过 const 引用(和 const 值),只能使用 const 成员函数。在const成员函数内部,对象不能被修改,这就是const的意思。

你的错误是 .display() 不是常量成员函数。
应该是:

void display() const { std::cout << "name: " << name << "   id : " << id << '\n';}

顺便说一句,只有在可能需要显式刷新时才使用 std::endl,因为它会把所有良好性能的希望付诸东流。

另请阅读:Why is "using namespace std" considered bad practice?

std::priority_queue::front 不存在。 采用 std::priority_queue::top

是的,函数 display() 应该是常量,正如其他成员所提到的那样:)

void display() const { std::cout << "name: " << name << "   id : " << id << '\n';}