SLT标准模板库(二)

目录

首先

stack(容器适配器)

queue(队列)

priority_queue(优先队列)

作者最后的话(求了看看吧!!!)


首先

书接上回,我们现在将要开启学习stack,queue,priority_queue的旅途了。前面的知识我们先不回顾,没有看过SLT标准模板库(一),可以点开此链接——STL标准模板库(一)

stack,queue,priority_queue都是容器适配器。

stack(容器适配器)

温馨提示:在此后的讲义里,我都会将stack,queue,priority_queue称为容器适配器。

容器适配器:是在顺序容器的基础上实现的,屏蔽了顺序容器的一部分功能,同时也突出或增强了另外的一部分功能。

容器适配器有以下三个成员函数:

  • push:添加一个元素。
  • top:返回顶部(对stack而言)或对头(对queue,priority_queue而言)的元素的引用。
  • pop:删除一个元素。

注意:在我的SLT标准模板库(一)中讲过,容器适配器是没有迭代器的,因此STL中的各种排序、查找、变序等算法都不适用于容器适配器。

在这里我要讲一讲,此容器适配器跟栈有一定关系(有可能就是栈,作者有点没搞懂)。

栈:是一种后进先出(简写为:FILO或LIFO)的元素序列,访问和删除只能对栈顶的元素(即当前最后一个被加入栈的元素)进行,并且元素也只能被添加在栈顶。                          

有关的常用函数:

为了加深理解,请看如下图片:

stack的代码演示:

1.

#include<bits/stdc++.h>
using namespace std;
int main(){
	stack<int> s;
	s.push(10);//10这个元素从栈顶入栈 
	s.push(20);//20这个元素从栈顶入栈
	s.push(30);//30这个元素从栈顶入栈
	cout<<s.top()<<endl;//查看头部元素 
	s.pop();//弹出头部元素
	cout<<s.top()<<endl;//查看头部元素
	s.pop();//弹出头部元素
	cout<<s.top();//查看头部元素
	return 0;
}

输出:

30

20

10

栈的遍历输出相当于从大到小输出!!!

2.

#include<bits/stdc++.h>
using namespace std;
int main(){
	stack<int> s;
	int x;
	while(1){//可无限输入 
		cin>>x;//输入 
		if(x==-1) break; 
		s.push(x); 
	}
	while(s.empty()==false){//如果还有数没输完就继续弹出栈顶的数(在这里的false是bool中0的意思) 
		cout<<s.top()<<' ';
		s.pop();//顺应while的执行条件 
	}
	return 0;
}

输入:

1 2 3 4 5 -1

输出:

5 4 3 2 1

注意:在此重申一遍容器适配器是没有迭代器的,所以想要遍历,最好使用while()循环来遍历。

(可以自己打一个代码试试或者复制一下理解,玩一下呦!!!)


queue(队列)

解释:queue就是一个队列。是先进先出的,队头(first)的访问与删除操作只能在队头进行,添加操作只能在队尾进行。不能访问队伍中间的元素。

  • queue可以用list和deque来实现,默认情况下用deque实现。
  • 特点:先进先出(FIFO),队尾进,队头出。

常用函数:

代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
	queue<int> q;
	int x;
	while(1){ 
		cin>>x;
		if(x==-1) break; 
		q.push(x); 
	}
	while(q.empty()==false){//如果还有数没输完就继续弹出头的数 
		cout<<q.front()<<endl;//输出队尾无意义(可以试试)
		q.pop();//出队 
	}
	return 0;
}

  

输入:

1 2 3 4 5 -1

输出:

1 2 3 4 5


priority_queue(优先队列)

解释:priority_queue是优先队列。他和普通队列(queue)的区别在于:优先队列的头部总是最大的——即执行pop操作时,删除的总是最大的元素;执行top操作时,返回的是最大元素的引用

  • priority_queue也是可以用list和deque实现的,默认情况下用deque实现。
  • priority_queue默认的元素比较器是less<数据类型>。也就是说,在默认情况下,要放入priority_queue的元素是用"<"运算符比较的,而且priority_queue保证以下条件总是成立;对于队头的元素x和任意非队头的元素y,表达式"x<y"必定是false。
  • 优先队列具有队列的所有特性,包括基本操作,只是在这个基础上添加了一个内部排序
  • priority_queue的第三个类型参数可以用来指定排序规则(前面的queue也是可以的,如:queue<int,vecotr<int>,less<int> > q 小顶堆(从大到小),priority_queue的定义同理)。
  • priority_queue内部并非完全有序,但却能确保最大元素在队头(默认排序情况下)。

那么如何定义呢?

定义——priority_queue<数据类型,容器类型,比较方式>

特别注意:priority_queue特别适用于"不停地在一堆元素中取走最大元素"的这种情况。

小顶堆:从大到小(greater<数据类型>)                 大顶堆:从小到大(less<数据类型>)

大顶堆:

#include<bits/stdc++.h>
using namespace std;
int main(){
	priority_queue<int,vector<int>,less<int> > q;//less<int>从大到小(因为这是优先队列呀,当然你不写less<int>,他也是默认的大顶堆) 
	q.push(3);
	q.push(5);
	q.push(1);
	q.push(4);
	q.push(2);
	while(q.size()!=0){
		cout<<q.top()<<' ';//输出头部 
		q.pop();//出队 
	}
	return 0;
}

输出:5 4 3 2 1

小顶堆:

#include<bits/stdc++.h>
using namespace std;
int main(){
	priority_queue<int,vector<int>,greater<int> > q;//greater<int>从大到小(小顶堆) 
	q.push(3);
	q.push(5);
	q.push(1);
	q.push(4);
	q.push(2);
	while(q.size()!=0){
		cout<<q.top()<<' ';//输出头部 
		q.pop();//出队 
	}
	return 0;
}

输出:1 2 3 4 5 


作者最后的话(求了看看吧!!!)

这下子我们终于讲完了STL标准模板库,作者都快猝死了,太累了,还是那句话你们要自行在做一遍加深记忆呀,谢谢了,完结撒花!!!

最后,本篇文章是作者自己学习过后自行总结而成,可能会有些缺漏,我就在此,请看官们赐教!

最后的最后:

!!!

!!!

​​​​​​​!!!

  • 27
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值