C++ 学习之Deque容器

简介: C++ 学习之Deque容器

C++ Deque容器概念

Deque(Double-Ended Queue,双端队列)是C++标准库中的一种容器,允许在两端进行高效地插入和删除操作。Deque与Vector类似,但相比于Vector,Deque在两端插入和删除元素的效率更高。

Deque具有以下特点和概念:

  1. 双端操作:Deque支持在头部和尾部进行插入和删除等操作,因此可以被视为同时具备了Stack(栈)和Queue(队列)的特性。
  2. 随机访问:Deque允许通过索引随机访问其中的元素,因此可以像数组一样方便地访问任意位置的元素。
  3. 动态大小:Deque的大小可以动态调整,可以根据需要动态增长或缩小其大小,而且不像数组一样需要提前指定大小。
  4. 连续内存块:Deque内部通常由多个连续的内存块组成,不像Vector那样只有一个单独的内存块,这使得Deque能够快速地在两端执行插入和删除操作。
  5. 迭代器支持:Deque支持各种迭代器,包括顺序迭代器、逆序迭代器等,可以方便地对Deque中的元素进行遍历和操作。

Deque是一种非常灵活和高效的容器,适用于需要在两端频繁插入和删除元素,并且需要随机访问元素的场景。在使用Deque时,可以根据具体情况选择合适的操作和方法,以实现高效和方便的数据处理。

C++ Deque容器构造函数

C++中的Deque容器具有多个构造函数,允许我们以不同的方式创建Deque对象。以下是Deque容器的常用构造函数:

  1. 默认构造函数:
std::deque<T> myDeque;
  1. 创建一个空的Deque对象,其中T表示元素的数据类型。
  2. 拷贝构造函数:
std::deque<T> myDeque(otherDeque);
  1. 从另一个Deque对象 otherDeque 拷贝构造一个新的Deque对象 myDeque
  2. 带有初始值和大小的构造函数:
std::deque<T> myDeque(count, value);
  1. 创建一个包含 count 个初始化为 value 的元素的Deque对象 myDeque
  2. 带有迭代器范围的构造函数:
std::deque<T> myDeque(beginIter, endIter);
  1. 使用迭代器范围 [beginIter, endIter) 内的元素创建一个新的Deque对象 myDeque

除了上述构造函数,Deque还提供其他自定义构造函数和可选参数,可以根据特定需求来选择合适的构造函数。

C++ Deque容器赋值操作

在C++中,可以使用赋值操作符(=)或assign()函数将一个Deque容器赋值给另一个Deque容器。下面是Deque容器的赋值操作示例:

  1. 使用赋值操作符(=):
std::deque<int> deque1 = {1, 2, 3, 4, 5};  // 初始化deque1
std::deque<int> deque2;                   // 初始化空的deque2
deque2 = deque1;  // 使用赋值操作符将deque1赋值给deque2
// 输出deque2的元素
for (const auto& element : deque2) {
    std::cout << element << " ";
}
// 输出结果:1 2 3 4 5
  1. 使用assign()函数:
std::deque<int> deque1 = {1, 2, 3, 4, 5};  // 初始化deque1
std::deque<int> deque2;                   // 初始化空的deque2
deque2.assign(deque1.begin(), deque1.end());  // 使用assign()函数将deque1赋值给deque2
// 输出deque2的元素
for (const auto& element : deque2) {
    std::cout << element << " ";
}
// 输出结果:1 2 3 4 5

无论使用赋值操作符还是assign()函数,都能够将一个Deque容器完整地复制给另一个Deque容器。如果目标Deque容器已经包含了元素,赋值操作将清空目标容器并将源容器的元素复制到目标容器中。赋值操作只会复制元素的值,并不会共享底层内存

C++ Deque容器大小操作

在C++中,Deque容器提供了多种方法来获取和调整其大小。以下是Deque容器常用的大小操作:

  1. size()函数:
    size()函数用于返回Deque容器中元素的数量。
std::deque<int> myDeque = {1, 2, 3, 4, 5};
std::cout << "Deque容器的大小为:" << myDeque.size() << std::endl;
// 输出结果:Deque容器的大小为:5
  1. empty()函数:
    empty()函数用于判断Deque容器是否为空,如果Deque为空则返回true,否则返回false。
