目录
简介
双端队列(double-ended queue),顾名思义,两端都可以操作,插入和删除。而且,还可以在中间进行操作。
内部采用线性表顺序结构,与vector不同的是,deque采用分块的线性存储结构存储数据,每块大小512字节。
所有的deque块使用一个Map块进行管理,每个Map数据项纪录各个deque块的首地址。
当考虑容器内部的内存分配策略和操作性能时,deque相对于vector更有优势,同时,也可以用下标来访问。
![](https://i-blog.csdnimg.cn/blog_migrate/bebba7bc534ac8dc1dc5500d74107a85.gif)
代码
/*
deque
Author:YuBo
Date:2018/2/5
*/
#include<iostream>
#include<deque>
using namespace std;
deque<int> d;
deque<int>::iterator it;
void menu()
{
cout<<"******1.入队 2.出队**********"<<endl;
cout<<"******3.读取队顶 4.读取队尾******"<<endl;
cout<<"******5.队中元素个数 6.显示队列******"<<endl;
cout<<"******7.退出 **********"<<endl;
}
void PUSH()
{
int i,j,place,n,N;
cout<<"******1.前插 2.后插 3.中间插入*****"<<endl;
cin>>j;
switch(j)
{
case 1:{//前面插入,后移
cout<<"请输入你要输入的整数个数:"<<endl;
cin>>N;
cout<<"请输入"<<N<<"个整数:"<<endl;
for(i=0;i<N;i++)
{
cin>>n;
d.push_front(n);
}
}break;
case 2:{ //从后面插入,扩张队列
cout<<"请输入你要输入的整数个数:"<<endl;
cin>>N;
cout<<"请输入"<<N<<"个整数:"<<endl;
for(i=0;i<N;i++)
{
cin>>n;
d.push_back(n);
}
}break;
case 3:{//中间插,后移
cout<<"请输入你要插入的位置(首位置为0):"<<endl;
cin>>place;
cout<<"请输入你要插入的数值:"<<endl;
cin>>n;
d.insert(d.begin()+place,n);
}break;
default:cout<<"输入错误!"<<endl;
}
}
void POP()
{
int i,j,place,N;
cout<<"******1.前删 2.后删 3.中间删 4.清空*****"<<endl;
cin>>j;
switch(j)
{
case 1:{
cout<<"请输入你要删除的整数个数:"<<endl;
cin>>N;
if(N>d.size())cout<<"里面没有这么多元素。。。"<<endl;
else{
for(i=0;i<N;i++)
{
d.pop_front();
}
}
}break;
case 2:{
cout<<"请输入你要删除的整数个数:"<<endl;
cin>>N;
if(N>d.size())cout<<"里面没有这么多元素。。。"<<endl;
else{
for(i=0;i<N;i++)
{
d.pop_back();
}
}
}break;
case 3:{
cout<<"请输入你要删除的位置(首位置为0):"<<endl;
cin>>place;
if(place<0||place>d.size())cout<<"位置超界。"<<endl;
else{
it=d.begin();
d.erase(it+place);
}
}break;
case 4:{
d.clear();
}break;
default:cout<<"输入错误!"<<endl;
}
}
void Getfront()
{
if(d.empty())cout<<"队已经空了!"<<endl;
else cout<<"队顶元素为:"<<d.front()<<endl;
}
void Getback()
{
if(d.empty())cout<<"队已经空了!"<<endl;
else cout<<"队尾元素为:"<<d.back()<<endl;
}
void Getsize()
{
cout<<"双端队列的大小为:"<<d.size()<<endl;
}
void Display()
{
int i;
for(i=0;i<d.size();i++)
cout<<d[i]<<" ";
cout<<endl;
}
int main()
{
int i;
while(1)
{
menu();
cout<<"请输入菜单号:"<<endl;
cin>>i;
if(i==7)break;
switch(i)
{
case 1:PUSH();break;
case 2:POP();break;
case 3:Getfront();break;
case 4:Getback();break;
case 5:Getsize();break;
case 6:Display();break;
default:cout<<"输入错误!";break;
}
}
return 0;
}
运行截图
-------------------------------------------------2020-08-29更新----------------------------------------
常用函数
常用函数成员 | 函数功能 |
---|---|
begin() | 返回指向容器中第一个元素的迭代器。 |
end() | 返回指向容器最后一个元素所在位置后一个位置的迭代器,通常和 begin() 结合使用。 |
rbegin() | 返回指向最后一个元素的迭代器。 |
rend() | 返回指向第一个元素所在位置前一个位置的迭代器。 |
size() | 返回实际元素个数。 |
empty() | 判断容器中是否有元素,若无元素,则返回 true;反之,返回 false。 |
shrink _to_fit() | 将内存减少到等于当前元素实际所使用的大小。 |
at() | 使用经过边界检查的索引访问元素。 |
front() | 返回第一个元素的引用。 |
back() | 返回最后一个元素的引用。 |
assign() | 用新元素替换原有内容。 |
push_back() | 在序列的尾部添加一个元素。 |
push_front() | 在序列的头部添加一个元素。 |
pop_back() | 移除容器尾部的元素。 |
pop_front() | 移除容器头部的元素。 |
insert() | 在指定的位置插入一个或多个元素。 |
erase() | 移除一个元素或一段元素。 |
clear() | 移出所有的元素,容器大小变为 0。 |
swap() | 交换两个容器的所有元素。 |
emplace() | 在指定的位置直接生成一个元素。 |
emplace_front() | 在容器头部生成一个元素。和 push_front() 的区别是,该函数直接在容器头部构造元素,省去了复制移动元素的过程。 |
emplace_back() | 在容器尾部生成一个元素。和 push_back() 的区别是,该函数直接在容器尾部构造元素,省去了复制移动元素的过程。 |
和 vector 相比,额外增加了实现在容器头部添加和删除元素的成员函数,同时删除了 capacity()、reserve() 和 data() 成员函数。
deque 容器在重载 [] 运算符时,没有实现边界检查的功能呢?答案很简单,因为性能。所以,提高编程逻辑性,不要越界,不使用at函数。
更多STL例子:C++ STL的使用
有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。