2020-10-27

std::deque 双端队列

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

介绍

双端队列(deque)是有两个尾部的队列(double-ended-queue)的缩写。它是一个尺寸可变的线性序列的容器,可在两端进行扩张或缩减。
特定的库可能将双端队列用在特定场合,通常是用作动态的数组。但是在某些场景,它允许通过迭代器对元素进行随机读取,同时根据需要通过扩张或缩减来动态的管理存储。
因此,它在功能上与vector相近,并且提供了可以在首部处理数据的高效操作。但是与vector不同的是,deque中并不是所有数据都存储在一个连续的内存空间中,通过指针的偏置来读取数据可能被认作未定义的行为。
vector和deque提供了相似的接口而且基本上被用作相似的目的,但是内部的实现却不同。vector在内部只使用了一个单独的数组来存储元素,只有在需要扩大容量时才会改变存储的位置(用一个新的数组);而quede的元素却分布在一块块的内存中,因此它在内部维护了一些必要的信息来保证能在常量时间下用统一的顺序的几口(迭代器)直接读取元素。因此deque的内部实现比vector更复杂,不过这样的好处是在某些情况下能够更高效的扩大容量,尤其是存储极长的序列时(通常重分配的时间成本会很高)。
对于非首尾部元素的插入和删除,deque的效率是较低的,而且相比链表和单链表它的迭代器的关联性较弱(这句话不太懂)。

dequevector
分块存储连续存储
首尾都能操作只能尾部
长序列时重分配较高效长序列时重分配效率较低
内部实现复杂内部实现简单
deque和vector的简单对比

容器属性

  • 顺序性
    容器中的元素按顺序存放在一个严格线性的序列中,单个元素可以通过它们的位置直接读取。
  • 动态性
    通常被用作动态数组,它允许了对容器中元素的直接访问,而且提供了对首尾部元素的操作接口。
  • 分配器感知
    deque使用了一个分配器对象来动态的管理它的存储。

模板参数

  • T
    元素的类型,别名deque::value_type

  • Alloc
    分配器对象的类型,它通常被用来定义存储分配模型。默认情况,allocator类会被使用来定义最简单的内存分配模型而且它是自变量(value_independent)。别名deque::allocator_type

成员函数

  • 构造函数
/* 默认构造函数 */
explicit deque(const allocator_type& alloc = allocator_type());
/* 尺寸为n的构造函数 */
deque(size_type n);
deque(size_type n, const value_type& val, const allocator_type& alloc = allocator_type());
/* 使用另一个容器某一范围的元素来初始化deque */
template <typename InputIterator>
deque(InputIterator first, InputIterator last, const allocator_type& alloc = allocator_type());
/* 拷贝构造函数 */
deque(const deque& x);
deque(const deque& x, const allocator_type& alloc = allocator_type());
/* 移动构造函数 */
deque(deque&& x);
deque(deque&& x, const allocator_type& alloc = allocator_type());
/* 初始化列表 */
deque(initializer_list<value_type> il, const allocator_type& alloc = allocator_type());

移动构造和拷贝构造的典型区别:拷贝构造中参数对象保留自己的数据成员(通常是成员指针指向的堆内存);移动构造中不一定,通常会将成员指针指向的堆内存直接“送给”被初始化的对象。

迭代器

begin() end() rbegin() rend() cbegin() cend() crbegin() crend()

容量

size()
max_size()
empty()
resize()
shrink_to_fit()

元素读取

operator[]
at()
front()
back()
/* 没有data()函数,也说明不要用指针去访问deque中的元素 */

元素操作

assign()
push_back()
push_front()
pop_back()
pop_front()
insert()
erase()
swap()
clear()
emplace()
emplace_front()
emplace_back()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值