C++ STL之deque(双端队列)的使用_c++ deque取队尾

目录

简介

代码

运行截图

常用函数


简介

双端队列(double-ended queue),顾名思义,两端都可以操作,插入和删除。而且,还可以在中间进行操作。

内部采用线性表顺序结构,与vector不同的是,deque采用分块的线性存储结构存储数据,每块大小512字节。

所有的deque块使用一个Map块进行管理,每个Map数据项纪录各个deque块的首地址。

当考虑容器内部的内存分配策略和操作性能时,deque相对于vector更有优势,同时,也可以用下标来访问。

迭代器

代码

/*
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的使用

有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里无偿获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 12
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值