Bootstrap

STL之容器:deque

        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类的成员函数:

1deq.push_back(value)

在末尾插入一个元素。

2deq.push_front(value)在头部插入一个元素。
3deq.pop_back()删除末尾的元素。
4deq.pop_front()删除头部的元素。
5deq.back()返回末尾的元素。
6deq.front()返回头部的元素。
7deq.at(indecx)返回指定位置的元素。
8deq.size()返回元素的数量。
9deq.empty()判断容器是否为空,为空返回1,不为空返回0。
10deq.clear()清空容器中的所有元素。
11deq.begin()返回指向容器第一个元素的迭代器。
12deq.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

;