当前位置: 首页 > article >正文

C++容器适配器1-基本使用(stack、queue)

###适配器意思是可以将一种不能用于某种场景的东西经过特殊转换,包装成一个新东西,这个新定西可以用于这个场景,并且还具有之前旧东西的功能作用;

stack、queue就是C++里面的容器适配器,这两个适配器堆vector和list两个容器进行了包装,具有vector和list的特性;

deque相当于一个缝合怪,具有list和vector的特性,所以在标准库中,stack和queue都是将deque作为包装的缺省类型,至于怎么包装的,后续介绍,现在只用记得deque具有vector和list的各有的特性。

一、stack

栈先进后出,它的结构就像羽毛球同,它的数据就是羽毛球筒里面的羽毛球,先放进去的要最后才能取出来,后放进去的先去出来。

栈是一个类模板,模板参数T是它的数据类型,Container是stack包装的容器的具体类型,传过来的是什么就是上面,例如,传过来的是vector<int>,那么Container就是这个容器适配器适配的容器,也就是vector;默认缺省类型给deque<T>,是因为它能兼具vector和list。

头文件是<stack>

可适配list,vector、deque;

1、初始化

这个ctnr代表的是容器; 

stack的初始化很简单,只有两种:第一种是不给初始化的具体值,那么就是空的;第二种就是给特定的容器,并且容器里面有数据,那么此时的stack初始化之后就是这个容器里面的数据;

###代码演示:

int main()
{
	deque<int> dq(10, 9);
	list<int> lt(10, 1);//这里也可以用 vector 演示
	
	stack<int, list<int>> st1(lt);

	stack<int> st2;//第二个模板参数就是 deque<int>
	
	return 0;
}

 2、其他常用接口

void test01()
{
	srand((unsigned int)time(nullptr));
	vector<int> vt;
	for (int i = 0; i < 10; i++)
	{
		int data = rand() % 100 + 1;
		vt.push_back(data);
	}
	for (auto& it : vt)
	{
		cout << it << ' ';
	}
	cout << endl;

	stack<int, vector<int>> st(vt);
	while (!st.empty())//判空
	{
		cout << st.top() << " ";//栈顶,也就是最后插入的数据
		st.pop();//删除栈顶,更新栈顶元素
	}
	cout << endl;
	//判空
	cout << st.empty() << endl;
	//大小
	cout << st.size() << endl;
	//往栈顶插入元素
	for (int i = 1; i <= 10; i++)
	{
		st.push(i);
	}
	//打印观察
	while (!st.empty())
	{
		cout << st.top() << " ";
		st.pop();
	}
}


二、queue

queue就是队列,先进先出,和人排队一样,先排队的人先出去队列,后面的后出;

 其他和stack一样;区别是接口的不同;

还有一点,这个适配器不适配vector,因为这个适配器实现时底层用了pop_front函数,但是vector容器没有这个接口,list和deque有;

list有push_back、push_front、pop_back、pop_front;

vector有push_back、pop_back;

1、初始化

和stack一样的两种初始化,注意不能用vector; 

2、其他常用接口

void test02()
{
	list<int> vt;
	for (int i = 1; i <= 10; i++)
	{
		vt.push_back(i);
	}
	queue<int, list<int>> q(vt);
	//判空
	cout <<"是否为空:"<< q.empty() << endl;
	//大小
	cout <<"队列大小:"<< q.size() << endl;
	//对头和队尾的元素
	cout <<"队头数据:"<< q.front() << endl;
	cout <<"队尾数据:"<< q.back() << endl;
	//队尾进数据
	q.push(99);
	cout << "队尾数据:" << q.back() << endl;
	//队头出数据
	q.pop();
	cout << "队头数据:" << q.front() << endl;
}

emplace就是在队尾插入数据,swap就是交换两个队列;


三、priority_queue

优先级队列:和队列一样,但是它的队头的元素是最大或者最小的,和堆一样;

前面两个传参都是和stack、queue一样的含义,第三个模板参数是控制这个优先级队列是大堆还是小堆的,这个传参后面演示;

它包装的容器是vector和deque、这是因为堆的实现就是数组,要通过下标访问父子节点;

头文件就是<queue>

###代码演示:

void test03()
{
	vector<int> vc;
	for (int i = 1; i <= 10; i++)
	{
		vc.push_back(i);
	}
	priority_queue<int, vector<int>> pq1(vc.begin(),vc.end());//第三个模板参数默认为less<int>,此时是大堆
	priority_queue<int, vector<int>, greater<int>> pq2(vc.begin(), vc.end());//小堆

	cout <<"pq1大小:" << pq1.size() << endl;
	cout << "pq2大小:" << pq2.size() << endl;

	cout << "pq1是否为空:" << pq1.empty() << endl;
	cout << "pq2是否为空:" << pq2.empty() << endl;

	cout << "pq1队头元素:" << pq1.top() << endl;//也就是大堆的堆顶数据
	cout << "pq2队头元素:" << pq2.top() << endl;//也就是小堆的堆顶数据

	pq1.push(99);//插入元素后向上调整
	cout << "pq1队头元素:" << pq1.top() << endl;

	pq2.pop();//删除元素后向下调整
	cout << "pq2队头元素:" << pq2.top() << endl;
}

初始化可以不用参数,那么为空;可以传迭代器,建立大堆或者小堆 。

 


http://www.kler.cn/a/348768.html

相关文章:

  • 生成对抗网络(GANs)详解:原理、架构与应用潜力
  • jmeter使用csv数据
  • 2.C++经典实例-计算两个数的最小公倍数
  • 麻省理工发布 AI 工具,竟可以与未来的自己对话!
  • 实战篇:(四)Vue2 + Three.js 创建可交互的360度全景视图,可控制旋转、缩放完整代码
  • 达梦数据守护主备实时同步集群搭建
  • 24.3 基于文件的服务发现模式
  • 【C++】常用数据结构纲要(简易版)
  • 格式化字符串利用手法-一次机会构造栈链getshell
  • 预计算热点路径技术细节
  • 南京中医药大学与和鲸科技签署101数智领航计划,加速“医学+人工智能”交叉学科人才培养
  • 【MySQL】入门篇—SQL基础:数据操作语言(DML)
  • XPath进阶篇:精准高效的Web解析艺术
  • 保护数据安全:JS前端加密与PHP后端解密实战教程,让敏感信息更安全
  • 114.WEB渗透测试-信息收集-ARL(5)
  • FFmpeg的简单使用【Windows】
  • 时间序列预测(四)——损失函数(Lossfunction)
  • 快速理解OPTIONS请求
  • 体制内写材料小技巧:5个网站+4个经验秘诀,助力快速提高公文写作效率和水平
  • 国产人工智能教学实验箱操作案例分享:5-27 指纹识别实验