点击打开链接
优先级队列区别于普通队列的一点是:优先级队列如果插入的节点是结构体类型,则要在结构体中重载比较操作符函数。示例代码如下:
-
-
-
- #include<iostream>
- #include<queue>
- using namespace std;
- struct Node
- {
- int key;
- char ch;
-
- friend bool operator <(Node node1,Node node2)
- {
-
- return node1.key<node2.key;
- }
- friend bool operator >(Node node1,Node node2)
- {
- return node1.key<node2.key;
- }
- };
- int main()
- {
-
-
-
-
-
- priority_queue<int,vector<int>,less<int>>qu;
-
-
- priority_queue<Node>que;
- priority_queue<Node,vector<Node>,less<Node>>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<<qu.top()<<endl;
- qu.pop();
- }
- cout<<endl;
-
- for(i=0;i<10;i++)
- {
- node[i].key=a[i];
- node[i].ch=b[i];
- que.push(node[i]);
- }
- for(i=0;i<10;i++)
- {
- cout<<que.top().key<<" "<<que.top().ch<<endl;
- que.pop();
- }
- cout<<endl;
-
-
- 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<<qe.top().key<<" "<<qe.top().ch<<endl;
- qe.pop();
- }
- return 0;
- }
疑问解答:在编写代码的时候,在只有一个重载操作符函数<时,我们将<改为>,que.push(node),出错,错误代号是:C2784.后来发现原因是:我们如下定义的que, priority_queue<Node>que;而默认的que插入是从大到小,所以在结构体中要重载<,如果我们将其<修gai为>则que的push函数找不到相应的操作符,就会出错。
另外,如果我们想向优先级队列中插入指针元素时该怎么办?是不是将priority_queue<Node>que;改为priority_queue<Node*>que;就ok了?
不是!因为我们不能用结构体中重载的操作符对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<iostream>
- #include<queue>
- 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 key<node->key;
- }
- 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<Node*,vector<Node*>,Comapre>qu;
- qu.push(n1);
- qu.push(n2);
- qu.push(n3);
- int i;
- for(i=0;i<3;i++)
- {
- cout<<qu.top()->GetKey()<<" "<<qu.top()->GetChar()<<endl;
- qu.pop();
- }
- return 0;
- }