C++ STL deque(双端队列)

 

模板

template <class T, class Alloc = allocator<T> > class deque;

双端队列(deque -> double ended queue),deque是序列容器,并且在使用时动态分配容器的大小。

deque提供类似于vector的功能,但在序列的开头也可以有效地插入和删除元素,而vector仅支持在尾部操作。但是,与vector不同的是deque不能保证将其所有元素存储在连续的存储位置中,因此deque不允许指针偏移来访问另一个元素,否则将会导致未定义的行为发生。

vector 和 deque都提供了非常相似的接口,可以用于类似的目的,但内部都以完全不同的方式进行工作。虽然vector偶尔也需要重新分配内存以扩大数组的长度,但vector所存储的内容仍然保持在一个连续的内存地址中,而deque的元素则分散在不同的存储块中,并且在容器的内部保持必要的信息(下一元素的位置),以便能在恒定的时间内通过统一的顺序接口(迭代器)直接访问其任何元素。因此,deque在内部比vector稍微复杂一些,但也增加了一定的灵敏性,特别是在非常长的序列中,使用vector重新分配内存的开销会非常的昂贵。

对于在队列开头或结尾之外的位置频繁插入删除元素的情况,deque的性能会变得很差。

容器的属性

序列:

序列容器中的元素按严格的线性顺序排序。各个元素按其顺序访问它们的位置。

动态数组:

通常使用动态数组实现deque,它允许直接访问序列中的任何元素,并在序列的开头或者结尾提供相对快速的增加或删除。

成员类型

member typedefinitionnotes
value_typeThe first template parameter (T) 
allocator_typeThe second template parameter (Alloc)defaults to: allocator<value_type>
referencevalue_type& 
const_referenceconst value_type& 
pointerallocator_traits<allocator_type>::pointerfor the default allocator: value_type*
const_pointerallocator_traits<allocator_type>::const_pointerfor the default allocator: const value_type*
iteratorrandom access iterator to value_typeconvertible to const_iterator
const_iteratorrandom access iterator to const value_type 
reverse_iteratorreverse_iterator<iterator> 
const_reverse_iteratorreverse_iterator<const_iterator> 
difference_typea signed integral type, identical to:
iterator_traits<iterator>::difference_type
usually the same as ptrdiff_t
size_typean unsigned integral type that can represent any non-negative value of difference_typeusually the same as size_t

成员函数:

(constructor):无参构造函数,当使用deque时,创建一个deque对象,但不包含任何元素。

(destructor)  :析构函数,当所创建的deque对象不再使用时,使用析构函数释放所占用的一切资源。

    operator=      :拷贝构造函数,copy当前对象及所有数据。

迭代器: 

begin:返回双端队列的开始位置迭代器。

end   :返回双端队列的最后一个元素的下一位置的迭代器。

rbegin:返回双端队列反向开始迭代器,即返回原始队列的最后一个元素的迭代器。

rend:返回双端队列方向最后一个元素的前一个位置的迭代器,即返回原始队列的第一个元素的前一个位置的迭代器。

cbegin:返回双端队列开始元素的常量迭代器,即不可以通过cbegin所返回的迭代器修改队列元素的值。

cend:返回双端队列结束元素最后一个元素的下一位置的常量迭代器,也不可以通过此迭代器修改元素的值。

crbegin:返回双端队列反向头元素的常量迭代器(等于cbegin+rbegin)。

crend:返回双端队列反向最后一个元素的下一位置的常量迭代器(等于cend+rend)。

容器:

size:返回双端队列的大小。

max_size:返回双端队列可以达到的最大可能大小,但容器无法保证能够达到该大小。

resize:改变双端队列的大小。

empty:返回双端队列是否为空,为空则返回true,否则返回false。

shrink_to_fir:请求减少容器内存使用量以适应其大小。(deque容器可能拥有比保存其当前元素所需的更多内存,这是因为大多数库是使用动态数组实现的deque,可以保留已删除元素的已分配空间或提前分配额外容量以允许更快的插入操作。此函数请求内存使用量适应容器的当前大小,但请求是非绑定的,否则容器实现可以自由地优化其内存使用。 请注意,此函数不会更改容器的大小)。

元素访问:

operator[] :通过下标访问队列指定位置的元素。

at:通过下标访问队列指定位置的元素,与[] 等价。

front:返回双端队列的头元素,若队列为空 会导致未定义的行为发生。

back:返回双端队列的尾元素,若队列为空 会导致未定义的行为发生。

容器的更改:

assign:将新内容分配给deque容器,替换其当前内容,并相应地修改其大小。(使用assign之后,原容器中保存的任何元素都被销毁并被新构造的元素替换)

    参数:

  • first, last:将迭代器输入到序列中的初始位置和最终位置。 使用的范围是[first,last),其中包括first和last之间的所有元素,包括first指向的元素,但不包括last指向的元素。 函数模板参数Input Iterator应该是一个输入迭代器类型,它指向可以构造value_type对象的类型的元素。
  • n:新容器的大小,数据类型为无符号整型。
  • val:新容器的n个元素均使用val进行初始化。
  • il:initializer_list对象。 编译器将自动从初始化列表声明器构造此类对象。 成员类型value_type是容器中元素的类型,在deque中定义为其第一个模板参数(T)的别名。

push_back:在双端队列的末尾位置添加一个元素。

push_front:在双端队列的起始位置之前插入一个元素。

pop_back:删除deque容器中的最后一个元素,有效地将容器大小减少一个。

pop_front:删除deque容器中的第一个元素,有效地将容器大小减少一个。

insert:在指定位置插入新元素,并返回插入的第一个新元素的迭代器参数如下:

  • position:新元素插入的位置。
  • val:插入新元素的值。
  • n:插入元素的个数,并且插入的每个元素都是用val的值进行初始化。
  • first,last:将迭代器输入到序列中的初始位置和最终位置。
  • il:initialize_list对象,拷贝这些对象的元素插入到position处。

erase:从容器中移除指定位置的元素或移除指定范围内的所有元素,并返回指向函数调用移除的最后一个元素后面元素的新位置的迭代器。如果移除的是最后一个元素,则返回原容器的最后一个元素的迭代器。

  • position:移除容器中position处的元素。
  • first,last:移除[first, last)之间的所有元素。

swap:void swap(deque& x); 使用x 的内容交换容器的内容,x是包含相同类型元素的另一个deque对象,尺寸可能不同。在调用此成员函数之后,此容器中的元素是在调用之前在x中的元素,而x的元素是在此中的元素。所有迭代器,引用和指针对交换的对象仍然有效。Note,存在一个非成员函数,其名称相同,交换,重载该算法,其优化行为与此成员函数类似。

clear:移除容器中的所有元素,容器的size变为0。

emplace(const_iterator position, Args&& args):通过在position处插入新元素来扩展容器,这个新元素使用args作为其构造参数来构造。

emplace_front:在容器的开头插入新元素,新元素使用args作为其构造参数来构造。使容器的大小加一,与push_front类似。

emplace_back:在容器的结尾处插入新元素,新元素使用args作为其构造参数来构造。使容器的大小加一,与push_back类似。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值