访问优先队列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';}
我正在编写需要使用优先级队列的程序。根据我的理解,优先级队列会自动从最大元素到最小元素对队列进行排序。我创建了一个简单的对象(节点)优先级队列,该队列具有名称和 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';}