deque双端队列)是C++标准库中的一种容器,它是一种序列容器,即可以在两端进行高效地插入和删除操作的动态数组。
deque可以在两端进行快速地插入和删除操作,因为它使用了分段连续存储的方式。它的内部结构由多个固定大小的块(chunk)组成,每个块都是一个连续的存储区域,元素在块内是连续存储的,而块与块之间则可以是不连续的。
与vector不同的是,deque具有更好的插入和删除性能,尤其是在容器头部的操作,这是由于deque的内部实现方式所决定的。但是,与vector相比,deque的随机访问效率要稍低一些。
使用deque您可以在两端高效地进行插入和删除操作,同时还可以通过迭代器在容器内部进行访问和修改数据。
一.使用前准备工作:
#include<deque> //包含 <deque> 头文件,以便在代码中使用 deque 容器的功能。
using namespace std;
//命名空间声明,使得代码中的标识符不需要加上 std:: 前缀来使用 std 命名空间中的内容,包括 //std::deque 在内。
deque<int> deq;
//定义了一个名为 deq 的变量,它是一个整型的双端队列(deque),也可以称为双端列表。
//这行代码创建了一个空的 deque 对象,可以在后续的代码中添加、删除和访问元素。
二.常用vector类的成员函数:
1 | deq.push_back(value) | 在末尾插入一个元素。 |
2 | deq.push_front(value) | 在头部插入一个元素。 |
3 | deq.pop_back() | 删除末尾的元素。 |
4 | deq.pop_front() | 删除头部的元素。 |
5 | deq.back() | 返回末尾的元素。 |
6 | deq.front() | 返回头部的元素。 |
7 | deq.at(indecx) | 返回指定位置的元素。 |
8 | deq.size() | 返回元素的数量。 |
9 | deq.empty() | 判断容器是否为空,为空返回1,不为空返回0。 |
10 | deq.clear() | 清空容器中的所有元素。 |
11 | deq.begin() | 返回指向容器第一个元素的迭代器。 |
12 | deq.end() | 返回指向容器最后一个元素的后面一个位置的迭代器。 |
三.代码示例:
1.push_back(value):
// 创建一个空的 deque 对象deq
deque<int> deq;
// 插入操作,依次往deq末尾添加元素:1,2,3,4,5
deq.push_back(1);
deq.push_back(2);
deq.push_back(3);
deq.push_back(4);
deq.push_back(5);
printf("all element of deq:");
for (int i = 0; i < deq.size(); i++)
{
printf("%d ", *(deq.begin() + i));
}
//输出:
all element of deq:1 2 3 4 5
2.push_front(value):
// 创建一个空的 deque 对象deq
deque<int> deq;
// 插入操作,依次往deq头部添加元素:1,2,3,4,5
deq.push_front(1);
deq.push_front(2);
deq.push_front(3);
deq.push_front(4);
deq.push_front(5);
printf("all element of deq:");
for (int i = 0; i < deq.size(); i++)
{
printf("%d ", *(deq.begin() + i));
}
//输出:
all element of deq:5 4 3 2 1
3.pop_back()和.pop_front():
// 创建一个 deque 对象deq并初始化
deque<int> deq = {1, 2, 3, 4, 5};
printf("初始化的deq:");
for (int i = 0; i < deq.size(); i++)
{
printf("%d ", *(deq.begin() + i));
}
putchar('\n');
// 删除deq尾部元素
deq.pop_back();
printf("删除尾部元素后的deq:");
for (int i = 0; i < deq.size(); i++)
{
printf("%d ", *(deq.begin() + i));
}
putchar('\n');
// 删除deq头部元素
deq.pop_front();
printf("紧接着删除头部元素后的deq:");
for (int i = 0; i < deq.size(); i++)
{
printf("%d ", *(deq.begin() + i));
}
putchar('\n');
//输出:
初始化的deq:1 2 3 4 5
删除尾部元素后的deq:1 2 3 4
紧接着删除头部元素后的deq:2 3 4
4.back()和front():
// 创建一个 deque 对象deq并初始化
deque<int> deq = {1, 2, 3, 4, 5};
// 返回deq头部元素
int front = deq.front();
printf("deq头部元素为:%d\n", front);
// 返回deq尾部元素
int back = deq.back();
printf("deq尾部元素为:%d\n", back);
//输出:
deq头部元素为:1
deq尾部元素为:5