c++11 标准模板(STL)(std::deque)(一)

std::deque是一个双端队列,提供在首尾快速插入和删除的能力,常用于高效实现动态数组。deque的元素非连续存储,由固定大小的数组序列组成,插入和删除操作通常比std::vector更快,但内存开销较大。deque支持随机访问,插入和删除操作的时间复杂度均为O(1),并提供了如at、front、back、insert、erase等成员函数进行元素管理和容器操作。
摘要由CSDN通过智能技术生成

定义于头文件 <deque>

std::deque
template<

    class T,
    class Allocator = std::allocator<T>

> class deque;
(1)
namespace pmr {

    template <class T>
    using deque = std::deque<T, std::pmr::polymorphic_allocator<T>>;

}
(2)(C++17 起)

std::deque ( double-ended queue ,双端队列)是有下标顺序容器,它允许在其首尾两段快速插入及删除。另外,在 deque 任一端插入或删除不会非法化指向其余元素的指针或引用。

与 std::vector 相反, deque 的元素不是相接存储的:典型实现用单独分配的固定大小数组的序列,外加额外的登记,这表示下标访问必须进行二次指针解引用,与之相比 vector 的下标访问只进行一次。

deque 的存储按需自动扩展及收缩。扩张 deque 比扩展 std::vector 便宜,因为它不涉及到复制既存元素到新内存位置。另一方面, deque 典型地拥有较大的最小内存开销;只保有一个元素的 deque 必须分配其整个内部数组(例如 64 位 libstdc++ 上为对象大小 8 倍; 64 位 libc++ 上为对象大小 16 倍或 4096 字节的较大者)。

deque 上常见操作的复杂度(效率)如下:

  • 随机访问——常数 O(1)
  • 在结尾或起始插入或移除元素——常数 O(1)
  • 插入或移除元素——线性 O(n)

std::deque 满足容器 (Container) 、具分配器容器 (AllocatorAwareContainer) 、序列容器 (SequenceContainer) 和可逆容器 (ReversibleContainer) 的要求。

模板形参

T-元素的类型。
T 必须满足可复制赋值 (CopyAssignable) 和可复制构造 (CopyConstructible) 的要求。(C++11 前)
加诸元素的要求依赖于容器上进行的实际操作。泛言之,要求元素类型是完整类型并满足可擦除 (Erasable) 的要求,但许多成员函数附带了更严格的要求。(C++11 起)

Allocator-用于获取/释放内存及构造/析构内存中元素的分配器。类型必须满足分配器 (Allocator) 的要求。若 Allocator::value_type 与 T 不同则行为未定义。

非法化注意

  • 从 deque 任一端插入时, insert 和 emplace 不会非法化引用。
  • push_front 、 push_back 、 emplace_front 和 emplace_back 不会非法化任何到 deque 元素的引用。
  • 从 deque 任一端擦除时, erase 、 pop_front 和 pop_back 不会非法化到未擦除元素的引用。
  • 以较小的大小调用 resize 不会非法化任何到未擦除元素的引用。
  • 以较大的大小调用 resize 不会非法化任何到 deque 元素的引用。

 

成员类型

成员类型定义
value_typeT
allocator_typeAllocator
size_type无符号整数类型(通常是 std::size_t )
difference_type有符号整数类型(通常是 std::ptrdiff_t )
reference
Allocator::reference(C++11 前)
value_type&(C++11 起)
const_reference
Allocator::const_reference(C++11 前)
const value_type&(C++11 起)
pointer
Allocator::pointer(C++11 前)
std::allocator_traits<Allocator>::pointer(C++11 起)
const_pointer
Allocator::const_pointer(C++11 前)
std::allocator_traits<Allocator>::const_pointer(C++11 起)
iterator遗留随机访问迭代器 (LegacyRandomAccessIterator)
const_iterator常随机访问迭代器
reverse_iteratorstd::reverse_iterator<iterator>
const_reverse_iteratorstd::reverse_iterator<const_iterator>

成员函数

(构造函数)

构造 deque
(公开成员函数)

(析构函数)

析构 deque
(公开成员函数)

operator=

赋值给容器
(公开成员函数)

assign

将值赋给容器
(公开成员函数)

get_allocator

返回相关的分配器
(公开成员函数)

 

元素访问

at

访问指定的元素,同时进行越界检查
(公开成员函数)

operator[]

访问指定的元素
(公开成员函数)

front

访问第一个元素
(公开成员函数)

back

访问最后一个元素
(公开成员函数)

迭代器

begin cbegin

返回指向容器第一个元素的迭代器
(公开成员函数)

end cend

返回指向容器尾端的迭代器
(公开成员函数)

rbegin crbegin

返回指向容器最后元素的逆向迭代器
(公开成员函数)

rend crend

返回指向前端的逆向迭代器
(公开成员函数)


容量

empty

检查容器是否为空
(公开成员函数)

size

返回容纳的元素数
(公开成员函数)

max_size

返回可容纳的最大元素数
(公开成员函数)

shrink_to_fit

(C++11)

通过释放未使用的内存减少内存的使用
(公开成员函数)

 

修改器

clear

清除内容
(公开成员函数)

insert

插入元素
(公开成员函数)

emplace

(C++11)

原位构造元素
(公开成员函数)

erase

擦除元素
(公开成员函数)

push_back

将元素添加到容器末尾
(公开成员函数)

emplace_back

(C++11)

在容器末尾就地构造元素
(公开成员函数)

pop_back

移除末元素
(公开成员函数)

push_front

插入元素到容器起始
(公开成员函数)

emplace_front

(C++11)

在容器头部就地构造元素
(公开成员函数)

pop_front

移除首元素
(公开成员函数)

resize

改变容器中可存储元素的个数
(公开成员函数)

swap

交换内容
(公开成员函数)

 

非成员函数

operator==

operator!=

operator<

operator<=

operator>

operator>=

按照字典顺序比较 deque 中的值
(函数模板)

std::swap(std::deque)

特化 std::swap 算法
(函数模板)

erase(std::deque)erase_if(std::deque)

(C++20)

擦除所有满足特定判别标准的元素
(函数模板)

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值