STL容器大总结区分(中)

今天主要说栈stack和queue队列

先说deque,因为vector不能在头部进行操作,所以deque应运而生

deque双端数组        内部有个中控器 

void test01(){
	deque<int>d1;
	//尾插 
	d1.push_back(10);
	d1.push_back(20);
	
	//头插		vector没有 
	d1.push_front(100);
	d1.push_front(200); 
	
	printDeque(d1);//200 100 10 20
	
	//尾删
	d1.pop_back();
	printDeque(d1);
	
	//头删
	d1.pop_front();
	printDeque(d1); 
}

  不同点:cout<<d1.capacity();没有这个命令    其他没有不同了

这里加个sort排序和list不同的用法

void test01(){
	deque<int> d;
	d.push_back(10);
	d.push_back(20);
	d.push_back(30);
	d.push_front(100);
	d.push_front(200);
	d.push_front(300);
	
	printDeque(d);
	
	//排序	对于支持随机访问的容器都可进行sort排序 
	sort (d.begin(),d.end());
	cout<<"排序后"<<endl; 
	printDeque(d);//实验过了,vector也可 
} 

list是        L1.sort();//运行成功 默认从小到大

言归正传栈和队列

基本概念

不允许有遍历行为  只有栈顶元素才有机会被访问
栈容器符合先进后出

栈可以判断容器是否为空吗?可以empty
栈可以返回元素个数吗?可以size
生活中例子  弹匣  坐地铁 

queue就是队列  
队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为.
进数据--入队(push)   出数据--出队(pop)
队尾----back         队头----front
判断队列是否为空empty  大小size
例子:  打饭排队  

不允许有遍历,但是可以用其他方法遍历

常用接口

void test01(){
	stack<int> s;
	
	//入栈
	s.push(10);
	s.push(20);
	s.push(30);
	s.push(40);
		cout<<"栈的大小"<<s.size()<<endl;//0
	//只要栈不为空,我们就查看栈顶,并且执行出战操作
	while(!s.empty()){
		//查看栈顶元素
		cout<<"栈顶元素为"<<s.top()<<endl;
		
		//出栈
		s.pop(); 
	} 
	cout<<"栈的大小"<<s.size()<<endl;//0
} 

 用s.empty()和s.top()和s.pop()方式遍历

那我们想如果换成自定义数据类型呢?该如何实现?

自定义Person

class Person//class 自定义数据类型 
{
	public:
		Person(string name,int age)//构造函数  赋初值 
		{
			this->m_Name=name;
			this->m_Age=age;//构造函数自动调用执行 
		}
		string m_Name;
		int m_Age;
};
void test01(){
	//创建队列 
	queue<Person> q;
	
	//准备数据
	Person p1("唐僧",30);//px是对象 
	Person p2("悟空",1000);
	Person p3("八戒",800);
	Person p4("沙僧",500);
	 
	//入队
	q.push(p1);
	q.push(p2);
	q.push(p3);
	q.push(p4);
	cout<<"队列大小为:"<<q.size()<<endl;	
	//判断只要队列不空,查看队头,查看队尾,出队
	while(!q.empty()){
		//查看队头
		cout<<"队头元素----姓名"<<q.front().m_Name<<"年龄"<<q.front().m_Age<<endl;
		 //查看队尾 
		cout<<"队尾元素----姓名"<<q.back().m_Name<<"年龄"<<q.back().m_Age<<endl;
		
		//出队
		q.pop();//很巧妙 
		 
	} 
	cout<<"队列大小为:"<<q.size()<<endl;
	
}

可以看出,其他一样,都是while循环操作,pop输出

但在头部操作不同,stack是s.top头部元素       queue  为

cout<<"队头元素----姓名"<<q.front().m_Name<<"年龄"<<q.front().m_Age<<endl;
         //查看队尾 
cout<<"队尾元素----姓名"<<q.back().m_Name<<"年龄"<<q.back().m_Age<<endl;

不要忘记queue还可以查看队尾

重要声明

 

在C++中的标准库中,std::stack和std::queue是基于其他容器实现的适配器,并且它们不直接提供迭代器功能。因此,不能通过迭代器来访问std::stack和std::queue中的元素。

但是,你可以使用其他容器(例如std::vector或std::deque)作为基础来实现具有迭代器功能的堆栈和队列。例如,你可以使用std::vector来实现一个具有迭代器功能的堆栈,或使用std::deque来实现一个具有迭代器功能的队列。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值