std::deque<int> myDeque;
if (myDeque.empty()) {
    std::cout << "Deque容器为空" << std::endl;
} else {
    std::cout << "Deque容器不为空" << std::endl;
}
// 输出结果:Deque容器为空
  1. resize()函数:
    resize()函数用于调整Deque容器的大小,可以增大或缩小容器的尺寸,缩小尺寸时会删除尾部的元素。
std::deque<int> myDeque = {1, 2, 3};
myDeque.resize(5); // 将Deque容器大小调整为5,新增的元素值为默认值
std::cout << "调整后的Deque容器大小为:" << myDeque.size() << std::endl;
// 输出结果:调整后的Deque容器大小为:5

通过以上方法,可以方便地获取Deque容器的大小,判断容器是否为空,以及调整容器的大小,从而满足不同场景下对Deque容器大小的操作需求。

C++ Deque容器插入和删除

在C++中,Deque容器提供了多种方法用于在不同位置插入和删除元素。以下是Deque容器常用的插入和删除操作:

  1. push_back()和push_front()函数:
  • push_back(value)函数用于在容器的尾部插入一个元素 value
  • push_front(value)函数用于在容器的头部插入一个元素 value
std::deque<int> myDeque = {1, 2, 3};
myDeque.push_back(4);   // 在尾部插入元素4
myDeque.push_front(0);  // 在头部插入元素0
// 输出Deque容器中的元素
for (const auto& element : myDeque) {
    std::cout << element << " ";
}
// 输出结果:0 1 2 3 4
  1. pop_back()和pop_front()函数:
  • pop_back()函数用于删除容器尾部的元素。
  • pop_front()函数用于删除容器头部的元素。
std::deque<int> myDeque = {1, 2, 3, 4, 5};
myDeque.pop_back();   // 删除尾部的元素
myDeque.pop_front();  // 删除头部的元素
// 输出Deque容器中的元素
for (const auto& element : myDeque) {
    std::cout << element << " ";
}
// 输出结果:2 3 4
  1. insert()函数:
    insert()函数用于在指定位置之前插入一个或多个元素。
std::deque<int> myDeque = {1, 2, 3, 4, 5};
auto it = myDeque.begin() + 2;  // 获取迭代器指向位置2
myDeque.insert(it, 6);          // 在位置2之前插入元素6
// 输出Deque容器中的元素
for (const auto& element : myDeque) {
    std::cout << element << " ";
}
// 输出结果:1 2 6 3 4 5
  1. erase()函数:
    erase()函数用于删除指定位置的一个或多个元素。
std::deque<int> myDeque = {1, 2, 3, 4, 5};
auto it = myDeque.begin() + 2;      // 获取迭代器指向位置2
myDeque.erase(it);                  // 删除位置2处的元素
// 输出Deque容器中的元素
for (const auto& element : myDeque) {
    std::cout << element << " ";
}
// 输出结果:1 2 4 5

C++ Deque容器数据存取

在C++中,Deque容器提供了多种方法用于访问和修改容器中的元素。以下是Deque容器常用的数据存取操作:

  1. 使用下标([])访问元素:
    可以使用下标操作符 ([]) 来访问Deque容器中特定位置的元素。
std::deque<int> myDeque = {1, 2, 3, 4, 5};
int firstElement = myDeque[0];  // 访问第一个元素
int thirdElement = myDeque[2];  // 访问第三个元素
std::cout << "第一个元素:" << firstElement << std::endl;  // 输出结果:第一个元素:1
std::cout << "第三个元素:" << thirdElement << std::endl;  // 输出结果:第三个元素:3
  1. 使用at()成员函数访问元素:
    at()成员函数可安全地访问给定位置的元素,并且在索引越界时会抛出std::out_of_range异常。
std::deque<int> myDeque = {1, 2, 3, 4, 5};
int secondElement = myDeque.at(1);  // 访问第二个元素
std::cout << "第二个元素:" << secondElement << std::endl;  // 输出结果:第二个元素:2
  1. 使用迭代器进行遍历访问:
    使用迭代器对Deque容器中的元素进行遍历访问。
std::deque<int> myDeque = {1, 2, 3, 4, 5};
// 使用迭代器输出Deque容器中的元素
for (auto it = myDeque.begin(); it != myDeque.end(); ++it) {
    std::cout << *it << " ";
}
// 输出结果:1 2 3 4 5
  1. 修改元素值:
    可以直接通过下标或迭代器修改Deque容器中特定位置的元素值。
