c++之deque的介绍及使用

以下是阿鲤堆c++中deque的总结,希望对大家有用,若有误请慷慨指出。

1:deque的介绍

2:deque的使用


1:deque的介绍

1. deque(发音类似“deck”),是双端队列不规则的首字母缩写,双端队列是动态大小的序列式容器,其可以像两端进行伸缩。

2. 特定的库可以以不同的方式实现deque,但通常都是一种动态数组。不论在何种情况下,它都允许随机访问迭代器直接访问单个元素,可以根据需要动态的伸缩。

3. 因此,deque提供了一些与vector相似的功能,但deque在头部和尾部进行数据插入和删除操作更加效。与vector不同的是,deque不能保证所有的元素存储在连续的空间中,在deque中通过指针加量方式访问元素可能会导致非法的操作。

4. vector与list提供了相似的接口,因此其具有类似的用途,但是内部的实现原理不同:vector使用使用动态数组,该数组通常需要动态增长;deque中的元素可能分散在不同的存储块中,在deque中保存一些必要的信息,通常用来在常数范围内直接访问deque中的任何一个元素,所以deque的内部实现vector复杂,但是这些额外信息使得dque在某些情况下增长更加的高效,特别是在序列比较大,重新配成本比较高的情况下。

5. 除了在频繁在头部或尾部进行插入和删除操作外,deque比list和forward_list的性能更差。

2:deque的使用

2.1:deque的构造函数

函数声明接口说明
deque()构造空的双端队列
deque(size_type n, const value_type& val = value_type()) 用n个值为val的元素构造双端队列
deque(InputIterator first, InputIterator last)用(fist,last)的区间构造双端队列
deque(const deque& x) 双端队列的拷贝函数

eg:

#include<iostream>
#include<deque>

using namespace std;

int main()
{
	deque<int> q1;
	deque<int> q2(6,8);
	deque<int> q3(q2.begin() + 2, q2.end());
	deque<int> q4(q2);
	for (auto &i : q1)
	{
		cout << i << " ";
	}
	cout << endl;
	for (auto &i : q2)
	{
		cout << i << " ";
	}
	cout << endl;
	for (auto &i : q3)
	{
		cout << i << " ";
	}
	cout << endl;
	for (auto &i : q4)
	{
		cout << i << " ";
	}
	cout << endl;
	system("pause");
	return 0;
}

2.2:deque的迭代器

双端队列底层是一段假象的连续空间,实际是分段连续的,为了维护其“整体连续”的假象,落在了deque的迭代器身上。下图为deque的原理图

由上图我们可以看出,deque的底层实现是一个二维数组;二级指针先给一维分配空间,也就是分配n个一级指针的空间,然后再给里面的每个一级指针分配空间,这样就形成了一个动态二维数组。deque只给一维分配空间,然后找到正中的位置(保证向上向下都有足够的空间),然后给该位置分配空间当这个空间使用完之后,pos+1,然后给新的pos申请空间,然后pos继续存储。向后类似。

而对于迭代器的理解可以看下表

迭代器成员作用
cur我在我家的哪(当前迭代器位置  )
first我家从哪里开始(当前迭代器所在一维数组的起始位置)
last我家从哪里结束(当前迭代器所在一维数组的终止位置)
node我家在哪(当前迭代器所在一维数组的地址)

2.3:迭代器接口: 

 容量操作接口:

2.4:元素访问接口: 

2.5:deque中的修改操作

 

以上是阿鲤对deque的全部总结了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值