优先级队列区别于普通队列的一点是:优先级队列如果插入的节点是结构体类型,则要在结构体中重载比较操作符函数。示例代码如下:
//优先级队列的使用测试
//优先级队列跟对列的使用方式的区别是优先级队列在插入元素时
//在将元素插入队尾后还要根据比较值对该元素进行位置的调整
#include
#include
using namespace std;
struct Node
{
int key;
char ch;
//只有<重载操作符函数时,如果将<改为>为什么不行,出现error C2784的错误
friend bool operator <(Node node1,Node node2)
{
//<为从大到小排列,>为从小到大排列
return node1.key(Node node1,Node node2)
{
return node1.key,less>qu;
//定义如下的que优先级队列,会默认按照从大到小对插入元素进行排列
//所以在没有定义<时,会出现错误
priority_queueque;
priority_queue,less>qe;
Node node[10];
int i;
int a[10]={4,2,1,3,6,8,7,9,10,5};
char b[10]={'a','b','c','d','e','f','g','h','i','j'};
//从小到大插入元素
for(i=0;i<10;i++)
{
qu.push(a[i]);
}
for(i=0;i<10;i++)
{
cout<,less>qe;这个定义后可以
//将元素从大到小插入元素,但是注意的是结构体中必须重载<操作符,不然会出错
for(i=0;i<10;i++)
{
node[i].key=a[i];
node[i].ch=b[i];
qe.push(node[i]);
}
for(i=0;i<10;i++)
{
cout<
疑问解答:在编写代码的时候,在只有一个重载操作符函数<时,我们将<改为>,que.push(node),出错,错误代号是:C2784.后来发现原因是:我们如下定义的que, priority_queue
另外,如果我们想向优先级队列中插入指针元素时该怎么办?是不是将priority_queue
不是!因为我们不能用结构体中重载的操作符对que中的元素进行比较,结构体中重载的操作符是类Node的操作符,而que中的是指针类型的Node节点,它与结构体中重载的操作符无法匹配。所以我们要另想办法。
那我们将friend bool operator >(Node node1,Node node2)修改为friend bool operator >(Node* node1,Node* node2),也就是传递的是Node的指针行不行呢
答案是不可以,因为根据c++primer中重载操作符中讲的“程序员只能为类类型或枚举类型的操作数定义重载操作符,在吧操作符声明为类的成员是,至少有一个类或枚举类型的参数
按照值或者引用的方式传递”,也就是说friend bool operator >(Node* node1,Node* node2)形参中都是指针类型的是不可以的。我们可以如下解决此问题。
//在优先级队列中存入指针类型的节点
#include
#include
using namespace std;
class Comapre;
class Node
{
private:
friend Comapre;
int key;
char ch;
public:
Node(int num,char c):key(num),ch(c){}
bool lessthan (const Node* node) const
{
return keykey;
}
int GetKey()
{
return key;
}
char GetChar()
{
return ch;
}
};
class Comapre
{
public:
bool operator () (Node*node1,Node*node2)
{
return node1->lessthan(node2);
}
};
int main()
{
Node *n1=new Node(5,'c');
Node *n2=new Node(4,'d');
Node *n3=new Node(6,'e');
priority_queue,Comapre>qu;
qu.push(n1);
qu.push(n2);
qu.push(n3);
int i;
for(i=0;i<3;i++)
{
cout<GetKey()<<" "<GetChar()<