前面我们已经接触到array、vector容器,掌握里一定的基础。现在我们开始进行deque容器的学习。duque,double-ended queue,意思就是双端队列,该容器首尾都能够进行增删元素操作且其时间复杂度为O(1)。deque底层是中控区+缓冲区,可以理解为通过指针链接数组块。deque与vector极其相似,下面展示其所有成员函数:
类别 | 成员函数 | 函数签名 | 说明 |
---|---|---|---|
元素访问 | at | reference at(size_type pos) | 带边界检查的访问 |
operator[] | reference operator[](size_type pos) | 下标访问 | |
front | reference front() | 访问第一个元素 | |
back | reference back() | 访问最后一个元素 | |
迭代器 | begin | iterator begin() | 指向首元素的迭代器 |
end | iterator end() | 指向尾后元素的迭代器 | |
rbegin | reverse_iterator rbegin() | 指向尾元素的逆向迭代器 | |
rend | reverse_iterator rend() | 指向首前元素的逆向迭代器 | |
容量 | empty | bool empty() const | 检查是否为空 |
size | size_type size() const | 返回元素个数 | |
max_size | size_type max_size() const | 返回可容纳的最大元素数 | |
shrink_to_fit | void shrink_to_fit() | 请求移除未使用的容量 (C++11) | |
修改 | clear | void clear() | 清除所有元素 |
insert | iterator insert(const_iterator pos, const T& value) | 在指定位置插入元素 | |
emplace | template<class... Args> iterator emplace(const_iterator pos, Args&&... args) | 在位置原地构造元素 (C++11) | |
erase | iterator erase(const_iterator pos) | 擦除指定位置元素 | |
push_back | void push_back(const T& value) | 尾部添加元素 | |
emplace_back | template<class... Args> void emplace_back(Args&&... args) | 尾部原地构造元素 (C++11) | |
pop_back | void pop_back() | 移除尾部元素 | |
push_front | void push_front(const T& value) | 头部添加元素 | |
emplace_front | template<class... Args> void emplace_front(Args&&... args) | 头部原地构造元素 (C++11) | |
pop_front | void pop_front() | 移除头部元素 | |
resize | void resize(size_type count) | 改变大小 | |
swap | void swap(deque& other) |
不过需要注意,deque里没有reserve()预存这个概念。双端列表通常用来实现双向BFS,提高搜索效率。
如何创建一个deque呢?让我来通过代码告诉读者:
#include<bits/stdc++.h>//万能头文件,竞赛推荐 #include<deque>//使用deque需要包含该头文件 using namespace std; void test() { /*创建 deque*/ cout << "开始创建deque \n" ; deque<int> dq1;//直接创建 deque<int> dq2{1,2,3,4,5};//初始化链表 deque<int> dq3(5,0);//n个体的形式创建deque deque<int> dq4(dq2);//拷贝构造函数 deque<int> dq5; dq5=dq2;//等号运算符重载赋值 } int main(){ test(); return 0; }
编译结果为:
能够编译,说明我们的代码没有问题。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程