deque,双端队列是有索引的序列容器。不同于 [[vector]] 存储在一个大块中,deque 采用单独分配的固定尺寸数组,因此它拥有较大的最小内存开销。
## 定义
```cpp
template <class _Ty,
class _Alloc = allocator<_Ty>>
class deque // In namespace std
```
## 成员类型
### allocator_type
```cpp
using allocator_type = _Alloc;
```
内存分配器类型。
### value_type
```cpp
using value_type = _Ty;
```
值类型。
### size_type
```cpp
using size_type = typename _Alty_traits::size_type;
```
长度类型。
### difference_type
```cpp
using difference_type = typename _Alty_traits::difference_type;
```
差异类型。
### pointer
```cpp
using pointer = typename _Alty_traits::pointer;
```
指针类型。
### const_pointer
```cpp
using const_pointer = typename _Alty_traits::const_pointer;
```
常量指针类型。
### reference
```cpp
using reference = _Ty&;
```
引用类型。
### const_reference
```cpp
using const_reference = const _Ty&;
```
常量引用类型。
### iterator
```cpp
using iterator = _Deque_iterator<_Scary_val>;
```
迭代器类型。
### const_iterator
```cpp
using const_iterator = _Deque_const_iterator<_Scary_val>;
```
常量迭代器类型。
### reverse_iterator
```cpp
using reverse_iterator = _STD reverse_iterator<iterator>;
```
反向迭代器类型。
### const_reverse_iterator
```cpp
using const_reverse_iterator = _STD reverse_iterator<const_iterator>;
```
常量反向迭代器类型。
## 成员函数
### 构造函数
```cpp
deque()
```
构造空的 deque。
```cpp
explicit deque(const _Alloc& _Al)
```
由指定内存分配器构造空的 deque。
```cpp
explicit deque(_CRT_GUARDOVERFLOW size_type _Count, const _Alloc& _Al = _Alloc())
```
给定初始元素数量以及指定内存分配器,构造 deque。
```cpp
deque(_CRT_GUARDOVERFLOW size_type _Count, const _Ty& _Val)
```
指定初始元素数量以及指定初始元素,构造 deque。
```cpp
deque(_CRT_GUARDOVERFLOW size_type _Count, const _Ty& _Val, const _Alloc& _Al)
```
指定初始元素数量、初始元素以及内存分配器,构造 deque。
```cpp
deque(_Iter _First, _Iter _Last)
```
使用左闭右开迭代器区间构造 deque。
```cpp
deque(_Iter _First, _Iter _Last, const _Alloc& _Al)
```
指定迭代器区间与内存分配器构造 deque。
```cpp
deque(const deque& _Right)
```
用另一个 deque 构造 deque。
```cpp
deque(const deque& _Right, const _Identity_t<_Alloc>& _Al)
```
指定另一个 deque 以及内存分配器,构造 deque。
```cpp
deque(deque&& _Right)
```
用另一个 deque 构造 deque(右值引用)。
```cpp
deque(deque&& _Right, const _Identity_t<_Alloc>& _Al)
```
用另一个 deque(右值引用)及内存分配器构造 deque。
```cpp
deque(initializer_list<_Ty> _Ilist, const _Alloc& _Al = allocator_type())
```
给定列表和内存分配器,构造 deque。
### 析构函数
```cpp
~deque()
```
析构一个 deque。
### assign
```cpp
void assign(initializer_list<_Ty> _Ilist)
```
复制列表中的元素到 deque。
```cpp
void assign(_Iter _First, _Iter _Last)
```
复制迭代器区间内的元素到 deque。
```cpp
void assign(_CRT_GUARDOVERFLOW size_type _Count, const _Ty& _Val)
```
给定元素数量与元素值,赋值到 deque。
### get_allocator
```cpp
_NODISCARD allocator_type get_allocator() const noexcept
```
获取内存分配器。
### begin
```cpp
_NODISCARD iterator begin() noexcept
```
获取第一个元素的迭代器。
```cpp
_NODISCARD const_iterator begin() const noexcept
```
获取第一个元素的常量迭代器。
### end
```cpp
_NODISCARD iterator end() noexcept
```
获取最后一个元素的后面一个元素的迭代器。
```cpp
_NODISCARD const_iterator end() const noexcept
```
获取最后一个元素的后面一个元素的常量迭代器。
### rbegin
```cpp
_NODISCARD reverse_iterator rbegin() noexcept
```
获取最后一个元素的反向迭代器。
```cpp
_NODISCARD const_reverse_iterator rbegin() const noexcept
```
获取最后一个元素的常量反向迭代器。
### rend
```cpp
_NODISCARD reverse_iterator rend() noexcept
```
获取第一个元素的前面一个元素的反向迭代器。
```cpp
_NODISCARD const_reverse_iterator rend() const noexcept
```
获取第一个元素的前面一个元素的常量反向迭代器。
### cbegin
```cpp
_NODISCARD const_iterator cbegin() const noexcept
```
begin 的常量版本。
### rend
```cpp
_NODISCARD const_iterator cend() const noexcept
```
end 的常量版本。
### crbegin
```cpp
_NODISCARD const_reverse_iterator crbegin() const noexcept
```
rbegin 的常量版本。
### crend
```cpp
_NODISCARD const_reverse_iterator crend() const noexcept
```
rend 的常量版本。
### empty
```cpp
_NODISCARD_EMPTY_MEMBER bool empty() const noexcept
```
判断 deque 是否为空。
### size
```cpp
_NODISCARD size_type size() const noexcept
```
获取 deque 当前存储的元素数量。
### max_size
```cpp
_NODISCARD size_type max_size() const noexcept
```
获取 deque 最多能够存储的元素数量。
### resize
```cpp
void resize(_CRT_GUARDOVERFLOW size_type _Newsize)
```
初始化为指定元素数量的 deque。
```cpp
resize(_CRT_GUARDOVERFLOW size_type _Newsize, const _Ty& _Val)
```
指定元素数量以及元素值,初始化 deque。
### shrink_to_fit
```cpp
void shrink_to_fit()
```
释放多余的内存。
### at
```cpp
_NODISCARD const_reference at(size_type _Pos) const
```
获取指定位置上的元素的引用。(带越界判断)
```cpp
_NODISCARD reference at(size_type _Pos)
```
获取指定位置上的元素的常量引用。(带越界判断)
### front
```cpp
_NODISCARD reference front() noexcept
```
获取第一个元素的引用。
```cpp
_NODISCARD const_reference front() const noexcept
```
获取第一个元素的常量引用。
### back
```cpp
_NODISCARD reference back() noexcept
```
获取最后一个元素的引用。
```cpp
_NODISCARD const_reference back() const noexcept
```
获取最后一个元素的常量引用。
### emplace_front
```cpp
decltype(auto) emplace_front(_Valty&&... _Val)
```
以构造方式在前端插入元素。
### emplace_back
```cpp
decltype(auto) emplace_back(_Valty&&... _Val)
```
以构造方式在后端插入元素。
### emplace
```cpp
iterator emplace(const_iterator _Where, _Valty&&... _Val)
```
在指定位置以构造形式插入元素。
### push_front
```cpp
void push_front(const _Ty& _Val)
```
以赋值方式在前端插入元素。
```cpp
void push_front(_Ty&& _Val)
```
以赋值方式在前端插入元素。(右值引用)
### push_back
```cpp
void push_back(const _Ty& _Val)
```
以赋值方式在后端插入元素。
```cpp
void push_back(_Ty&& _Val)
```
以赋值方式在后端插入元素。(右值引用)
### insert
```cpp
iterator insert(const_iterator _Where, const _Ty& _Val)
```
在指定位置上插入元素。
```cpp
iterator insert(const_iterator _Where, _Ty&& _Val)
```
在指定位置上插入元素。(右值引用)
```cpp
iterator insert(const_iterator _Where, _CRT_GUARDOVERFLOW size_type _Count, const _Ty& _Val)
```
在指定位置上插入指定数量的元素。
```cpp
iterator insert(const_iterator _Where, _Iter _First, _Iter _Last)
```
在指定位置上插入一个迭代器区间内的元素。
```cpp
iterator insert(const_iterator _Where, initializer_list<_Ty> _Ilist)
```
在指定位置上插入列表。
### pop_front
```cpp
void pop_front() noexcept
```
弹出第一个元素。
### pop_back
```cpp
void pop_back() noexcept
```
弹出最后一个元素。
### erase
```cpp
iterator erase(const_iterator _Where) noexcept(is_nothrow_move_assignable_v<value_type>)
```
删除指定位置上的元素。
```cpp
iterator erase(const_iterator _First_arg, const_iterator _Last_arg) noexcept(is_nothrow_move_assignable_v<value_type>)
```
删除指定区间内的元素。
### clear
```cpp
void clear() noexcept
```
清空 deque。
### swap
```cpp
void swap(deque& _Right) noexcept
```
与另一个 deque 交换。
## 重载运算符
### operator=
```cpp
deque& operator=(const deque& _Right)
```
给定另一个 deque 对当前 deque 进行赋值。
```cpp
deque& operator=(deque&& _Right) noexcept(_Alty_traits::is_always_equal::value)
```
给定另一个 deque(右值引用)对当前 deque 进行赋值。
```cpp
deque& operator=(initializer_list<_Ty> _Ilist)
```
将 deque 赋值为列表。
### operator\[\]
```cpp
_NODISCARD reference operator[](size_type _Pos) noexcept
```
获取指定位置上的元素的引用。(不带越界判断)
```cpp
_NODISCARD const_reference operator[](size_type _Pos) const noexcept
```
获取指定位置上的元素的常量引用。(不带越界判断)
## 非成员函数
```cpp
void swap(deque<_Ty, _Alloc>& _Left, deque<_Ty, _Alloc>& _Right) noexcept
```
两个 deque 交换。
## 非成员重载运算符
### operator==
```cpp
_NODISCARD bool operator==(const deque<_Ty, _Alloc>& _Left, const deque<_Ty, _Alloc>& _Right)
```
判断两个 deque 是否相等。
### operator!=
```cpp
_NODISCARD bool operator!=(const deque<_Ty, _Alloc>& _Left, const deque<_Ty, _Alloc>& _Right)
```
判断两个 deque 是否不相等。
### operator<
```cpp
_NODISCARD bool operator<(const deque<_Ty, _Alloc>& _Left, const deque<_Ty, _Alloc>& _Right)
```
判断是否小于。
### operator<=
```cpp
_NODISCARD bool operator<=(const deque<_Ty, _Alloc>& _Left, const deque<_Ty, _Alloc>& _Right)
```
判断是否小于等于。
### operator>
```cpp
_NODISCARD bool operator>(const deque<_Ty, _Alloc>& _Left, const deque<_Ty, _Alloc>& _Right)
```
判断是是否大于。
### operator>=
```cpp
_NODISCARD bool operator>=(const deque<_Ty, _Alloc>& _Left, const deque<_Ty, _Alloc>& _Right)
```
判断是否大于等于。