deque的基本知识及案例

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/zys15195875600/article/details/81564636

deque的基本知识 

deque是“double-ended queue”的缩写,和vector一样都是STL的容器,deque是双端数组,而vector是单端的。
deque在接口上和vector非常相似,在许多操作的地方可以直接替换。
deque可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法,这个等下会详讲)。
deque头部和尾部添加或移除元素都非常快速。但是在中部安插元素或移除元素比较费时。
#include <deque> 

deque的默认构造

deque采用模板类实现,deque对象的默认构造形式:             deque<T> deqT; 
deque <int> deqInt;               //一个存放int的deque容器。
deque <float> deq Float;       //一个存放float的deque容器。
deque <string> deq String;     //一个存放string的deque容器。
...                
 //尖括号内还可以设置指针类型或自定义类型。

deque的带参构造
deque(beg,end);      //构造函数将[beg, end)区间中的元素拷贝给本身。注意该区间是左闭右开的区间。
deque(n,elem);       //构造函数将n个elem拷贝给本身。
deque(const deque  &deq);  //拷贝构造函数。
 eg:
         deque<int>    deqIntA;
         deqIntA.push_back(1);     //在后面插入1
         deqIntA.push_back(3);
         deqIntA.push_back(5);
         deqIntA.push_back(7);
         deqIntA.push_back(9);
 
         deque<int> deqIntB(deqIntA.begin(),deqIntA.end());        //1 3 5 7 9
         deque<int> deqIntC(5,8);                                //8 8 8 8 8
         deque<int> deqIntD(deqIntA);                        //1 3 5 7 9

deque的添加移除操作
deque.push_back(elem);    //在容器尾部添加一个数据
deque.push_front(elem);    //在容器头部插入一个数据
deque.pop_back();             //删除容器最后一个数据
deque.pop_front();             //删除容器第一个数据
 eg:
    deque<int> deqInt;
    deqInt.push_back(1);
    deqInt.push_back(3);
    deqInt.push_back(5);
    deqInt.push_back(7);
    deqInt.push_back(9);
    deqInt.pop_front();
    deqInt.pop_front();       //5,7,9
    deqInt.push_front(11);
    deqInt.push_front(13);     //13,11,5,7,9
    deqInt.pop_back();          //13,11,5,7
    deqInt.pop_back();                      //deqInt  { 13,11,5}

deque的数据存取
deque.at(idx);             //返回索引idx所指的数据,如果idx越界,抛出out_of_range。
deque[idx];                 //返回索引idx所指的数据,如果idx越界,不抛出异常,直接出错。
deque.front();             //返回第一个数据。
deque.back();            //返回最后一个数据

eg:
            deque<int> deqInt;
            deqInt.push_back(1);
            deqInt.push_back(3);
            deqInt.push_back(5);
            deqInt.push_back(7);
            deqInt.push_back(9);
 
            int iA = deqInt.at(0);        //1
            int iB = deqInt[1];             //3
            deqInt.at(0) = 99;             //99
            deqInt[1] = 88;             //88
 
            int iFront = deqInt.front();    //99
            int iBack = deqInt.back();     //9
            deqInt.front() = 77;                //77
            deqInt.back() = 66;                 //66

deque的迭代器
deque.begin();  //返回容器中第一个元素的迭代器。
deque.end();  //返回容器中最后一个元素之后的迭代器。
deque.rbegin();  //返回容器中倒数第一个元素的迭代器。
deque.rend();   //返回容器中倒数最后一个元素之后的迭代器。
 eg:
         deque<int> deqInt;
         deqInt.push_back(1);
         deqInt.push_back(3);
         deqInt.push_back(5);
         deqInt.push_back(7);
         deqInt.push_back(9);
 
         for (deque<int>::iterator it=deqInt.begin(); it!=deqInt.end(); ++it)
         {
             cout << *it;
             cout << "";
         }                            // 1 3 5 7 9
 
         for (deque<int>::reverse_iterator rit=deqInt.rbegin(); rit!=deqInt.rend(); ++rit)
         {
             cout << *rit;
             cout << "";
         }                            //9 7 5 3 1

deque的赋值
deque.assign(beg,end);    //将[beg, end)区间中的数据拷贝赋值给本身。注意该区间是左闭右开的区间。
deque.assign(n,elem);  //将n个elem拷贝赋值给本身。
deque& operator=(const deque &deq);    //重载等号操作符
deque.swap(deq);  // 将vec与本身的元素互换
 eg:
         deque<int> deqIntA,deqIntB,deqIntC,deqIntD;
         deqIntA.push_back(1);
         deqIntA.push_back(3);
         deqIntA.push_back(5);
         deqIntA.push_back(7);
         deqIntA.push_back(9);
 
         deqIntB.assign(deqIntA.begin(),deqIntA.end());    // 1 3 5 7 
         deqIntC.assign(5,8);                          //8 8 8 8 8
         deqIntD = deqIntA;                            //1 3 5 7 9
         deqIntC.swap(deqIntD);                       //互换

 

