zoukankan      html  css  js  c++  java
  • STL --> deque双向队列

    deque简介

      deque是双向开口的连续性存储空间。虽说是连续性存储空间,但这种连续性只是表面上的,实际上它的内存是动态分配的,它在堆上分配了一块一块的动态储存区,每一块动态存储去本身是连续的,deque自身的机制把这一块一块的存储区虚拟地连在一起。

      它首次插入一个元素,默认会动态分配512字节空间,当这512字节空间用完后,它会再动态分配自己另外的512字节空间,然后虚拟地连在一起。deque 的这种设计使得它具有比vector复杂得多的架构、算法和迭代器设计。它的性能损失比之vector,是几个数量级的差别。所以说,deque要慎用。

    函数 描述
    c.assign(beg,end)
    c.assign(n,elem)
    将[beg; end)区间中的数据赋值给c。
    将n个elem的拷贝赋值给c。
    c.at(idx) 传回索引idx所指的数据,如果idx越界,抛出out_of_range。
    c.back() 传回最后一个数据,不检查这个数据是否存在。
    c.begin() 传回迭代器重的可一个数据。
    c.clear() 移除容器中所有数据。
    deque<Elem> c
    deque<Elem> c1(c2)
    Deque<Elem> c(n)
    Deque<Elem> c(n, elem)
    Deque<Elem> c(beg,end)
    c.~deque<Elem>()
    创建一个空的deque。
    复制一个deque。
    创建一个deque,含有n个数据,数据均已缺省构造产生。
    创建一个含有n个elem拷贝的deque。
    创建一个以[beg;end)区间的deque。
    销毁所有数据,释放内存。
    c.empty() 判断容器是否为空。
    c.end() 指向迭代器中的最后一个数据地址。
    c.erase(pos)
    c.erase(beg,end)
    删除pos位置的数据,传回下一个数据的位置。
    删除[beg,end)区间的数据,传回下一个数据的位置。
    c.front() 传回地一个数据。
    get_allocator 使用构造函数返回一个拷贝。
    c.insert(pos,elem)
    c.insert(pos,n,elem)
    c.insert(pos,beg,end)
    在pos位置插入一个elem拷贝,传回新数据位置。
    在pos位置插入>n个elem数据。无返回值。
    在pos位置插入在[beg,end)区间的数据。无返回值。
    c.max_size() 返回容器中最大数据的数量。
    c.pop_back() 删除最后一个数据。
    c.pop_front() 删除头部数据。
    c.push_back(elem) 在尾部加入一个数据。
    c.push_front(elem) 在头部插入一个数据。
    c.rbegin() 传回一个逆向队列的第一个数据。
    c.rend() 传回一个逆向队列的最后一个数据的下一个位置。
    c.resize(num) 重新指定队列的长度。
    c.size() 返回容器中实际数据的个数。
    C1.swap(c2)
    Swap(c1,c2)
    将c1和c2元素互换。
    同上操作。

     

    deque的使用范例:

     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: 是一个double-ended queue,
        1)支持随即存取,也就是[]操作符,
        2)支持两端操作,push(pop)-back(front),在两端操作上与list效率差不多

        因此在实际使用时,如何选择这三个容器中哪一个,应根据你的需要而定,一般应遵循下面的原则:
        1、如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector
        2、如果你需要大量的插入和删除,而不关心随即存取,则应使用list
        3、如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque。
    */

    出处:http://blog.csdn.net/morewindows/article/details/6946811

  • 相关阅读:
    机器学习作业12--朴素贝叶斯-垃圾邮件分类
    机器学习作业11--分类与监督学习,朴素贝叶斯分类算法
    机器学习作业9--主成分分析
    机器学习作业8--特征选择
    机器学习作业7--逻辑回归实践
    机器学习作业6--逻辑回归
    实验五 单元测试
    实验二 结对编程 第二阶段
    实验二 结对编程第一阶段
    实验一 GIT代码版本管理
  • 原文地址:https://www.cnblogs.com/jeakeven/p/4552944.html
Copyright © 2011-2022 走看看