STL系列之一 deque双向队列

来源:互联网 发布:如何学计算机编程 编辑:程序博客网 时间:2024/05/20 13:06

deque双向队列是一种双向开口的连续线性空间,可以高效的在头尾两端插入和删除元素,deque在接口上和vector非常相似,下面列出deque的常用成员函数:

 

deque的实现比较复杂,内部会维护一个map(注意!不是STL中的map容器)即一小块连续的空间,该空间中每个元素都是指针,指向另一段(较大的)区域,这个区域称为缓冲区,缓冲区用来保存deque中的数据。因此deque在随机访问和遍历数据会比vector慢。具体的deque实现可以参考《STL源码剖析》,当然此书中使用的SGI STL与VS2008所使用的PJ STL的实现方法还是有区别的。下面给出了deque的结构图:

 

由于篇幅问题,deque的实现细节就不再深入了,下面给出deque的使用范例:

[cpp] view plain copy
  1. //双向队列 deque  
  2. //by MoreWindows http://blog.csdn.net/morewindows  
  3. #include <deque>  
  4. #include <cstdio>  
  5. #include <algorithm>  
  6. using namespace std;  
  7. int main()  
  8. {  
  9.     deque<int> ideq(20); //Create a deque ideq with 20 elements of default value 0  
  10.     deque<int>::iterator pos;  
  11.     int i;  
  12.   
  13.     //使用assign()赋值  assign在计算机中就是赋值的意思  
  14.     for (i = 0; i < 20; ++i)  
  15.         ideq[i] = i;  
  16.       
  17.     //输出deque  
  18.     printf("输出deque中数据:\n");  
  19.     for (i = 0; i < 20; ++i)  
  20.         printf("%d ", ideq[i]);  
  21.     putchar('\n');  
  22.   
  23.     //在头尾加入新数据  
  24.     printf("\n在头尾加入新数据...\n");  
  25.     ideq.push_back(100);  
  26.     ideq.push_front(i);  
  27.   
  28.     //输出deque  
  29.     printf("\n输出deque中数据:\n");  
  30.     for (pos = ideq.begin(); pos != ideq.end(); pos++)  
  31.         printf("%d ", *pos);  
  32.     putchar('\n');  
  33.   
  34.     //查找  
  35.     const int FINDNUMBER = 19;  
  36.     printf("\n查找%d\n", FINDNUMBER);  
  37.     pos = find(ideq.begin(), ideq.end(), FINDNUMBER);  
  38.     if (pos != ideq.end())  
  39.         printf("find %d success\n", *pos);  
  40.     else  
  41.         printf("find failed\n");  
  42.   
  43.     //在头尾删除数据  
  44.     printf("\n在头尾删除数据...\n");  
  45.     ideq.pop_back();  
  46.     ideq.pop_front();  
  47.   
  48.     //输出deque  
  49.     printf("\n输出deque中数据:\n");  
  50.     for (pos = ideq.begin(); pos != ideq.end(); pos++)  
  51.         printf("%d ", *pos);  
  52.     putchar('\n');  
  53.     return 0;  
  54. }  

运行结果如下:

另外要注意一点。对于deque和vector来说,尽量少用erase(pos)和erase(beg,end)。因为这在中间删除数据后会导致后面的数据向前移动,从而使效率低下。

 

 

转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/6946811

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 痔疮出血怎么办 大便干燥出血怎么办 痔疮流血不止怎么办 母乳性腹泻怎么办 经常性拉肚子怎么办 宝宝大便出血怎么办 孩子大便干燥怎么办 大便带血怎么办 孩子大便出血怎么办 月经流血不止怎么办 鼻子流血不止怎么办 癌胚抗原偏高怎么办 血糖值偏高怎么办 值班血糖高 怎么办 血糖太高怎么办 血糖正常值偏高怎么办 体检血糖偏高怎么办 空腹血糖偏高怎么办 低血糖头晕怎么办 空腹血糖10.1怎么办 空腹血糖高怎么办 血糖高怎么办 尿检红细胞高怎么办 尿红细胞偏高怎么办 尿红细胞236怎么办 肝功能指数高怎么办 血脂偏高怎么办 大便隐血怎么办 血红细胞偏低怎么办 白细胞太低怎么办 淋巴细胞数偏高怎么办 淋巴细胞偏低怎么办 饥荒青蛙雨怎么办 产后奶水少怎么办 奶水越来越少怎么办 月子奶水不足怎么办 奶水清淡怎么办 中年人腿疼怎么办 中老年人腿疼怎么办 吹空调喉咙痛怎么办 吹空调头疼怎么办