步步为营(十)常用数据结构(3)STL-Deque(双端队列)

和前两个不同,双端队列(double-end queue)更像是一种折衷的产物。可能是人们发现Vector和List的水火不容,于是发明了这么一个集两家所长的东西。

双端队列具有Vector和List的优点,或者说二者的特征点都可以在Deque里实现。

我真想说,这是一个凑不要脸的结构……原因如下:

  1. 支持随机访问(下标访问,也就是[]操作符)(Vector)
  2. 支持在两端进行数据插入和删除(List)
  3. Vector因为连续内存访问快,List因为动态内存消耗少,于是…… Deque在内部使用连续内存+链表的方式把一块一块的连续内存串联起来使用~

诸葛村夫都要炸了好吗~我从未见过如此厚颜无耻之结构!!!
好了,不闹了。

双端队列由于吸取了List和Vector的优点,使得在同一种结构下可以进行某种操作都可以消耗尽量少的资源,使得在很多复杂条件下,Deque的使用变得相当顺手。

但是Deque在单项性能上还是比不过单纯的List或者Vector,也就是说:

  1. 如果你需要高效的随即存取,而不在乎插入和删除的效率,使用Vector
  2. 如果你需要大量的插入和删除,而不关心随即存取,则应使用List
  3. 如果你需要随即存取,而且关心两端数据的插入和删除,则应使用Deque

好一个黑-白-灰组合~~

下面列出Deque的成员函数说明:

      deque<Elem> c     创建一个空的deque。

      deque<Elem> c1(c2)     复制一个deque。

      deque<Elem> c(n)     创建一个deque,含有n个数据,数据均已缺省构造产生。

      deque<Elem> c(n, elem)    创建一个含有n个elem拷贝的deque

      deque<Elem> c(beg,end)     创建一个以[beg;end)区间的deque

      ~deque<Elem>()     销毁所有数据,释放内存


      assign(beg,end)    将[beg; end)区间中的数据赋值给c。

      assign(n,elem)    将n个elem的拷贝赋值给c。

       at(idx)     传回索引idx所指的数据,如果idx越界,抛出out_of_range。

      back()     传回最后一个数据,不检查这个数据是否存在。

      begin()    传回迭代器中的第一个数据。

      clear()     移除容器中所有数据。

      empty()    判断容器是否为空。

      end()    指向迭代器中的最后一个数据地址。

     erase(pos)     删除pos位置的数据,传回下一个数据的位置。

     erase(beg,end)     删除[beg,end)区间的数据,传回下一个数据的位置。

     front()     传回第一个数据。

     get_allocator    使用构造函数返回一个拷贝。

     insert(pos,elem)     在pos位置插入一个elem拷贝,传回新数据位置

     insert(pos,n,elem)     在pos位置插入>n个elem数据。无返回值

     insert(pos,beg,end)    在pos位置插入在[beg,end)区间的数据。无返回值

     max_size()     返回容器中最大数据的数量。

     pop_back()     删除最后一个数据。

     pop_front()    删除头部数据。

     push_back(elem)    在尾部加入一个数据。

     push_front(elem)    在头部插入一个数据。

     rbegin()    传回一个逆向队列的第一个数据。

     rend()    传回一个逆向队列的最后一个数据的下一个位置。

     resize(num)     重新指定队列的长度。

     size()    返回容器中实际数据的个数。

     swap(c2)   将c1和c2元素互换。

     swap(c1,c2)     将c1和c2元素互换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值