STL

来源:互联网 发布:藏宝阁买号软件 编辑:程序博客网 时间:2024/06/05 05:39
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.push_back(elem); //在容器尾部添加一个数据
deque.push_front(elem); //在容器头部插入一个数据
deque.pop_back(); //删除容器最后一个数据

deque.pop_front(); //删除容器第一个数据

[cpp] view plain copy
  1. <span style="white-space:pre">    </span>deque<int> deqInt;  
  2.     deqInt.push_back(1);  
  3.     deqInt.push_back(3);  
  4.     deqInt.push_back(5);  
  5.     deqInt.push_back(7);  
  6.     deqInt.push_back(9);  
  7.     deqInt.pop_front();  
  8.     deqInt.pop_front();  
  9.     deqInt.push_front(11);  
  10.     deqInt.push_front(13);  
  11.     deqInt.pop_back();  
  12.     deqInt.pop_back();  
  13. //deqInt  { 13,11,5}  

deque的数据存取
理论知识:
deque.at(idx); //返回索引idx所指的数据,如果idx越界,抛出out_of_range。
deque[idx]; //返回索引idx所指的数据,如果idx越界,不抛出异常,直接出错。
deque.front(); //返回第一个数据。
deque.back(); //返回最后一个数据
[cpp] view plain copy
  1. <span style="white-space:pre">    </span>deque<int> deqInt;  
  2.     deqInt.push_back(1);  
  3.     deqInt.push_back(3);  
  4.     deqInt.push_back(5);  
  5.     deqInt.push_back(7);  
  6.     deqInt.push_back(9);  
  7.     int iA = deqInt.at(0);      //1  
  8.     int iB = deqInt[1];         //3  
  9.     deqInt.at(0) = 99;          //99  
  10.     deqInt[1] = 88;         //88  
  11.   
  12.     int iFront = deqInt.front();    //99  
  13.     int iBack = deqInt.back();  //9  
  14.     deqInt.front() = 77;            //77  
  15.     deqInt.back() = 66;         //66  

deque与迭代器
理论知识
deque.begin(); //返回容器中第一个元素的迭代器。
deque.end(); //返回容器中最后一个元素之后的迭代器。
deque.rbegin(); //返回容器中倒数第一个元素的迭代器。
deque.rend(); //返回容器中倒数最后一个元素之后的迭代器。

[cpp] view plain copy
  1. <span style="white-space:pre">        </span>deque<int> deqInt;  
  2.         deqInt.push_back(1);  
  3.         deqInt.push_back(3);  
  4.         deqInt.push_back(5);  
  5.         deqInt.push_back(7);  
  6.         deqInt.push_back(9);  
  7.   
  8.         for (deque<int>::iterator it=deqInt.begin(); it!=deqInt.end(); ++it)  
  9.         {  
  10.             cout << *it;  
  11.             cout << "";  
  12.         }  
  13.     // 1 3 5 7 9  
  14.   
  15.         for (deque<int>::reverse_iterator rit=deqInt.rbegin(); rit!=deqInt.rend(); ++rit)  
  16.         {  
  17.             cout << *rit;  
  18.             cout << "";  
  19.         }  
  20.     //9 7 5 3 1  

deque对象的带参数构造
理论知识
deque(beg,end); //构造函数将[beg, end)区间中的元素拷贝给本身。注意该区间是左闭右开的区间。
deque(n,elem); //构造函数将n个elem拷贝给本身。
deque(const deque &deq); //拷贝构造函数。
[cpp] view plain copy
  1. <span style="white-space:pre">        </span>deque<int> deqIntA;  
  2.         deqIntA.push_back(1);  
  3.         deqIntA.push_back(3);  
  4.         deqIntA.push_back(5);  
  5.         deqIntA.push_back(7);  
  6.         deqIntA.push_back(9);  
  7.   
  8.         deque<int> deqIntB(deqIntA.begin(),deqIntA.end());        //1 3 5 7 9  
  9.         deque<int> deqIntC(5,8);                          //8 8 8 8 8  
  10.         deque<int> deqIntD(deqIntA);                      //1 3 5 7 9  

deque的赋值
理论知识
deque.assign(beg,end); //将[beg, end)区间中的数据拷贝赋值给本身。注意该区间是左闭右开的区间。
deque.assign(n,elem); //将n个elem拷贝赋值给本身。
deque& operator=(const deque &deq); //重载等号操作符 
deque.swap(deq); // 将vec与本身的元素互换
[cpp] view plain copy
  1. <span style="white-space:pre">        </span>deque<int> deqIntA,deqIntB,deqIntC,deqIntD;  
  2.         deqIntA.push_back(1);  
  3.         deqIntA.push_back(3);  
  4.         deqIntA.push_back(5);  
  5.         deqIntA.push_back(7);  
  6.         deqIntA.push_back(9);  
  7.   
  8.         deqIntB.assign(deqIntA.begin(),deqIntA.end());  // 1 3 5 7 9  
  9.           
  10.         deqIntC.assign(5,8);                        //8 8 8 8 8  
  11.   
  12.         deqIntD = deqIntA;                          //1 3 5 7 9  
  13.   
  14.         deqIntC.swap(deqIntD);                      //互换  

