deque双向队列是一种双向开口的连续线性空间,可以高效的在头尾两端插入和删除元素,deque在接口上和vector非常相似,下面列出deque的常用成员函数:
deque的实现比较复杂,内部会维护一个map(注意!不是STL中的map容器)即一小块连续的空间,该空间中每个元素都是指针,指向另一段(较大的)区域,这个区域称为缓冲区,缓冲区用来保存deque中的数据。因此deque在随机访问和遍历数据会比vector慢。具体的deque实现可以参考《STL源码剖析》,当然此书中使用的SGI STL与VS2008所使用的PJ STL的实现方法还是有区别的。下面给出了deque的结构图:
由于篇幅问题,deque的实现细节就不再深入了,下面给出deque的使用范例:
- //双向队列 deque
- //by MoreWindows http://blog.csdn.net/morewindows
- #include <deque>
- #include <cstdio>
- #include <algorithm>
- using namespace std;
- int main()
- {
- deque<int> ideq(20); //Create a deque ideq with 20 elements of default value 0
- deque<int>::iterator pos;
- int i;
- //使用assign()赋值 assign在计算机中就是赋值的意思
- for (i = 0; i < 20; ++i)
- ideq[i] = i;
- //输出deque
- printf("输出deque中数据: ");
- for (i = 0; i < 20; ++i)
- printf("%d ", ideq[i]);
- putchar(' ');
- //在头尾加入新数据
- printf(" 在头尾加入新数据... ");
- ideq.push_back(100);
- ideq.push_front(i);
- //输出deque
- printf(" 输出deque中数据: ");
- for (pos = ideq.begin(); pos != ideq.end(); pos++)
- printf("%d ", *pos);
- putchar(' ');
- //查找
- const int FINDNUMBER = 19;
- printf(" 查找%d ", FINDNUMBER);
- pos = find(ideq.begin(), ideq.end(), FINDNUMBER);
- if (pos != ideq.end())
- printf("find %d success ", *pos);
- else
- printf("find failed ");
- //在头尾删除数据
- printf(" 在头尾删除数据... ");
- ideq.pop_back();
- ideq.pop_front();
- //输出deque
- printf(" 输出deque中数据: ");
- for (pos = ideq.begin(); pos != ideq.end(); pos++)
- printf("%d ", *pos);
- putchar(' ');
- return 0;
- }
运行结果如下:
另外要注意一点。对于deque和vector来说,尽量少用erase(pos)和erase(beg,end)。因为这在中间删除数据后会导致后面的数据向前移动,从而使效率低下。
转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/6946811
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<vector> #include<queue> using namespace std; const int INF=0x3f3f3f3f; #define mem(x,y) memset(x,y,sizeof(x)) #define SI(x) scanf("%d",&x) #define PI(x) printf("%d",x) #define SD(x) scanf("%lf",&x) #define P_ printf(" ") typedef long long LL; const int MAXN=200010; int m[MAXN],a[MAXN]; int main(){ deque<int>q(20); deque<int>::iterator iter; for(int i=10;i<20;i++)q[i]=i; q.push_front(100); q.push_back(50); for(iter=q.begin();iter!=q.end();iter++)printf("%d ",*iter);puts(""); q.pop_front();q.pop_back(); iter=q.end();iter--; printf("%d %d ",*q.begin(),*iter); return 0; }