一、deque的介绍
1、deque是一种动态大小的双端队列,属于序列式容器,两端均可伸缩;
2、特定的库可以以不同的方式实现deque ,但是通常都是一种动态数组,不论任何情况下,它都允许通过随机访问迭代器的方式直接访问单个元素,可以根据需要动态伸缩;
3、deque 提供了一些与 vector 类似的功能,但是 deque 在头部和尾部的插入过程中效率更高,与 vector 不同的是,deque 不能保证所有的元素存储在连续空间中,在 deque 中通过指针加偏移量的方式访问元素可能会导致非法操作;
4、vector 与 list 提供了一些类似的接口,但是内部实现原理不同:vector 使用了动态数组,deque 中的元素可能分散在不同的存储块中,在deque中保存了一些必要的信息,通常用来在常数范围内直接访问 deque的任何一个元素, 所以deque 的内部实现比 vector 复杂;
5、除了在频繁的头、尾插入和删除外,deque 比list 和 forward_list性能更差;
二、deque的使用
1、deque的构造
函数声明 | 接口说明 |
deque() | 构造空的双端队列 |
deque(size_type n,const value_type& val = value_type()) | 用n个val来构造双端队列 |
deque(Inputlterator first,Inputlterator last) | 用[first,last)区间里构造 |
deque(const deque& x) | 拷贝构造 |
void MakeDequeTest() {
deque<int> d1;
deque<int> d2(5);
deque<int> d3(5, 5);
vector<int> v{ 9,5,2,7 };
deque<int> d4(v.begin(),v.end());
deque<int> d5(d4);
PrintDeque(d1);
PrintDeque(d2);
PrintDeque(d3);
PrintDeque(d4);
PrintDeque(d5);
}
2、deque的迭代器
双端队列底层是一段假象的连续空间,实际上是分层的,为了维护其假象,落在了deque的迭代器上;
函数声明 | 接口说明 |
iterator begin() | 返回deque的起始位置 |
iterator end() | 返回deque最后一个元素的下一位置 |
reverse_iterator rbegin() | 返回deque其实位置的反向迭代器(end) |
reverse_iterator rend() | 返回deque最后一个元素的下一位置(begin) |
const_iterator cbegin() const | 返回deque起始位置的const 迭代器 |
cnost_iterator cend() const | 返回deque最后一个元素的下一位置const |
const_reverse_iterator crbegin() const | 返回deque起始位置(crend) |
const_reverse_iterator crend() const | 返回deque最后一个元素下个位置(crbegin) |
void DequeIteratorTest() {
int array[] = { 1,2,3,4,5,6,7,8,9 };
deque<int> d(array, array + sizeof(array) / sizeof(int));
for (auto it = d.cbegin(); it != d.cend(); ++it)
cout << *it << " ";
cout << endl;
for (auto it = d.crbegin(); it != d.crend(); ++it)
cout << *it << " ";
cout << endl;
}
3、deque capacity
函数声明 | 接口说明 |
size_type size() cosnt | 返回deque中有效元素个数 |
bool empty() const | 检测deque是否为空 |
void resize(size_type sz,T c = T()) | 将deque的元素改变到sz个,多余部分填c |
4、deque的元素访问操作
函数声明 | 接口说明 |
reference operator[](size_type n) | 返回n位置上元素的引用 |
const_reference operator[](size_type n)const | 返回n位置上元素的cosnt 引用 |
reference front() | 返回首元素的引用 |
const_reference front() cosnt | 返回首元素的const 引用 |
reference back() | 返回最后一个元素的引用 |
const_reference back() cosnt | 返回最后一个元素的cosnt 引用 |
5、deque中修改操作
函数声明 | 接口说明 |
void push_back(const value_type* val) | 尾插 |
void pop_back() | 尾删 |
void push_front(const valuse_type* val) | 头插 |
void pop_front() | 头删 |
iterator insert(iterator position,const value_type& val) | 在pos插入val |
void insert(iterator position,size_type n,const value_type& val) | 在pos插入n个val |
void insert(iterator position,Inputlterator frist,Inputlterator last) | 在pos插入[frist,last) |
iterator erase(iterator position) | 删除pos,并返回下一个位置 |
iterator erase(iterator first,iterator last) | 删除[frist,last),并返回last的位置 |
void swap(deque& x) | 交换 |
void clear() | 清空 |
iterator empalce(const_iterator position,Args.. args) | 在pos处构造元素,将元素所需要内容通过参数类表传入 |
void empalce_front(Args.. args) | 在头部构造元素 |
void empalce_backe(Args.. args) | 在尾部构造元素 |
void Test() {
deque<int> d1{ 3,4,5 };
d1.push_back(6);
d1.push_front(2);
PrintDeque(d1);
cout << d1.size() << endl;
cout << d1.front() << endl;
cout << d1.back() << endl;
d1.emplace_back(7);
d1.emplace_front(1);
PrintDeque(d1);
d1.insert(d1.begin(), 0);
PrintDeque(d1);
d1.pop_front();
d1.pop_back();
d1.erase(d1.begin());
PrintDeque(d1);
d1.clear();
PrintDeque(d1);
}
三、deque的应用场景
deque在序列容器中是比较鸡肋的,应用如果只是简单的存储元素,使用vector即可,如果对元素任意位置进入插入或者删除操作比较多,使用vector即可,所以一般很少使用deque 。但是deque 的最大应用就是对 stack 和 queue 的底层结构;