deque的大小
理论知识
deque.size(); //返回容器中元素的个数
deque.empty(); //判断容器是否为空
deque.resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
deque.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
[cpp] view plain copy
  1. <span style="white-space:pre">        </span>deque<int> deqIntA;  
  2.         deqIntA.push_back(1);  
  3.         deqIntA.push_back(3);  
  4.         deqIntA.push_back(5);  
  5.   
  6.         int iSize = deqIntA.size();  //3  
  7.   
  8.         if (!deqIntA.empty())  
  9.         {  
  10.             deqIntA.resize(5);      //1 3 5 0 0  
  11.             deqIntA.resize(7,1);    //1 3 5 0 0 1 1  
  12.             deqIntA.resize(2);      //1 3  
  13.         }  

deque的插入
理论知识
deque.insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
deque.insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值。
deque.insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值。
[cpp] view plain copy
  1. <span style="white-space:pre">    </span>deque<int> deqA;  
  2.     deque<int> deqB;  
  3.   
  4.     deqA.push_back(1);  
  5.     deqA.push_back(3);  
  6.     deqA.push_back(5);  
  7.     deqA.push_back(7);  
  8.     deqA.push_back(9);  
  9.   
  10.     deqB.push_back(2);  
  11.     deqB.push_back(4);  
  12.     deqB.push_back(6);  
  13.     deqB.push_back(8);  
  14.       
  15.     deqA.insert(deqA.begin(), 11);      //{11, 1, 3, 5, 7, 9}  
  16.     deqA.insert(deqA.begin()+1,2,33);       //{11,33,33,1,3,5,7,9}  
  17.     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位置的数据,返回下一个数据的位置。
[cpp] view plain copy
  1. 删除区间内的元素  
  2. deqInt是用deque<int>声明的容器,现已包含按顺序的1,3,5,6,9元素。  
  3. deque<int>::iterator itBegin=deqInt.begin()+1;  
  4. deque<int>::iterator itEnd=deqInt.begin()+3;  
  5. deqInt.erase(itBegin,itEnd);  
  6. //此时容器deqInt包含按顺序的1,6,9三个元素。  
  7.   
  8.   
  9.   
  10. 假设 deqInt 包含1,3,2,3,3,3,4,3,5,3,删除容器中等于3的元素  
  11. for(deque<int>::iterator it=deqInt.being(); it!=deqInt.end(); )    //小括号里不需写  ++it  
  12. {  
  13.    if(*it == 3)  
  14.    {  
  15.         it  =  deqInt.erase(it);       //以迭代器为参数,删除元素3,并把数据删除后的下一个元素位置返回给迭代器。  
  16.          //此时,不执行  ++it;    
  17.    }  
  18.    else  
  19.    {  
  20.        ++it;  
  21.    }  
  22. }  
  23.   
  24. //删除deqInt的所有元素  
  25. deqInt.clear();         //容器为空  

demo

[cpp] view plain copy
  1. #include <iostream>  
  2. #include <cstdio>  
  3. #include <deque>  
  4. #include <algorithm>  
  5.   
  6. using namespace std;  
  7.   
  8. void printDeque(deque<int> &d)  
  9. {  
  10.     for (deque<int>::iterator it = d.begin(); it != d.end(); it++) {  
  11.         cout << *it << ' ';  
  12.     }  
  13.     cout << endl;  
  14. }  
  15.   
  16. void dequeInit()  
  17. {  
  18.     deque<int> d1;  
  19.     d1.push_back(1);  
  20.     d1.push_back(3);  
  21.     d1.push_back(5);  
  22.   
  23.     d1.push_front(-11);  
  24.     d1.push_front(-33);  
  25.     d1.push_front(-55);  
  26.     printDeque(d1);  
  27.     // -55 -33 -11 1 3 5  
  28.   
  29.     cout << "front element: " << d1.front() << endl;  
  30.     // front element: -55  
  31.     cout << "back element: " << d1.back() << endl;  
  32.     // back element: 5  
  33.       
  34.     d1.pop_front();  
  35.     d1.pop_back();  
  36.     printDeque(d1);  
  37.     // -33 -11 1 3  
  38.   
  39.     // 查找1在d1中的位置  
  40.     deque<int>::iterator it = find(d1.begin(), d1.end(), 1);  
  41.     if (it != d1.end()) {  
  42.         cout << "position of 1: " << distance(d1.begin(), it) << endl;  
  43.     }  
  44.     else {  
  45.         cout << "no 1\n";  
  46.     }  
  47.     // position of 1: 2  
  48. }  
  49.   
  50. int main()  
  51. {  
  52.     dequeInit();  
  53.   
  54.     return 0;  
  55. }  
原创粉丝点击