C++知识小屋(6):STL——priority_queue常用方法小结(包含自定义类的方法)

文章目录

  • 优先队列priority_queue
  • 优先队列的创建和输出
  • 自定义类型的优先队列

       STL在C++中起到非常重要的作用,最大的好处就是将常见的数据结构进行了封装,使得我们不需要从底层一步步去实现,使用起来非常方便。C++知识小屋的STL系列旨在将常见STL库的常见函数进行小结,以函数+示例+结果展示的方式作为文章的整体结构。希望能够在用到这些库的时候能够快速上手,熟练地使用它们来解决一些常见的问题。

优先队列priority_queue

  • 与queue不一样的是,priority_queue能够对队列中的元素自动排序,无需手动排序,因此使用起来非常方便。
  • 与stack和queue类型,包括以下函数:
    • pop();弹出最前面的元素
    • top();获得最前面的元素
    • empty();判断队列是否为空(元素个数是否为0)
    • push();添加新的元素
  • 需要在程序前面加上下面的库:
#include 

优先队列的创建和输出

  • 对于一般类型的优先队列的创建,如int类型,double类型,需要在优先队列的对象创建的时候指明其排序方式是升序还是降序。
  • 下面的例子说明,优先队列的构造方式有两种:
    • 第一种是直接给出类型,如A对象,此时优先队列默认为降序队列,即值较大的在队列的前面。输出的时候也是先输出大的再输出小的。

    • 第二种是需要给出三个参数priority_queue,如下面的B,C对象

         	1.Type为数据类型(如int,double,string)
        	2.Container为保存数据的容器(如vector< int >,vector< string >)
        	3.Functional为元素比较方式(先输出较大的为less< int >,先输出较小的为greater< int >)
      
#include 
#include 
#include
using namespace std;

/*    程序解释 
在下面的例子中,A等价于B,都是降序优先队列,
底层实现为大顶堆,输出的时候先输出大的元素,再输出小的元素 
C为升序优先队列,底层实现为小顶堆,先输出小的元素,再输出大的元素
*/ 
int main(){
	
	//创建对象以及输入数据 
	priority_queue <int> A;			
	A.push(10);
	A.push(20);
	A.push(30);
	A.push(40);
	
	priority_queue <int,vector<int>,less<int> > B;			
	B.push(10);
	B.push(20);
	B.push(30);
	B.push(40);
	
	priority_queue <int,vector<int>,greater<int> > C;			
	C.push(10);
	C.push(20);
	C.push(30);
	C.push(40);
	
	cout << "优先队列A为" << endl;
	for(int i=0;i<4;i++){	
		cout << A.top() << endl;
		A.pop();
	} 
	cout << endl << endl;
	
	cout << "优先队列B为" << endl;
	for(int i=0;i<4;i++){	
		cout << B.top() << endl;
		B.pop();
	} 
	cout << endl << endl;
	
	cout << "优先队列C为" << endl;
	for(int i=0;i<4;i++){	
		cout << C.top() << endl;
		C.pop();
	} 
	cout << endl << endl;	
	
	return 0;
} 

C++知识小屋(6):STL——priority_queue常用方法小结(包含自定义类的方法)_第1张图片


自定义类型的优先队列

  • 在实际应用中,往往我们需要用自定义类型创造priority_queue,因此下面展示如何构建。
  • 首先对于自定义的优先队列,我们需要在自定义类里面重载"<"运算符,这是因为当优先队列添加新的元素的时候,其底层实现是通过小于号进行不同元素的比较,进而保证优先队列称理想的排列方式。
  • 在自定义的优先队列的创建中,格式为:
    priority_queue<自定义类名> 优先队列对象名
  • 与vector不同,优先队列无法直接访问指定位置的元素。跟stack和queue一样,需要通过top()函数和pop()函数进行交替的输出才行。
  • 与vector不同,优先队列添加新元素的函数名为push(),而vector添加新元素的函数名为push_back()。
#include 
#include 
#include
using namespace std;

class Point{

	public:
		//两种变量x,y 
		int x,y;		 

		//二合一的构造函数 
		Point(int _x=0,int _y=0){
			x = _x;
			y = _y;
		}
		
		//设置优先队列的比较规则 
		friend bool operator < (const Point & A,const Point & B){
			if(A.x != B.x){
				return A.x < B.x;
			}
			return A.y < B.y;
		}
		
		//重载输出流 
		friend ostream & operator << (ostream & o,const Point & A){
			o << "x = " << A.x << "  ,y = " << A.y << endl;
			return o;
		}
	
};


int main(){
		
	priority_queue <Point> A;			//创建对象以及输入数据 
	A.push(Point(85,25));
	A.push(Point(95,60));
	A.push(Point(85,50));
	A.push(Point(60,40));
		
	//输出优先队列 
	cout << "优先队列为" << endl;
	for(int i=0;i<4;i++){	
		cout << A.top() << endl;
		A.pop();
	} 
	cout << endl << endl;
	
	
	return 0;
} 

C++知识小屋(6):STL——priority_queue常用方法小结(包含自定义类的方法)_第2张图片

你可能感兴趣的:(C++,c++,stl)