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
#include

using namespace std;

int main()
{
	deque q1;
	deque q2(6,8);
	deque q3(q2.begin() + 2, q2.end());
	deque 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的原理图

c++之deque的介绍及使用_第1张图片

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

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

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

2.3:迭代器接口: 

c++之deque的介绍及使用_第2张图片

 容量操作接口:

c++之deque的介绍及使用_第3张图片

2.4:元素访问接口: 

c++之deque的介绍及使用_第4张图片

2.5:deque中的修改操作

 c++之deque的介绍及使用_第5张图片

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

你可能感兴趣的:(c++)