zoukankan      html  css  js  c++  java
  • deque双向队列(转)

    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中数据: ");  
    19.     for (i = 0; i < 20; ++i)  
    20.         printf("%d ", ideq[i]);  
    21.     putchar(' ');  
    22.   
    23.     //在头尾加入新数据  
    24.     printf(" 在头尾加入新数据... ");  
    25.     ideq.push_back(100);  
    26.     ideq.push_front(i);  
    27.   
    28.     //输出deque  
    29.     printf(" 输出deque中数据: ");  
    30.     for (pos = ideq.begin(); pos != ideq.end(); pos++)  
    31.         printf("%d ", *pos);  
    32.     putchar(' ');  
    33.   
    34.     //查找  
    35.     const int FINDNUMBER = 19;  
    36.     printf(" 查找%d ", FINDNUMBER);  
    37.     pos = find(ideq.begin(), ideq.end(), FINDNUMBER);  
    38.     if (pos != ideq.end())  
    39.         printf("find %d success ", *pos);  
    40.     else  
    41.         printf("find failed ");  
    42.   
    43.     //在头尾删除数据  
    44.     printf(" 在头尾删除数据... ");  
    45.     ideq.pop_back();  
    46.     ideq.pop_front();  
    47.   
    48.     //输出deque  
    49.     printf(" 输出deque中数据: ");  
    50.     for (pos = ideq.begin(); pos != ideq.end(); pos++)  
    51.         printf("%d ", *pos);  
    52.     putchar(' ');  
    53.     return 0;  
    54. }  

    运行结果如下:

    另外要注意一点。对于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;
    }
     
     
  • 相关阅读:
    Oracle 修改带数据的字段类型
    Oracle的主键约束、唯一约束与外键约束
    Oracle 唯一 索引 约束 创建 删除
    Oracle 在Drop表时的Cascade Constraints
    iTunes备份注意
    谈判的四种风格
    求平均速度
    网站推荐的代码自动生成软件实际使用感触
    DOTA游戏相关的文章
    魔兽争霸3不能弹出输入法原因
  • 原文地址:https://www.cnblogs.com/handsomecui/p/5205352.html
Copyright © 2011-2022 走看看