概念
deque兼顾了数组和链表的优点:即是连续存储结构,又支持在两端添加/删除元素
问题:对deque进行排序操作复杂度高
deque容器和vector容器最大的差异:
1.deque插入和删除常数项时间(无论数据有多少,需要的时间都是固定的)
2.deque容器没有容量的概念,由一段一段的定量的连续空间构成。
随时可以增加一段新的空间并链接起来, 换句话说, 像vector 那样, ”旧空间不足而重新配置一块更大空间, 然后复制元素, 再释放旧空间”这样的事情在 deque 身上是不会发生的。
①因此, deque 没有必须要提供所谓的空间保留(reserve)功能
②但是,它的随机迭代器并不是普通的指针, 其复杂度和vector不是一个量级,
③对deque 进行的排序操作, 为了最高效率, 可将 deque 先完整的复制到一个 vector 中, 对 vector 容器进行排序, 再复制回 deque.
初始化deque对象的方式
deque<T> v1;//默认的初始化方式,内容为空
deque<T> v2(v1);//v2是v1的一个副本
deque<T> v3(n,i);//v3中包含了n个数值为i的元素
deque<T> v4(n);//v4中包含了n个元素,每个元素的值都是0
deque<T> v5(v1.begin(),v1.end());//v5包含v1的一个区域元素[v1.begin,v1.end());
begin和end只要是地址即可,普通数组也可以完成
deque常用函数
v1.empty():判断向量是否为空,为空返回真,否则为假
v1.begin():返回向量(数组)的首元素地址
v1.end(): 返回向量(数组)的末元素的下一个元素的地址
v1.rbegin():返回逆向队列的第一个数据,即c容器的最后一个数据。
v1.rend():返回逆向队列的最后一个数据的下一个位置,即c容器的第一个数据再往前的一个位置。
deque<int> v; v.push_back(1); v.push_back(2); v.push_back(3); deque<int>::reverse_iterator it; for(it = v.rbegin();it!=v.rend();it++){ cout << *it << "\t"; } cout << endl;
v1.clear():清空向量
v1.front():返回得到向量的第一个元素的数据
v1.back():返回得到向量的最后一个元素的数据
v1.size():返回得到向量中元素的个数
v1.push_back(数据):将数据插入到向量的尾部
v1.pop_back():删除向量尾部的数据
v1.push_front(数据):在开始位置增加一个数据。
v1.pop_front():删除第一个元素。
v1.assign(n,num):将n个num拷贝赋值给数组v1(数组原有的信息被覆盖)
v1.assign(v2.begin(),v2.end()):将[beg,end)一个左闭右开区间的数据赋值给v1
也可以用数组直接赋值(begin和end是表示地址)
int a[5] = {1,2,3,4,5}; list<int> a1; a1.assign(a,a+5);
v1=v2:
v1.at(index):传回索引为index的数据,如果index越界,抛出out_of_range异常。
v1.max_size():返回数组v1可能容纳的最大元素数量
v1.insert(pos,num):在pos位置(地址)插入元素num。
v1.insert(pos,n,num):在pos位置(地址)插入n个元素num。
v1.insert(pos,beg,end):在pos位置(地址)插入区间为[beg,end)的元素。
swap(v1.v2):交换两个数组
deque的遍历方式
1.数组下标。2.迭代器(逆向迭代器)。3.at函数
#include <iostream>
#include <vector>
#include <list>
#include <deque>
using namespace std;
int main(void)
{
deque<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec.push_back(4);
vec.push_back(5);
cout << "向量的大小:" << vec.size() << endl;
// 数组下标方式遍历vector
for (int i = 0; i < vec.size(); i++)
cout << vec[i] << " ";
cout << endl;
// 迭代器方式遍历vector
deque<int>::iterator itor = vec.begin();
for (; itor != vec.end(); itor++)
cout << *itor << " ";
cout << endl;
//set()方式
for(int i=0;i<vec.size();i++)
cout<<vec.at(i);
return 0;
}
deque的所有函数
1.deque的构造函数
deque<T> deqT;//默认构造形式
deque(beg, end);//构造函数将[beg, end)区间中的元素拷贝给本身。
deque(n, elem);//构造函数将 n 个 elem 拷贝给本身。
deque(const deque &deq);//拷贝构造函数
2.deque的赋值函数
assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。
assign(n, elem);//将 n 个 elem 拷贝赋值给本身。
deque& operator=(const deque &deq); //重载等号操作符
swap(deq);// 将deq与本身的元素互换
3.deque的大小
deque.size();//返回容器中元素的个数
deque.empty();//判断容器是否为空
deque.resize(num);//重新指定容器的长度为 num,若容器变长, 则以默认值新位置。 如果容器变短, 则末尾超出容器长度的元素被删除。
deque.resize(num, elem); //重新指定容器的长度为 num,若容器变长, 则以 elem 值填充新位置,如果容器变短, 则末尾超出容器长度的元素被删除。
4.deque的插入和删除
push_back(elem);//在容器尾部添加一个数据
push_front(elem);//在容器头部插入一个数据
pop_back();//删除容器最后一个数据
pop_front();//删除容器第一个数据
5.deque的数据存取
at(idx);//返回索引 idx 所指的数据, 如果 idx 越界, 抛出 out_of_range。
operator[];//返回索引 idx 所指的数据, 如果 idx 越界, 不抛出异常, 直接出错。
front();//返回第一个数据。
back();//返回最后一个数据
6.deque的插入函数
insert(const_iterator pos,elem);//在 pos 位置插入一个 elem 元素的拷贝, 返回新数据的位置。
insert(const_iterator pos,n,elem);//在 pos 位置插入 n 个 elem 数据, 无返回值。
insert(const_iterator pos,const_iterator beg,const_iterator end);//在 pos 位置插入[beg,end)区间(可以是自己的区间也可以是别的deque的区间)的数据, 无返回值。
7.deque的删除函数
clear();//移除容器的所有数据
erase(const_iterator beg,const_iterator end);//删除[beg,end)区间的数据, 返回下一个数据的位置。
erase(const_iterator pos);//删除 pos 位置的数据, 返回下一个数据的位置。