[STL基础]双端队列deque之用法

本文详细介绍了C++标准库中的双端队列deque的各种操作方法,包括定义与初始化、增删元素、元素访问、迭代器使用以及其他常用功能。通过具体实例展示了deque在实际编程中的应用。

deque的函数共有五大类:定义及初始化,增加删除元素,访问元素,返回迭代器,其他 

[cpp]   view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include <string>  
  2. #include <deque>  
  3. #include <conio.h>  
  4. #include<iostream>  
  5. using namespace std;    
  6. //定义及初始化;无返回值或void  
  7. void PrintDequeInt(deque<int> param)  
  8. {  
  9.     for (deque<int>::iterator iter=param.begin();iter!=param.end();iter++)  
  10.     {  
  11.         cout<<*iter<<" ";  
  12.     }  
  13.     cout<<endl;     
  14. }  
  15. void PrintDequeString(deque<string> param)  
  16. {  
  17.     for (deque<string>::iterator iter=param.begin();iter!=param.end();iter++)  
  18.     {  
  19.         cout<<*iter<<" ";  
  20.     }  
  21.     cout<<endl;     
  22. }  
  23. void test0()  
  24. {    
  25.     deque<int> d;//创建一个空的deque  
  26.     deque<int> de(2);//创建一个deque,含有2个缺省默认的数据0  
  27.     deque<int> deq(3,5);//创建一个含有3个5拷贝的deque  
  28.     deque<int> dequ(deq);//复制一个deque  
  29.     deque<int> first(dequ.begin(),dequ.end());//创建一个以[beg,end)区间的deque  
  30.     PrintDequeInt(first);//5 5 5  
  31.     d.assign(2,7);  
  32.     PrintDequeInt(d);//7 7  
  33.     de.assign(deq.begin(),deq.end());  
  34.     PrintDequeInt(de);//5 5 5  
  35.     //deque,list,vector的完全相同  
  36. }  
  37. //增加删除元素;返回值为void,除erase()的返回值为iterator外  
  38. void test1()  
  39. {    
  40.     deque<string> first(2);//创建一个deque,含有2个缺省默认的数据" "  
  41.     cout<<first.at(0)<<" "<<first.at(1)<<" "<<endl;  
  42.     first.push_back("world");//在尾部加入一个数据  
  43.     first.push_front("hello ");//在头部插入一个数据  
  44.     first.pop_back();//删除最后一个数据  
  45.     first.pop_front();//删除头部数据  
  46.        
  47.     first.assign(1,"women");  
  48.     PrintDequeString(first);  
  49.     first.insert(first.begin()+1,"nihao");//在pos位置插入一个“nihao”;返回新数据的位置;注意pos位置要存在,eg:此begin()+2就不行,因为它表示第3个位置  
  50.     PrintDequeString(first); //women nihao  
  51.     first.insert(first.end(),2,"W");//注意他返回的是void  
  52.     PrintDequeString(first);//women nihao W W  
  53.     //first.insert(first.end(),first.begin(),first.end()); 不可以,当vector却可以   
  54.   
  55.     first.erase(first.begin());//删除pos位置的数据,返回下一个数据的位置  
  56.     PrintDequeString(first);//nihao W W  
  57.     first.erase(first.begin(),first.begin()+2);//删除[beg,end)区间的数据;放回下一个数据的位置  
  58.     PrintDequeString(first);//W  
  59.     first.clear();//删除容器中所有的的数据,可以用empty()来判断是否删除完  
  60.     //比vector多提供了pop_front()和push_front(),其他的完全相同  
  61.     //与list提供的函数完全相同,不过list的参数first.begin()不可以+1,+2,而deque却可以  
  62. }  
  63. //访问获取元素;返回值为TYPE T  
  64. void test2()  
  65. {    
  66.     string str[]={"one","two","three","four","five","six"};  
  67.     deque<string> ve(str,str+6);   
  68.     for(int i=0;i<6;i++)   
  69.     {   
  70.         cout<<ve.at(i)<<" ";//使用at()通过i来进行访问,也不能越界。若越界,在调试时,会抛出异常;在运行时直接弹出错误  
  71.     }  
  72.     cout<<endl;  
  73.     cout<<ve.front()<<endl;//one //返回第一个元素的引用  
  74.     cout<<ve.back()<<endl;//six //返回最后一个元素的引用   
  75.     //与vector完全相同,也提供了at()  
  76.     //比list多提供了一个访问元素的函数at()  
  77. }  
  78. //返回迭代器;返回值为iterator或reverse_iterator  
  79. void test3()  
  80. {    
  81.     deque<int>ve(4);  
  82.     ve[0]=0;ve[1]=1;ve[2]=2;ve[3]=3;  
  83.     cout<<ve[0]<<" "<<ve[1]<<" "<<ve[2]<<" "<<ve[3]<<endl;  
  84.     deque<int>::iterator iter;//定义一个迭代器iter  
  85.     iter=ve.begin();//返回一个iterator,它指向deque第一个元素  
  86.     cout<<*iter<<endl;//0  
  87.     iter=ve.end();//返回一个iterator,它指向deque最末尾元素的下一个位置(它不是末尾元素)  
  88.     //cout<<*iter<<endl;//会出现错误  
  89.     cout<<*(iter-1)<<endl;//3 用此方法访问末尾元素  
  90.     deque<int>::reverse_iterator reIter;//定义一个反向的迭代器  
  91.     reIter=ve.rbegin();//返回一个方向iterator,它指向deque末尾元素  
  92.     cout<<*reIter<<endl;//3  
  93.     reIter=ve.rend();//返回一个方向iterator,它指向deque第一个元素之前的位置(它是不存在的)  
  94.     cout<<*(reIter-1)<<endl;//0  用此方法访问第一个元素  
  95.     //与vector提供的函数与用法完全相同  
  96.     //与list提供的函数相同,用法略有不同:list的iterator不可以加减n;deque却可以  
  97. }   
  98. //其他  
  99. void test4()  
  100. {    
  101.     deque<string> ve(8,"ss");  
  102.     cout<<ve.size()<<endl;//8  
  103.     cout<<ve.max_size()<<endl;//134217727,10737441823   
  104.     ve.resize(2);//重置长度2    cout<<ve[2]<<endl;//会有问题因为[2]不存在      
  105.     deque<string> de(4,"hh");  
  106.     de.swap(ve);//将de与ve元素互换  
  107.     cout<<ve.size()<<" "<<ve.front()<<endl;//4 hh  
  108.     cout<<de.size()<<" "<<de.front()<<endl;//2 ss  
  109.     //比vector少了获得容量函数capacity(),设置容量函数reserve()  
  110.     //比list少了sort(),merge(),remove(),remove_if(),reverse(),splice(),unique()  
  111. }   
  112. //遍历deque  
  113. void test5()  
  114. {    
  115.     deque<int> vec;  
  116.     for (int i=0;i<10;i++)  
  117.     {  
  118.         vec.push_back(i);  
  119.     }  
  120.     for (int i=0;i<vec.size();i++)   
  121.         cout<<vec[i]<<" ";  
  122.     cout<<endl;  
  123.   
  124.     deque<int>::iterator iter;  
  125.     for (iter=vec.begin();iter!=vec.end();iter++)  
  126.         cout<<*iter<<" ";  
  127.     cout<<endl;  
  128.   
  129.     deque<int>::reverse_iterator reIter;  
  130.     for (reIter=vec.rbegin();reIter!=vec.rend();reIter++)   
  131.         cout<<*reIter<<" ";//9 8 7 6 5 4 3 2 1 0  
  132.     cout<<endl;  
  133.   
  134.     deque<int>::reverse_iterator revIter;  
  135.     for (revIter=vec.rend()-1;revIter!=vec.rbegin();revIter--)   
  136.         cout<<*revIter<<" ";//0 1 2 3 4 5 6 7 8 //有点残缺  
  137.     cout<<endl;  
  138. }   
  139. void Test(char h)  
  140. {  
  141.     cout<<"press key===="<<h<<endl;  
  142.     switch(h)  
  143.     {   
  144.     case '0':  test0();break;  
  145.     case '1':  test1();break;  
  146.     case '2':  test2();break;  
  147.     case '3':  test3();break;  
  148.     case '4':  test4();break;  
  149.     case '5':  test5();break;   
  150.     case 27:  
  151.     case 'q':exit(0);break;   
  152.     default:cout<<"default "<<h<<endl;break;  
  153.     }  
  154. }  
  155. void main()  
  156. {  
  157.     while(1)  
  158.     {  
  159.         Test(getch());  
  160.     }   
  161. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值