C++ STL,常说的容器可以分为三大部分,序列式容器,关联式容器,容器适配器。这篇文章记录一下序列式容器中的 deque。
1、deque 双端队列 直观效果
deque 容器以模板类 deque<T>(T 为存储元素的类型)的形式在 <deque> 头文件中,并位于 std 命名空间中。因此,在使用该容器之前,代码中需要包含下面两行代码:
#include <deque>
using namespace std;
//或者 std::deque
和 vector 不同的是,deque 还擅长在序列头部添加或删除元素,所耗费的时间复杂度也为常数阶O(1)
。并且更重要的一点是,deque 容器中存储元素并不能保证所有元素都存储到连续的内存空间中。
2、deque 的构造函数
创建 deque 容器,根据不同的实际场景,可选择使用如下几种方式。
1) 空容器 构造函数(构造一个不包含元素的容器)empty container constructor
std::deque<int> d;
和空 array 容器不同(array创建之后是固定的),空的 deque 容器在创建之后可以做添加或删除元素的操作,因此这种简单创建 deque 容器的方式比较常见。
2) 创建一个具有 n 个元素的 deque 容器,其中每个元素都采用对应类型的默认值:(fill constructor) Constructs a container with n elements. Each element is a copy of val (if provided).
std::deque<int> d(10);
//此行代码创建一个具有 10 个元素(默认都为 0)的 deque 容器。
std::deque<int> d(10, 5)
//如此就创建了一个包含 10 个元素(值都为 5)的 deque 容器。
3) 通过拷贝其他类型容器中指定区域内的元素(也可以是普通数组),可以创建一个新容器,例如:
//拷贝普通数组,创建deque容器
int a[] = { 1,2,3,4,5 };
std::deque<int>d(a, a + 5);
//适用于所有类型的容器
std::array<int, 5>arr{ 11,12,13,14,15 };
std::deque<int>d(arr.begin()+2, arr.end());//拷贝arr容器中的{13,14,15}
4) 在已有 deque 容器的情况下,可以通过拷贝该容器创建一个新的 deque 容器,例如:
std::deque<int> d1(5);
std::deque<int> d2(d1);
注意,采用此方式,必须保证新旧容器存储的元素类型一致。
3、deque 常用函数
常用函数也可以分为几类去记忆
1、迭代器:
begin() Return iterator to beginning (public member function ) 返回指向容器中第一个元素的迭代器。
end() Return iterator to end (public member function ) 返回指向容器最后一个元素所在位置后一个位置的迭代器,通常和 begin() 结合使用。
rbegin() Return reverse iterator to reverse beginning (public member function ) 返回指向容器最后一个元素的迭代器
rend() Return reverse iterator to reverse end (public member function ) 返回指向容器第一个元素前一个位置的迭代器
cbegin() Return const_iterator to beginning (public member function ) 分别增加了const属性,不能修改
cend() Return const_iterator to end (public member function )
crbegin() Return const_reverse_iterator to reverse beginning (public member function )
crend() Return const_reverse_iterator to reverse end (public member function )
2、容量:
size() Return size (public member function )
max_size() Return maximum size (public member function )
resize() Change size (public member function )
empty() Test whether container is empty (public member function ) 如果为空,则返回true。
3、访问元素:
operator[] Access element (public member function )
at() Access element (public member function ) 该函数自动检查n是否在容器中的有效元素范围内,如果不是,则抛出 out_of_range 异常(即,如果n大于或等于其 size)。这与成员 operator[],后者不检查边界。
front() Access first element (public member function )
back() Access last element (public member function )
4、修改容器
push_back()
push_front()
pop_back()
pop_front()