文章目录
-
- 测试环境
- deque介绍
- 头文件
- 模块类定义
- 对象构造
- 初始化
- 元素访问
- 元素插入和删除
- 容器大小
- 迭代器
- 其他函数
测试环境
系统:ubuntu 22.04.2 LTS 64位
gcc版本:11.3.0
编辑器:vsCode 1.76.2
deque介绍
- 双端队列。
- 不保证元素的存储在连续的地址空间。
- 支持随机访问
- 在首尾插入和删除元素时间复杂度为O(1),在其他位置插入元素时间复杂度为O(n)。
头文件
#include
模块类定义
_Tp:表示存储的元素数据类型
_Alloc:表示所存储分配器的类型,负责元素内存的分配和释放。可选参数,一般不使用。
template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
class deque{};
对象构造
std::deque<int> deqInt1;
std::deque<int> deqInt2(10);
std::deque<int> deqInt3(10,6);
std::deque<int> deqInt4(deqInt3);
std::deque<int> deqInt5(deqInt3.begin(),deqInt3.begin()+7);
std::deque<int> deqInt6(std::move(deqInt5));
std::deque<int> deqInt7({1,2,3,4,5,6,7});
初始化
deqInt1 = {1,2,3,4,5};
deqInt1.assign(deqInt6.cbegin(), deqInt6.cend());
deqInt1.assign(5,8);
deqInt1.assign({8,7,6,5,4,3,2,1});
元素访问
函数名 |
返回值 |
功能 |
[] |
指定元素的值 |
访问元素 |
at() |
指定元素的引用 |
访问元素 |
front() |
首元素的引用 |
获取首元素 |
back() |
元素的引用 |
获取末尾元素 |
for (int i = 0; i < 10; i++)
{
std::cout<< deqInt3[i] << " ";
}
for (int i = 0; i < 10; i++)
{
std::cout << deqInt3.at(i) << " ";
}
std::cout <<"front:"<< deqInt3.front() << std::endl;
deqInt3.front() = 1;
std::cout <<"after modify front:" << deqInt3.front() << std::endl;
std::cout <<"back:"<< deqInt3.back() << std::endl;
deqInt3.back() = 10;
std::cout << "after modify back:"<<deqInt3.back() << std::endl;
元素插入和删除
函数 |
返回值 |
功能 |
clear() |
无 |
清空所有元素 |
erase() |
迭代器 |
清除指定位置的一个元素或通过迭代器指定范围内的元素 |
emplace() |
迭代器 |
在指定位置构造并插入元素 |
emplace_front() |
无 |
在队列头构造并插入元素 |
emplace_back() |
无 |
在末尾构造并插入元素 |
insert() |
迭代器或无 |
1)在指定位置插入1个元素。2)在指定位置插入指定数量的相同元素。3)通过指定迭代器范围在指定位置插入数据 |
pop_back() |
无 |
删除队列尾元素 |
push_back() |
无 |
在队列尾添加元素 |
pop_front() |
无 |
删除队列头元素 |
push_front() |
无 |
在队列头插入元素 |
deqInt1.push_front(6);
deqInt1.push_back(8);
deqInt1.emplace(deqInt1.begin()+1,10);
deqInt1.emplace_front(11);
deqInt1.emplace_back(0);
deqInt1.insert(deqInt1.begin()+1, 12);
deqInt1.insert(deqInt1.begin(),3,9);
deqInt1.insert(deqInt1.end(),deqInt7.begin(),deqInt7.begin()+5);
deqInt1.pop_front();
deqInt1.pop_back();
deqInt1.erase(deqInt1.begin()+1);
deqInt1.erase(deqInt1.end()-3,deqInt1.end());
deqInt1.clear();
注:emplace、emplace_front、emplace_back()插入元素时直接构造并插入比insert效率高
容器大小
函数 |
返回值 |
功能 |
size() |
std::size_t |
获取当前容器中的元素数量 |
empty() |
bool |
判断当前容器是否为空,为空返回true,否则返回false |
max_size() |
std::size_t |
返回容器的最大容量 |
resize() |
无 |
重新指定容器可以容纳的元素数量,新大小大于原本大小时超出部分可使用指定元素填充,如果新大小小于指定大小时会删除容器原本末尾的数据。 |
shrink_to_fit() |
无 |
丢弃容器中多余的容量。 |
std::cout << deqInt1.size() << std::endl;
std::cout << deqInt1.max_size() << std::endl;
std::cout << std::boolalpha << deqInt1.empty() << std::endl;
deqInt1.resize(15);
deqInt1.resize(20,8);
deqInt1.shrink_to_fit();
迭代器
类型 |
功能 |
iterator |
正向随机访问迭代器。从前向后访问元素,可以读取也可以修改 |
const_iterator |
常量正向随机访问迭代器。从前向后访问元素,只能读取不能修改 |
reverse_iterator |
逆向随机访问迭代器。从后向前访问元素,可以读取也可以修改 |
const_reverse_iterator |
常量逆向随机访问迭代器。从后向前访问元素,只能读取不能修改 |
函数 |
返回值 |
功能 |
begin() |
正向随机访问迭代器 |
返回指向deque对象首元素所在位置的迭代器 |
end() |
正向随机访问迭代器 |
返回指向deque对象末尾元素的下一个位置的迭代器 |
cbegin() |
常量正向随机访问迭代器 |
返回指向deque对象首元素所在位置的常量迭代器 |
cend() |
常量正向随机访问迭代器 |
返回指向deque对象末尾元素的下一个位置的迭代器 |
rbegin() |
逆向随机访问迭代器 |
返回指向deque对象末尾元素位置的迭代器 |
rend() |
逆向随机访问迭代器 |
返回指向deque对象首元素的前一个位置的迭代器 |
crbegin() |
常量逆向随机访问迭代器 |
返回指向deque对象末尾元素位置的常量迭代器 |
crend() |
常量逆向随机访问迭代器 |
返回指向deque对象首元素的前一个位置的常量迭代器 |
std::deque<int>deqTest1({10,11,12,13,14,15,16,17,18,19});
std::deque<int>::iterator itr;
for (itr = deqTest1.begin(); itr != deqTest1.end(); itr++)
{
*itr += 10;
std::cout << *itr << " ";
}
std::cout<<std::endl;
std::deque<int>::const_iterator cItr;
for (cItr = deqTest1.cbegin(); cItr != deqTest1.cend(); cItr++)
{
std::cout << *cItr << " ";
}
std::cout<<std::endl;
std::deque<int>::reverse_iterator rItr;
for (rItr= deqTest1.rbegin(); rItr!= deqTest1.rend(); rItr++)
{
*rItr += 100;
std::cout << *rItr << " ";
}
std::cout<<std::endl;
std::deque<int>::const_reverse_iterator crItr;
for (crItr= deqTest1.crbegin(); crItr!= deqTest1.crend(); crItr++)
{
std::cout << *crItr << " ";
}
std::cout << std::endl;
其他函数
函数名 |
返回值 |
功能 |
swap() |
无 |
交换两个容器的元素 |
std::deque<int> deqSwap1 = {6,6,6,6,6};
std::deque<int> deqSwap2 = {8,8,8,8,8};
deqSwap1.swap(deqSwap2);
std::swap(deqSwap1,deqSwap2);