STL教程6-deque、stack、queue、list容器

一、deque双口队列

1、deque概述

前后两端都能插入和删除,push_front(),pop_front(),push_back(),pop_back()
特点

  • 双端插入和删除元素效率较高
  • 指定位置插入会导致数据元素移动,效率会很低
  • 可随机存取,效率高
    在这里插入图片描述
    就像上图一样,有三个地址指向了三块分段连续区域,如果在头部插入插满了,那么就会重新申请内存,然后修改指向这块的指针

2、deque常用api

1)构造函数

	deque<int> d1;
	deque<int> d2(10, 2);//10个2
	deque<int> d3(d2.begin(), d2.end());//迭代器方式
	deque<int> d4(d3);//用d3初始化

2)赋值操作assign

	deque<int> d1;
	deque<int> d2;
	deque<int> d3;
	d1.assign(10, 5);
	d2.assign(d1.begin(), d1.end());//迭代器指定区间赋值
	d3 = d2;//等号赋值

3)swap交换内存空间

d1.swap(d2);//交换

4)大小操作size()、empty()、resize(n)

if (d1.empty()){}//判断是否为空
d1.size();//返回容器中元素的个数
d1.resize(5);//元素如果超过5,那么只保留前几个

5)插入和删除和查看数据

pop_front()没有返回值

	deque<int> d1;
	d1.push_back(100);//尾部插入
	d1.push_front(200);//头部插入
	
	int val = d1.front();//拿到被删除的元素
	d1.pop_front();//删除(无返回值)
	val = d1.back();
	d1.pop_back();

二、stack容器

在STL中 queue 和 stack 其实并不叫容器(container),而是叫适配器(adapter),他们是对容器的再封装。
stack是一种“先进后出”的结构。栈不能遍历,不支持随机存取,只能通过top从栈顶获取和pop()删除元素。

stack<int>s1;

stack采用模板类实现, 尖括号里面能放置基本数据类型或者对象或者自定义类型。

1、初始化

stack<int>s1;
stack<int>s2(s1);//用s1初始化s2
stack<int> s3;
s3 = s2;//用s2初始化s3

2、push放置元素和pop弹出元素

s1.push(3);
s1.pop();

3、查看栈顶元素不弹出top()

cout << s1.top() << endl;

4、stack的大小size(),判断为空empty()

s.empty(); //判断堆栈是否为空
s.size(); //返回堆栈的大小

5、迭代栈

栈没有迭代器,只能用empty或者size判断

while (!s1.empty()) {
		cout << s1.top()<<endl;
		 s1.pop();
	}

三、queue容器

queue是一种操作受限的线性表,只允许在队首删除(出队),队尾插入(入队),其特点是先进先出
不能进行遍历,不提供迭代器,不支持随机访问

1、初始化

queue<int>s1;
queue<int>s2(s1);//用s1初始化s2
queue<int> s3;
s3 = s2;//用s2初始化s3

2、push放置元素和pop弹出元素

q.push(3);
q.pop();

3、查看栈顶元素不弹出front()

cout << s1.front() << endl;

4、queue的大小size(),判断为空empty()

s.empty(); //判断queue是否为空
s.size(); //返回queue大小

5、迭代栈

栈没有迭代器,只能用empty或者size判断

while (!q1.empty()) {
		cout << q1.front()<<endl;
		 q1.pop();
	}

四、list链表

链表是由一系列的节点组成,结点包含两个域,一个数据域,一个指针域。
链表内存是非连续的
链表只有在需要的时候才分配内存

1、构造

list<int> mlist1;//可以无参构造
list<int>mlist2(10, 9);//10个9
list<int>mlist3(mlist2);//拷贝构造,用mlist2构造mlist3
list<int>mlist4(mlist2.begin(), mlist2.end());//迭代器构造

2、插入和删除元素

插入操作,主要有push_back、push_front、insert

	mlist.push_back(100);//在头部插入
	mlist.push_front(200);//在尾部插入
	mlist.insert(mlist.begin(), 300);//迭代器插入,插入300
	mlist.insert(mlist.end(), 400);
	list<int>::iterator it = mlist.begin();
	it++;//不能直接it+5,只能it++
	it++;
	mlist.insert(it, 500);//在第三个位置插入

删除操作,主要有pop_back、pop_front

	mlist.pop_back();//在尾部删除
	mlist.pop_front();//在头部删除
	mlist.erase(mlist.begin(), mlist.end());//删除区间的元素
	mlist.clear();//删除所有元素
	mlist.remove(200);//删除容器中所有的200,list特有的一个函数

3、大小操作

size();//容器元素的个数
empty();//判断容器是否为空
resize(1);//指定容器的长为1

4、赋值操作

assign(n,elem);//将n个elem拷贝赋值给自身
s1.swap(s2);//交换元素,实际交换的空间的指针

5、front back返回第一个和最后一个元素

q.front();
q.back();

6、反转元素reverse()

	list<int> mlist;
	//自己写方法
	for (int i = 0; i < 10; i++)
	{
		mlist.push_back(i);
	}
	mlist.reverse();//使用内置方法反转

7、排序sort

aa.sort();//默认从小到大

//写个回调函数
bool mycmp(int v1, int v2)
{
	return v1 > v2;
}
mlist.sort(mycmp);//从大到小
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贪睡的蜗牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值