deque的大小
deque.size();     //返回容器中元素的个数
deque.empty();     //判断容器是否为空
deque.resize(num);   //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
deque.resize(num, elem);  //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
 
         deque<int> deqIntA;
         deqIntA.push_back(1);
         deqIntA.push_back(3);
         deqIntA.push_back(5);
 
         int iSize = deqIntA.size();  //3
 
         if (!deqIntA.empty())
         {
             deqIntA.resize(5);         //1 3 5 0 0
             deqIntA.resize(7,1); //1 3 5 0 0 1 1
             deqIntA.resize(2);         //1 3

deque的插入

deque.insert(pos,elem);   //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
deque.insert(pos,n,elem);   //在pos位置插入n个elem数据,无返回值。
deque.insert(pos,beg,end);   //在pos位置插入[beg,end)区间的数据,无返回值。
 eg:
    deque<int> deqA;
    deque<int> deqB;
 
    deqA.push_back(1);
    deqA.push_back(3);
    deqA.push_back(5);
    deqA.push_back(7);
    deqA.push_back(9);
 
    deqB.push_back(2);
    deqB.push_back(4);
    deqB.push_back(6);
    deqB.push_back(8);
   
    deqA.insert(deqA.begin(), 11);       //{11, 1, 3, 5, 7, 9}
    deqA.insert(deqA.begin()+1,2,33);        //{11,33,33,1,3,5,7,9}
    deqA.insert(deqA.begin() , deqB.begin() , deqB.end() );    //{2,4,6,8,11,33,33,1,3,5,7,9}

deque的删除
deque.clear();     //移除容器的所有数据
deque.erase(beg,end);  //删除[beg,end)区间的数据,返回下一个数据的位置。
deque.erase(pos);    //删除pos位置的数据,返回下一个数据的位置。
 
删除区间内的元素
deqInt是用deque<int>声明的容器,现已包含按顺序的1,3,5,6,9元素。
deque<int>::iterator itBegin=deqInt.begin()+1;
deque<int>::iterator itEnd=deqInt.begin()+3;
deqInt.erase(itBegin,itEnd);
//此时容器deqInt包含按顺序的1,6,9三个元素。
 eg:
假设 deqInt 包含1,3,2,3,3,3,4,3,5,3,删除容器中等于3的元素
for(deque<int>::iterator it=deqInt.being(); it!=deqInt.end(); )    //小括号里不需写  ++it
{
   if(*it == 3)
   {
        it  =  deqInt.erase(it);       //以迭代器为参数,删除元素3,并把数据删除后的下一个元素位置返回给迭代器。
         //此时,不执行  ++it; 
   }
   else
   {
       ++it;
   }
}
 
//删除deqInt的所有元素
deqInt.clear();            //容器为空
        

  1. #include <iostream>
  2. #include <deque>
  3. using namespace std;
  4. int main()
  5. {
  6. deque< int> d1( 10);
  7. for( int i= 0;i<d1.size();i++)
  8. {
  9. d1[i]=i;
  10. }
  11. d1.push_back( 99); //向最后加入99
  12. d1.push_front( 88); //向开头加入88
  13. d1.front()= 77; //将第一个元素替换成77
  14. d1.back()= 1; //将最后一个元素替换成1
  15. // d1.pop_back(); //去除掉最后一个元素
  16. d1.pop_front(); //去除掉第一个元素
  17. for( deque< int>::iterator it=d1.begin();it!=d1.end();it++)
  18. {
  19. cout << it << " ";
  20. }
  21. cout << endl;
  22. cout << "***********" << endl;
  23. int array[]={ 2, 6, 3, 5, 3, 5, 2, 6, 8};
  24. deque< int> d2( array, array+ sizeof( array)/ sizeof( array[ 0]));
  25. deque< int>::iterator it =d2.begin();
  26. while(it!=d2.end())
  27. {
  28. if(*it== 3)
  29. {
  30. it=d2.erase(it); //返回下一个元素的迭代器
  31. }
  32. else
  33. {
  34. it++;
  35. }
  36. }
  37. for(it =d2.begin();it!=d2.end();it++) //正向迭代器
  38. {
  39. cout << *it << " ";
  40. }
  41. cout << endl;
  42. return 0;
  43. }

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值