以下是阿鲤堆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的全部总结了。