deque
序列式容器
序列式容器都有着共同的特征
- 序列式容器的元素按严格线性排列
- 可以按顺序访问他们的元素
- 只有一个前驱和后继
- 每一个数据所在的位置的都是固定的
- array vector list deque都属于序列式容器
vector是单端的 而deque是双端的
双端队列deque
- deque双端队列也是一个动态数组, 内部的结构是有一定顺序性的, 的确的底层实现是一个链式数组
- 相比vector没有的函数, deque由于底层是一个不连续的数组内存之间组成的, 所以没有指针内存的一些操作
头文件 #include<deque.>
定义: deque<数据类型>变量名
deque特点
- deuqe是双端队列的数据结构, 可以在队首和队尾高效的添加和删除元素, 对于我们前面的vector, 它是比较具有优势的
- duque内部是采用分段连续的内存来存储元素的, 在插入元素的时候随时都可以重新增加一段新的空间并且连接起来, 因此虽然提供了随机访问操作, 但是访问的速度相对vector还是要慢的
- deque并没有data函数, 因为deque的元素并没有放在数组中, 所以不能兼容C语言
- deque因为没有固定的内容空间, 所以不能提供capacity和reserve的操作
void push_front(); //从头部添加数据
void pop_front(); //从头部删除数据
void emplace_front(); //从头部添加数据
//push_front 和 emplace_front 功能一致,底层略有不同
相比vector没有的函数,deque由于底层是一个不连续的数组内存之间组成的,所以没有指针内存的一些
操作
deque容器没有下列的功能
void capcity()=delete;
//不能获取内存空间
void reserve()=delete;
//不能改变空间大小
void shrink_to_fit()=delete;
//不能缩减空间大小
//无法将数据给C语言函数使用
//没有固定的数组指针
void data();
#include<iostream>
#include<deque>
#include<algorithm> //算法库
using namespace std;
template <typename T>
ostream& operator<<(ostream& os, const deque<T>dq)
{
for (auto e : dq)
{
os << e<<" ";
}
cout << endl;
return os;
}
//push_back(尾插)
void text1()
{
deque<int>dq{ 1,2,3,4,5 };
dq.push_back(6);
cout << dq;
}
//push_front(头插)
void text2()
{
deque<int>dq{ 1,2,3,4,5 };
dq.push_front(0);
cout << dq;
}
//pop_front(头删)
void text3()
{
deque<int>dq{ 1,2,3,4,5 };
dq.pop_front();
cout << dq;
}
//pop_back(尾删)
void text4()
{
deque<int>dq{ 1,2,3,4,5 };
dq.pop_back();
cout << dq;
}
//sort(排序,需要添加算法库#include<algorithm>)
void text5()
{
deque<int>dq = { 32,2,4,3,5,6,8,7,6,4,5,1 };
sort(dq.begin(), dq.end());
cout << dq;
}
//find(查找元素并返回下标)
void text6()
{
int a = 8;
deque<int>dq = { 32,2,4,3,5,6,8,7,6,4,5,1 };
auto e = find(dq.begin(), dq.end(), a);
cout << "[" << e - dq.begin() << "]" << " " << *e << endl;
}
//反向迭代器(rbegin,rend)
void text7()
{
deque<int>dq = { 32,2,4,3,5,6,8,7,6,4,5,1 };
for (auto i = dq.rbegin();i != dq.rend(); i++)
{
cout << *i << " ";
}
cout << endl;
}
//常量迭代器
void text8()
{
deque<int>dq = { 1,2,3,4,5,6,7,8,9,10 };
for (auto i = dq.cbegin(); i != dq.cend(); i++)
{
cout << *i << " ";
}
cout << endl;
}
//反向常量迭代器
void text9()
{
deque<int>dq = { 1,2,3,4,5,6,7,8,9,10 };
for (auto i = dq.crbegin(); i != dq.crend(); i++)
{
cout << *i << " ";
}
cout << endl;
}
int main()
{
text9();
}