一、deque简介
deque(double-ended queue)是一个双端队列。在头部和尾部对元素进行删除和插入操作非常之快。
deque是一个双端顺序容器,支持元素的快速随机访问。其大小也是可变的,可以通过删减元素和插入来对内存进行动态管理。但是,要是从中间插入或者删除元素,deque的效率就很低了。
二、deque和vector的对比
对比起vector,deque不仅仅支持从尾部插入/删除元素,还支持从头部插入元素/删除元素。同时,deque中元素所存储的位置和vector大有不同,vector存在一段连续的内存空间,而deque则不能保证容器内的元素都存放在一段连续的内容空间内。所以,在对deque通过指针的移位的方式来访问其中元素时,可能会出现错误。
vector中所有的元素都是存储在一块连续的内存空间当中,当空间不足的时候,会使用allocator在内存空间后重新开辟新的内存 ,以保证元素顺序存储。而deque有所不同,虽然deque是一个顺序容器,但是他的元素存储可以不连续,可以分为多个内存块,当遍历deque中元素的时候,会通过内存快与块一件的接口对所有元素进行逐一访问。如下图所示:
通过上图可以很容器看出,当在处理那些长的,元素数量比较多的数列是,vector的代价比起deque的代价高的多。
三、容器特性
1.顺序容器
2.动态数组
3.动态内存分配
四、模板参数
1.T
元素的类型,deque::value_type
2.Alloc
allocator的类型,using to define the storage allocation model. deque::allocator_type
五、类型
member type | definition | notes |
---|---|---|
value_type | The first template parameter (T) | |
allocator_type | The second template parameter (Alloc) | defaults to: allocator<value_type> |
reference | value_type& | |
const_reference | const value_type& | |
pointer | allocator_traits<allocator_type>::pointer | for the default allocator: value_type* |
const_pointer | allocator_traits<allocator_type>::const_pointer | for the default allocator: const value_type* |
iterator | a random access iterator to value_type | convertible to const_iterator |
const_iterator | a random access iterator to const value_type | |
reverse_iterator | reverse_iterator<iterator> | |
const_reverse_iterator | reverse_iterator<const_iterator> | |
difference_type | a signed integral type, identical to: iterator_traits<iterator>::difference_type | usually the same as ptrdiff_t |
size_type | an unsigned integral type that can represent any non-negative value of difference_type | usually the same as size_t |
六、成员函数(和vector基本上相似)
1.构造/析构函数
1.构造函数 //constructor
2.析构函数 //destructor
3.赋值操作符 //operator = ;
2.迭代器
begin //begin 返回一个迭代器,指向deque的第一个元素
end //end 返回一个迭代器,指向deque末尾元素的后一个位置
rbegin //rbegin 返回一个反向迭代器,指向deque“反向”起始位置,也就是最后一个元素
rend //rend 但会一个反向迭代,指向deque“反向”末尾位置的后一个元素。如果需要反向遍历访问第一个元素,则需要 -1
cbegin //返回一个const_iterator,指向deque的第一个元素
cend
crbegin //返回一个const_reverse_iterator,指向deque“反向”起始位置
crend
3.容器
size //返回size
max_size //返回max_size
resize //重置size的大小
empty //判断容器是否为空
shrink_to_fit //要求deque改变其capacity去适应其size
4.元素访问
operator [] //支持下标操作符访问 同样也支持迭代器访问
at(n) //访问下表为n的那个元素
front //访问首个元素
back //访问末尾元素
5.修改
assign //指定deque的内容
push_back //从尾部插入元素
push_front //从头部插入元素
pop_back //从尾部弹出元素
pop_front //从尾部弹出元素
insert //从中间插入元素 (效率不高)
erase //从中间删除元素 (效率不高)
swap //交换数组内容
clear //清除deque的内容
emplace //构建并且插入元素
emplace_front //在头部构建并且插入元素
emplace_back //在尾部构建并且插入元素
七、实例
#include <iostream>
#include <deque>
using namespace std;
void print(deque<int> dq)
{/*
for (auto& r : dq) //下标操作符可以进行遍历
cout << r << ends;
cout << endl;
*/
deque<int>::iterator it;
for (it = dq.begin(); it != dq.end(); it++) //迭代器也可以遍历
cout << *it << ends;;
cout << endl;
}
void main()
{
deque<int> dq1 = { 1,2,3,4,5,6,7,8,9 };
deque<int> dq2(4, 3); //4个3
deque<int> dq3(dq1.begin() + 1 ,dq1.end() - 1); //赋值一个范围
deque<int> dq4;
dq4 = dq1; //operator =
cout << "deque 1 : ";
print(dq1);
cout << "deque 2 : ";
print(dq2);
cout << "deque 3 : ";
print(dq3);
cout << "deque 4 : ";
print(dq4);
cout << "--------------------------------" << endl;
cout << "dq1 size : " << dq1.size() << endl;
cout << "dq1 max_size : " << dq1.max_size() << endl;
//通过结果可以看出,deque的size 和 max_size 也不一样
deque<int> dq5(100);
cout << "dq5 size(before resize) : " << dq5.size() << endl;
dq5.resize(10);
cout << "dq5 size(after resize) : " << dq5.size() << endl;
dq5.shrink_to_fit(); //Requests the container to reduce its memory usage to fit its size
if (!dq5.empty()) { cout << "dq5 is not empty! " << endl; }
cout << "--------------------------------" << endl;
cout << "dq1 : ";
print(dq1);
cout << "dq1[5] : " << dq1[5] << endl;
cout << "at[5] : " << dq1.at(5) << endl;
cout << "dq1 front : " << dq1.front() << endl;
cout << "dq1 end : " << dq1.back() << endl;
//其他的与vector基本相同,就不实现了
}