首页 > 其他分享 >STL优先队列

STL优先队列

时间:2022-10-06 14:33:25浏览次数:50  
标签:node queue 优先 q2 STL 运算符 队列 int push

STL大法好

STL优先队列就是一个封装的堆,学会熟练运用,免去手写堆的麻烦 其实是不会自己写

格式:priority_queue< 类型 , vector<类型> , 比较类 > q;

优先队列的源码比较奇特,别的容器默认从小到大排序,但是 priority_queue<> 默认是大根堆的,这是因为 优先队列队首指向最后,队尾指向最前面的缘故! 每次入队元素进去经排序调整后,优先级最大的元素排在最前面,也就是队尾指向的位置,这时候队首指向优先级最小的元素!所以我们重载运算符的时候比较类里面写>就相当于<排序方式,这点需要花点时间想想

举个例子:

int类型:

//在写比较类时可以用重载运算符的方法
//要注意的是STL优先队列默认的运算符是括号,即 ()
struct cmp{
	bool operator () (int a,int b){//通过结构体来重载运算符
		return a<b;//虽然 reture a<b 但堆顶是最大的
	} 
};
struct cmp2{
	bool operator () (int a,int b){
		return a>b;//虽然 reture a>b 但堆顶是最小的
	}
};

priority_queue<int,vector<int>, cmp> q;//大顶堆
priority_queue<int,vector<int>, cmp2> q2;//小顶堆

我们插入以下几个数:

1 , 5 , 7 , 3 , 2

q.push(1);q2.push(1);
q.push(5);q2.push(5);
q.push(7);q2.push(7);
q.push(3);q2.push(3);
q.push(2);q2.push(2);
puts("q:");
while(q.size()){
	int h=q.top();
	q.pop();
	cout<<h<<" "; 
}
puts("\nq2:");
while(q2.size()){
	int h=q2.top();
	q2.pop();
	cout<<h<<" "; 
}

输出结果:

image.png

结构体类型:

//在写比较类时可以用重载运算符的方法
//要注意的是STL优先队列默认的运算符是括号,即 ()
struct node{
	int x,y;
	node(int _x,int _y){x=_x,y=_y;}
};
struct cmp{
	bool operator () (node a,node b){//通过cmp结构体来重载运算符
		return a.x<b.x;
	}
};
struct cmp2{
	bool operator () (node a,node b){
		return a.y>b.y;
	}
};

priority_queue<node,vector<node>, cmp> q;//按x降序堆
priority_queue<node,vector<node>, cmp2> q2;//按y升序堆

我们插入:

{1,2} {4,5} {3,7} {2,1} {5,3}

q.push(node(1,2));q2.push(node(1,2));
q.push(node(4,5));q2.push(node(4,5));
q.push(node(3,7));q2.push(node(3,7));
q.push(node(2,1));q2.push(node(2,1));
q.push(node(5,3));q2.push(node(5,3));
puts("q:");
while(q.size()){
	node h=q.top();
	q.pop();
	cout<<h.x<<" "<<h.y<<"\n"; 
}
puts("\nq2:");
while(q2.size()){
	node h=q2.top();
	q2.pop();
	cout<<h.x<<" "<<h.y<<"\n"; 
}

输出结果:

image.png

标签:node,queue,优先,q2,STL,运算符,队列,int,push
From: https://www.cnblogs.com/ycw123/p/16757570.html

相关文章

  • 二、运算符号和部分运算符号的优先级
    目录一、基本运算符号1、数学运算符号2、比较运算符号二、常用赋值符号1、链式赋值2、交叉赋值3、解压赋值三、逻辑运算符号1、and2、or3、not四、成员运算符号innotin五......
  • 119-23-ZooKeeper FastLeaderElection 选举源码剖析_ev
            quorumpeer.start()方法启动涉及目录上面的6件事                           ......
  • STL容器vector应用注意事项
      【1】提前分配足够空间以免不必要的重新分配和复制代价 同样是push_back操作,预分配足够空间和不分配空间的时间代价显而易见。【2】使用shrink_to_fit()释放vector占用的......
  • 代码随想录day11 | 232.用栈实现队列 225.队列实现栈 20.有效的括号 1047. 删除字符
    232.用栈实现队列题目|文章1.使用两个栈(修改输出)思路1.使用两个栈,用一个栈输入数据,用另一个栈输出数据2.当输出栈为空时,将输入栈的数据转移到输出栈中实现点击查看......
  • STL学习笔记
    目录STL介绍什么是STL泛性编程STL基本组成STL序列式容器什么是STL容器什么是迭代器什么是序列式容器array容器vector容器deque容器list容器STL关联式容器pair容器map容器mu......
  • kafka 通过代码对队列进行操作
    StringbootstrapServers="192.163.0.1:9092";KafkaAdminkafkaAdmin;AdminClientadminClient;/***项目启动调用或者通过@Bean注入*/......
  • 21-RabbitMQ延迟队列插件
    RabbitMQ延迟队列插件下载官网https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases我用的是3.10.7的RabbitMQ,但是官网没有这么新版本的,只......
  • 16-RabbitMQ高级特性-消费端的消息ACK与重回队列
    消费端的消息ACK与重回队列消费端的手工ACK和NACKACK分为自动和手动消费端进行消费的时候,如果由于业务异常我们可以进行日志的记录,然后进行补偿如果由于服务器宕......
  • 17-RabbitMQ高级特性-TTL队列/消息
    TTL队列/消息TTL:TimeToLive,生存时间RabbitMQ支持消息的过期时间,在消息发送时可以指定RabbitMQ支持队列的过期时间,从消息进入队列开始计算,只要超过了队列......
  • 18-RabbitMQ高级特性-死信队列
    死信队列死信队列:DLX,Dead-Letter-Exchange利用DLX,当消息在一个队列中变成死信(deadmessage)之后,它能被重新publish到另一个Exchange,这个Exchange就是DLXDL......