std::deque<int> myDeque = {1, 2, 3, 4, 5};
myDeque[2] = 10;  // 修改第三个元素的值为10
// 输出修改后的Deque容器中的元素
for (const auto& element : myDeque) {
    std::cout << element << " ";
}
// 输出结果:1 2 10 4 5

C++ Deque容器排序操作

在C++中,可以使用std::sort()算法对Deque容器中的元素进行排序。下面是示例代码演示如何在Deque容器中进行排序操作:

#include <iostream>
#include <deque>
#include <algorithm>
int main() {
    std::deque<int> myDeque = {5, 8, 2, 1, 7, 3};
    
    // 排序前输出Deque容器中的元素
    std::cout << "排序前的Deque容器:" << std::endl;
    for (const auto& element : myDeque) {
        std::cout << element << " ";
    }
    std::cout << std::endl;
    
    // 使用std::sort()算法对Deque容器进行排序
    std::sort(myDeque.begin(), myDeque.end());
    
    // 排序后输出Deque容器中的元素
    std::cout << "排序后的Deque容器:" << std::endl;
    for (const auto& element : myDeque) {
        std::cout << element << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

在上面的示例中,首先输出了排序前的Deque容器的内容,然后使用std::sort()算法对Deque容器进行升序排序,最后输出排序后的Deque容器内容。

如果需要自定义排序方式,可以通过向std::sort()函数传递自定义的比较函数来实现。比如,如果想要按照元素的绝对值进行排序,可以编写如下的比较函数:

bool compareAbsoluteValue(int a, int b) {
    return abs(a) < abs(b);
}
// 使用自定义排序比较函数对Deque容器进行排序
std::sort(myDeque.begin(), myDeque.end(), compareAbsoluteValue);

关注我,不迷路,共学习,同进步

关注我,不迷路,共学习,同进步

相关文章
|
24天前
|
编译器 C语言 C++
配置C++的学习环境
【10月更文挑战第18天】如果想要学习C++语言,那就需要配置必要的环境和相关的软件,才可以帮助自己更好的掌握语法知识。 一、本地环境设置 如果您想要设置 C++ 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C++ 编译器。 二、文本编辑器 通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。 C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。 在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 Visual Studio Code:虽然它是一个通用的文本编辑器,但它有很多插
|
1月前
|
存储 搜索推荐 C++
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
49 2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
|
2月前
|
移动开发 前端开发 HTML5
Twaver-HTML5基础学习(23)页管理容器(TabBox)、选中模型(SelectionModel)
本文介绍了Twaver HTML5中的页管理容器(TabBox)和选中模型(SelectionModel)。文章解释了如何使用TabBox来管理Tab页,并通过示例代码展示了SelectionModel的多种功能,包括追加选中元素、设置选中元素、选中所有元素、移除元素选中状态、清除所有选中状态等。此外,还介绍了如何监听选中状态的变化事件以及如何设置不同的选中模式,如多选、单选和不可选。
36 2
Twaver-HTML5基础学习(23)页管理容器(TabBox)、选中模型(SelectionModel)
|
1月前
|
Kubernetes Linux 持续交付
docker容器学习
【10月更文挑战第1天】
36 1
|
1月前
|
存储 C++ 容器
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器1
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
54 5
|
1月前
|
Java 编译器 C++
c++学习,和友元函数
本文讨论了C++中的友元函数、继承规则、运算符重载以及内存管理的重要性,并提到了指针在C++中的强大功能和使用时需要注意的问题。
21 1
|
1月前
|
存储 编译器 C++
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
54 2
|
2月前
|
Kubernetes API Docker
跟着iLogtail学习容器运行时与K8s下日志采集方案
iLogtail 作为开源可观测数据采集器,对 Kubernetes 环境下日志采集有着非常好的支持,本文跟随 iLogtail 的脚步,了解容器运行时与 K8s 下日志数据采集原理。
|
1月前
|
存储 C++ 容器
C++番外篇——stack、queue的实现及deque的介绍
C++番外篇——stack、queue的实现及deque的介绍
25 0
|
1月前
|
Linux 应用服务中间件 Shell
docker学习--docker容器镜像常用命令大全(简)
本文档详细介绍了Docker中的镜像命令与容器管理命令。镜像命令部分涵盖了镜像搜索、下载、上传等操作;容器管理命令则包括了容器的创建、启动、停止、删除及日志查看等功能。通过具体示例,帮助用户更好地理解和使用Docker相关命令。
156 0