zoukankan      html  css  js  c++  java
  • STL---deque(双端队列)

      Deque是一种优化了的、对序列两端元素进行添加和删除操作的基本序列容器。它允许较为快速地随机访问,但它不像vector 把所有的对象保存在一块连续的内存块,而是采用多个连续的存储块,并且在一个映射结构中保存对这些块及其顺序的跟踪。向deque 两端添加或删除元素的开销很小。它不需要重新分配空间,所以向末端增加元素比vector 更有效。

      其内部结构如下图所示:

    deque和vector很类似,也是采用动态数组来管理元素。

    使用deque之前需包含头文件:

    #include <deque>

    它是定义在命名空间std内的一个class template:

    template<class _Ty,class _Ax = allocator<_Ty> > class deque;

    第一个template参数用来表示元素型别,第二个可有可无,指定内存模型。一般使用默认的内存模型。

    与vector不同的是deque的动态数组首尾都开放,因此能够在首尾进行快速地插入和删除操作。

    deque的逻辑结构如下:

    deque的特点:

    1、支持随机访问,即支持[]以及at(),但是性能没有vector好。

    2、可以在内部进行插入和删除操作,但性能不及list。

    deque和vector的不同之处:

    1、两端都能够快速插入和删除元素。vector只能在尾端进行。

    2、deque的元素存取和迭代器操作会稍微慢一些。因为deque的内部结构会多一个间接过程。

    3、迭代器是特殊的智能指针,而不是一般指针。它需要在不同的区块之间跳转

    4、deque可以包含更多的元素,其max_size可能更大。因为不止使用一块内存。

    5、不支持对容量和内存分配时机的控制。

      注意:在除了首尾两端的其他地方插入和删除元素,都将会导致指向deque元素的任何pointers、references、iterators 失效。不过,deque的内存重分配优于vector。因为其内部结构显示不需要复制所有元素。

    6、deque的内存区块不再被使用时,会被释放。deque的内存大小是可缩减的。不过,是不是这么做以及怎么做由实作版本定义。

    deque和vector相似的特性:

    1、在中间部分插入和删除元素相对较慢,因为所有元素都要被移动。

    2、迭代器属于随即存取迭代器。

    最好采用deque的情形:

    1、需要在两端插入和删除元素。

    2、无需引用容器内的元素。

    3、要求容器释放不再使用的元素。

     deque成员函数

    (1)    构造函数

      deque();//创建一个空双向队列

          deque( size_type size );                                                 // 创建一个大小为size的双向队列

          deque( size_type num, const TYPE &val );                      //放置num个val的拷贝到队列中

          deque( const deque &from );                                         // 从from创建一个内容一样的双向队列

          deque( input_iterator start, input_iterator end );           // start 和 end - 创建一个队列,保存从start到end的元素。

    (2)    增加函数

    void push_front(const T& x):双端队列头部增加一个元素X

    void push_back(const T& x):双端队列尾部增加一个元素x

    iterator insert(iterator it,const T& x):双端队列中某一元素增加一个元素x

    void insert(iterator it,int n,const T& x):双端队列中某一元素增加n个相同的元素x

    void insert(iterator it,const_iterator first,const_iteratorlast):双端队列中某一元素插入另一个相同类型向量的[forst,last)间的数据

    (3)    删除函数

    Iterator erase(iterator it):删除双端队列中的某一个元素

    Iterator erase(iterator first,iterator last):删除双端队列中[first,last)中的元素

    void pop_front():删除双端队列中最前一个元素

    void pop_back():删除双端队列中最后一个元素

    void clear():清空双端队列中最后一个元素

    (4)    遍历函数

    reference at(int pos):返回pos位置元素的引用

    reference front():返回手元素的引用

    reference back():返回尾元素的引用

    iterator begin():返回指向第一个元素的迭代器

    iterator end():返回指向向量中最后一个元素下一个元素的迭代器(不包含在向量中)

    reverse_iterator rbegin():反向迭代器,指向最后一个元素

    reverse_iterator rend():反向迭代器,指向第一个元素的前一个元素

    (5)    判断函数

    bool empty() const:向量是否为空,若true,则向量中无元素

    (6)    大小函数

    Int size() const:返回向量中元素的个数

    int max_size() const:返回最大可允许的双端对了元素数量值

    (7)    其他函数

    void swap(deque&):交换两个同类型向量的数据

    void assign(int n,const T& x):向量中第n个元素的值设置为x

    cplusplus中的deque讲解

     

  • 相关阅读:
    hystrix熔断器之HystrixRequestLog
    RXJAVA之聚合操作
    RXJAVA之变换操作
    RXJAVA之创建被观察者
    小程序学习
    redis的使用
    Stream/Bytes[]/Image对象相互转化
    消息队列转载
    业务层使用事务
    ViewState 和字段属性的差异
  • 原文地址:https://www.cnblogs.com/wujing-hubei/p/5671531.html
Copyright © 2011-2022 走看看