访问Priority Queue c ++中的第一个元素

时间:2015-11-19 06:04:55

标签: c++ const priority-queue const-correctness

我正在处理我需要使用优先级队列的程序。根据我的理解,优先级队列自动从最大元素到最小元素对队列进行排序。我创建了一个具有名称和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
}

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

3 个答案:

答案 0 :(得分:3)

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

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

顺便说一句,只有使用std::endl才能明确刷新可能是必要的,因为它可以消除所有良好表现的希望。

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

答案 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';}