C++队列

本文详细介绍了C++标准库中的队列(queue)和双端队列(deque)的使用方法,包括初始化、操作成员函数如push、pop、front、back等。队列遵循先进先出(FIFO)原则,而deque允许在两端进行插入和删除操作,具有灵活的内存管理。同时,文章探讨了deque的实现原理和与vector的算法差异。
摘要由CSDN通过智能技术生成

#定义
实现方式为队列,先进先出,可以理解为排队打饭

初始化函数

一个int类型的队列,默认为deque。

queue<int> q;

以其他模板类的方式初始化队列,对于第二个参数的要求为:只要它们支持:front()、back()、push_back() 和 pop_back()等操作。

	std::queue<int,std::list<int>> q;
	std::queue<int, std::vector<int>> q1;
	std::queue<int, std::deque<int>> q2;

以一个queue初始化队列

std::queue<int> q;
	std::queue<int> q1(q);

是否为空

空返回true,否则返回false

q.empty();

数组大小

返回当前元素个数

q.size();

获取第一个元素

返回第一个元素但不会在队列中删除该元素

 q.front()

删除第一个元素

删除第一个元素,没有返回值

q.pop();  // 出队首元素 0

最后一个元素

获取最后一个元素

q.back()

添加一个元素

在最后一位添加一个元素

q.push(i);

生成一个默认构造函数生成的对象
例如 std::queue q; q.emplace(); 此时q的数量为1,参数的值为0

q.emplace();

双向队列 deque

原文链接

初始化

默认构造函数,数组数量为0

	std::deque<int> deque1; 				

以deque1初始化deque2,复制deque1的所有值

std::deque<int> deque2(deque1);			

以deque1初始化deque3,复制deque1的所有值

	std::deque<int> deque3 = deque1;		

初始化中含有3个元素,并且三个元素都是3

	std::deque<int> deque4(3, 3);

数组中含有5个值,并且每个值都调用构造函数

	std::deque<int> deque5(5);	

以数组的形式初始化构造函数,数组中的值为1,2,1,3,4,5

	std::deque<int> deque6{ 1,2,1,3,4,5 };

以数组的形式初始化构造函数,数组中的值为1,2,1,3,4,5

	std::deque<int> deque7 = { 1,2,1,3,4,5 };	

是否为空

如果为空返回true,否则返回false

	deque1.empty();

数组大小

返回当前元素的个数

int i = deque1.size();

重置大小

将数组的数量调整为10个,如果原有的数据个数小于10,则用5补充

	 deque7.resize(10,5);

将数组的数量调整为10个,如果原有的数据个数小于10,则用0补充,如果原有数据的个数大于10,则将多余的数据删除

	 deque7.resize(10);

由于deque实现机制,这些元素被删除后,分配给他们的内存空间可以被保留
因此改变mydeque大小为10之后,可能会有额外的内存空间在mydeque中未被使用

访问元素

以角标的方式获取第三个值,需要注意的是,角标的值必须是合法的否则会引起程序的崩溃

	int i = deque7.at(3);
	int i2 = deque7[3];

获取第一个值

	int front = deque7.front();

获取最后一个值

	int back = deque7.back();

数据修改

将数组中的数据替换为3个2

deque7.assign(3, 2);

将数据的数据替换为deque8的起始位置到deque8.begin()+3的位置,仍然为不包含deque8.begin()+3

	deque7.assign(deque8.begin(), deque8.begin()+3);

以数据de的de【2】到de【3】之间的数据填充数据,并且不包含de【3】

	int de[] = { 1,2,1,3,4,5 };
	deque7.assign(de+2, de+3);

添加元素

在数据的结尾出添加一个元素

	deque7.push_back(8);

在数组开始的位置添加一个元素

	deque7.push_front(8);

在数据deque7.begin()的前面添加一个2

deque7.insert(deque7.begin(), 3);

在数据deque7.begin()的前面添加一个3个2

	deque7.insert(deque7.begin(), 3, 2);

在数据deque7.begin()的前面添加deque8.begin( 到deque8.begin()+3的位置的数据,注意仍然为不包含deque8.begin()+3

	deque7.insert(deque7.begin(), deque8.begin(), deque8.begin()+3);

emplace和insert的区别:
emplace和insert插入元素最大的区别就是emplace不会产生不必要的变量,使用insert插入元素时,需要申请内存空间创建临时对象,而申请内存空间就需要消耗一定时间;而使用emplace插入元素时,直接在原来容器的内存空间上 ,调用构造函数,不需要额外申请内存空间,就节省了很多时间,效率较高。

	deque7.emplace(deque7.begin(), 8);

在容器尾部生成一个元素。和 push_back() 的区别是,该函数直接在容器尾部构造元素,省去了复制移动元素的过程。

deque7.emplace_back( 8);
	deque7.emplace_front( 6);

删除数据

删除deque7.begin() + 2, deque7.begin() + 3的位置,同理为不包含deque7.begin() + 3,返回值为下一个位置的迭代器

	deque7.erase(deque7.begin() + 2, deque7.begin() + 3);

删除deque7.begin()位置返回值为下一个位置的迭代器

	deque7.erase(deque7.begin());

删除最后一个数据 无返回值

	deque7.pop_back();

删除第一个数据 无返回值

	deque7.pop_front();

清空数组

	deque7.clear();

deque实现原理

deque的实现可以简单的理解为一个指针数组,而数据则会存在这个指针数组所存储的空间中,同时这些指针所指向的空间都是等长的,或者可以理解为一个二维数组 intA【】【3】;3位置填充满之后,会申请一个新的3个大小的内存存入intA【】中;而这个A【】中存的数据就是【3】所指向的空间的地址;

deque算法

deque的算法参考vector的算法
Vector

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值