【C++提高编程-05】----C++之Deque容器实战

34889d2e7fec4a02bb0ae3a22b011a2a.png

🎩 欢迎来到技术探索的奇幻世界👨‍💻

📜 个人主页:@一伦明悦-CSDN博客

✍🏻 作者简介: C++软件开发、Python机器学习爱好者

🗣️ 互动与支持💬评论      👍🏻点赞      📂收藏     👀关注+

如果文章有所帮助,欢迎留下您宝贵的评论,

点赞加收藏支持我,点击关注,一起进步!

前言

      Deque(双端队列)是C++ STL中的一种序列容器,具有以下特点和功能:

  1. 双端插入和删除

    • 可以在队列的两端(前端和后端)进行高效的插入和删除操作,时间复杂度为常量时间。
  2. 动态扩展

    • 与向量(std::vector)类似,Deque可以动态增长以容纳更多元素,并支持自动分配更多内存空间。
  3. 随机访问迭代器

    • 提供了随机访问迭代器,允许通过索引快速访问Deque中的任何元素。

正文

01-Deque容器简要解释

      C++中的std::deque(双端队列)是一种序列容器,允许在两端进行高效地插入和删除操作。以下是std::deque容器的详细介绍:

  1. 双端队列概述

    • 双端队列是一种序列容器,类似于向量(std::vector),但允许在队列的两端进行高效地插入和删除操作。
    • 与向量不同,双端队列的插入和删除操作在队列的前端和后端都是常量时间复杂度,而向量只能在末尾进行常量时间的插入和删除。
  2. 容器特点

    • 随机访问迭代器std::deque 提供了随机访问迭代器,可以通过索引快速访问容器中的元素。
    • 动态扩展:与向量一样,双端队列的大小可以动态增长,当容器满时会自动分配更多的内存空间。
    • 双端操作:可以在队列的前端和后端进行插入和删除操作,使得双端队列在某些情况下比向量更加高效。
  3. 成员函数

    • push_front(val): 将元素 val 插入到双端队列的前端。
    • push_back(val): 将元素 val 插入到双端队列的后端。
    • pop_front(): 删除双端队列的第一个元素。
    • pop_back(): 删除双端队列的最后一个元素。
    • front(): 返回双端队列的第一个元素的引用。
    • back(): 返回双端队列的最后一个元素的引用。
    • size(): 返回双端队列中元素的数量。
    • empty(): 检查双端队列是否为空。
    • clear(): 清空双端队列中的所有元素。
  4. 使用场景

    • 当需要在队列的两端频繁地插入和删除元素时,双端队列是一个比较合适的选择。
    • 双端队列通常用于需要快速插入和删除元素的情况,例如实现双端队列数据结构、广度优先搜索等算法中。

        总之,std::deque提供了一种灵活高效的双端队列实现,适用于需要频繁在队列两端进行插入和删除操作的场景。

#include <iostream>
#include <deque>int main() {// 创建一个空的双端队列 dequestd::deque<int> deque;// 在队列的前端和后端插入元素deque.push_back(1);    // deque: [1]deque.push_front(2);   // deque: [2, 1]deque.push_back(3);    // deque: [2, 1, 3]// 访问队列的第一个和最后一个元素std::cout << "Front element: " << deque.front() << std::endl;  // 输出: 2std::cout << "Back element: " << deque.back() << std::endl;    // 输出: 3// 弹出队列的第一个和最后一个元素deque.pop_front();     // deque: [1, 3]deque.pop_back();      // deque: [1]// 检查队列是否为空和获取队列的大小if (!deque.empty()) {std::cout << "Deque is not empty." << std::endl;std::cout << "Size of deque: " << deque.size() << std::endl;  // 输出: 1}// 清空队列deque.clear();         // deque: []// 再次检查队列是否为空if (deque.empty()) {std::cout << "Deque is empty now." << std::endl;}return 0;
}

02-Deque容器介绍

      C++中的std::deque(双端队列)是一种序列容器, 当需要在队列两端频繁地插入和删除元素时,Deque是比较合适的选择。可用于实现双端队列数据结构、广度优先搜索等算法中需要双端操作的情况。总结而言,std::deque提供了一种灵活、高效的双端队列实现,适用于需要在队列两端进行频繁插入和删除操作的场景。

下面给出具体代码分析应用过程:

这段代码演示了如何使用std::deque容器(双端队列)进行元素的插入和遍历操作。下面是对这段代码的详细解释:

  1. 包含头文件及命名空间声明

    • #include <iostream>:包含输入输出流的头文件。
    • using namespace std;:使用命名空间 std
  2. 函数定义

    • printDeque函数:接受一个std::deque<int>的常量引用作为参数,用于打印该双端队列中的元素。函数内部使用const_iterator类型的迭代器来循环遍历双端队列,使用const修饰确保在函数内不会修改容器中的元素。
    • test01函数:在函数内部创建一个空的双端队列 d1,然后使用push_back(尾插法)向队尾插入 0 到 9 十个整数。同时,也提供了push_front(头插法)的方式注释在函数内,向队首插入相同的数据。
  3. 遍历并打印双端队列元素

    • test01函数中,调用printDeque函数打印双端队列 d1 中的所有元素。
  4. main函数

    • main函数中调用test01函数来执行整个测试过程。
    • system("pause");:在Windows系统下暂停控制台窗口,等待用户输入任意键后关闭窗口。
    • return 0;:返回程序执行成功的标志。

总的来说,这段代码展示了如何创建std::deque容器并通过尾插法向其中插入数据,然后通过printDeque函数遍历并打印双端队列中的元素。最后在main函数中进行调用,展示了std::deque的基本使用方法。

#include <iostream>
using namespace std;
#include <deque>void printDeque(const deque<int>&d)   // 加const防止写操作,那么迭代器那里必须使用const_iterator  const迭代器
{for (deque<int>::const_iterator it = d.begin(); it != d.end();it++){// *it = 100;   容器中数据不可修改cout << *it <<" ";}cout << endl;
}void test01()
{deque<int>d1;for (int i = 0; i < 10;i++){d1.push_back(i);   // 尾插法 0,1,2,3,4,5,6,7,8,9
//		d1.push_front(i);   // 头插法,9,8,7,6,5,4,3,2,1,0}printDeque(d1);}int main() {test01();system("pause");return 0;
}

运行结果如下图所示:

 

03-Deque容器排序

       代码演示如下,这段代码演示了如何使用 std::deque 容器进行排序操作,包括手动实现的冒泡排序和使用标准库提供的 sort 函数进行排序。以下是对代码的详细解释:

  1. 包含头文件及命名空间声明

    • #include <iostream>:包含输入输出流的头文件。
    • using namespace std;:使用命名空间 std
    • #include <deque>:包含双端队列 std::deque 的头文件。
    • #include <algorithm>:包含标准库算法的头文件,这里用于使用 sort 函数。
  2. 函数定义

    • printDeque 函数:接受一个 std::deque<int> 的常量引用作为参数,用于打印该双端队列中的元素。函数内部使用 const_iterator 类型的迭代器来循环遍历双端队列,保证不修改容器中的元素。
    • BubbleSort 函数:实现了冒泡排序算法,接受一个 std::deque<int> 的非常量引用作为参数,在函数内部通过交换元素来实现排序。
  3. 测试函数 test01

    • 在函数内部创建了一个空的 std::deque<int>,并依次使用 push_back 和 push_front 方法插入几个整数元素。
    • 调用 printDeque 函数,打印未排序前的双端队列元素。
    • 调用 BubbleSort 函数,对双端队列进行冒泡排序。
    • 再次调用 printDeque 函数,打印冒泡排序后的结果。
    • 使用 std::sort 函数对双端队列进行排序(默认升序),并再次调用 printDeque 打印排序后的结果。
  4. 主函数 main

    • 在 main 函数中调用 test01 函数,执行测试排序功能。
    • system("pause");:在Windows系统下暂停控制台窗口,等待用户输入任意键后关闭窗口。
    • return 0;:返回程序执行成功的标志。

总结来说,这段代码展示了如何使用 std::deque 容器进行排序操作,包括手动实现的冒泡排序和使用标准库提供的 sort 函数进行排序,同时也展示了如何遍历打印双端队列中的元素。

#include <iostream>
using namespace std;
#include <deque>
#include <algorithm>    // 使用所有算法都要包含这个头文件// deque排序操作void printDeque(const deque<int>&d1)
{for (deque<int>::const_iterator it = d1.begin(); it != d1.end();it++){cout << *it << " ";}cout << endl;
}void BubbleSort(deque<int>&d1)    // 这如果加了const,就无法对数据进行交换数字操作了
{for (int i = 0; i < d1.size()-1;i++){for (int j = 0; j < d1.size() - i - 1;j++){if (d1[j]>d1[j+1]){int temp = d1[j];d1[j] = d1[j + 1];d1[j + 1] = temp;}}}
}void test01()
{deque<int>d1;d1.push_back(10);d1.push_back(20);d1.push_back(30);d1.push_front(200);d1.push_front(300);cout << "排序前" << endl;printDeque(d1);// 1、使用冒泡排序交换BubbleSort(d1);cout << "冒泡排序交换后" << endl;printDeque(d1);// 2、使用sort排序sort(d1.begin(), d1.end());   // 默认从小到达排序cout << "sort排序交换后" << endl;printDeque(d1);}int main() {test01();system("pause");return 0;
}

示例运行结果如下图所示:

  

04-Deque容器案例-评委打分

       代码演示如下,这段代码是一个简单的程序,用于创建五个学生对象并打印它们的姓名和分数。下面是对这段代码的详细解释和分析:

  1. 包含头文件及命名空间声明

    • #include <iostream>:包含输入输出流的头文件。
    • using namespace std;:使用命名空间 std
    • #include <string>:包含字符串类的头文件。
    • #include <vector>:包含向量(动态数组)类的头文件。
  2. 类定义

    • class Person:定义了一个名为 Person 的类,用于代表一个学生。
      • Person(string name, int score):构造函数,用于初始化学生的姓名和分数。
      • string m_Name;:学生的姓名。
      • int m_Score;:学生的分数。
  3. 函数定义

    • void creatPerson(vector<Person>&v):函数用于创建五个学生对象并添加到向量 v 中。
      • 使用 for 循环创建五个学生对象。
      • 在循环内部,通过拼接字符串 nameSeed 中的字符来生成学生的姓名。
      • 初始化每个学生的分数为 0
      • 创建 Person 对象并将其添加到向量 v 中。
  4. 主函数 main

    • 在 main 函数中,首先创建一个向量 v 用于存放学生对象。
    • 调用 creatPerson 函数,将创建的学生对象添加到向量 v 中。
    • 使用一个 for 循环遍历向量 v 中的每个学生对象,并打印它们的姓名和分数。
    • system("pause");:在Windows系统下暂停控制台窗口,等待用户输入任意键后关闭窗口。
    • return 0;:返回程序执行成功的标志。

这段代码的作用是创建五个学生对象,每个学生有一个姓名和一个分数,然后将这些学生对象添加到一个向量中,并打印它们的信息。程序没有实现去除最高分和最低分并计算平均分的功能,这一部分需要进一步实现。

#include <iostream>
using namespace std;
#include <string>
#include <vector>
// 要求 有5名选手:选手ABCDE,10个评委分别对每一名选手打分,去除最高分,去除评委中最低分,取平均分。class Person
{
public:Person(string name, int score){this->m_Name = name;this->m_Score = score;}string m_Name; //姓名int m_Score; //平均分
};void creatPerson(vector<Person>&v)
{string nameSeed = "ABCDE";for (int i = 0; i < 5;i++){string name = "学生";name += nameSeed[i];int score = 0;Person p (name, score);v.push_back(p);}}int main() {// 创建容器存放学生vector<Person>v;creatPerson(v);for (vector<Person>::iterator it = v.begin(); it != v.end();it++){cout << "名字:" << (*it).m_Name << "分数:" << (*it).m_Score << endl;}system("pause");return 0;
}

运行结果如下图所示:

    

总结

      在C++中,deque(双端队列)是标准模板库中的一种序列容器,具有以下特点和总结:

  1. 双端插入和删除

    • deque 允许在队列的两端(前端和后端)进行高效的插入和删除操作,时间复杂度为常量时间。
  2. 动态扩展

    • 类似于向量(std::vector),deque 可以动态增长以容纳更多元素,并支持自动分配更多内存空间。
  3. 随机访问迭代器

    • deque 提供了随机访问迭代器,允许通过索引快速访问 deque 中的任何元素。
  4. 成员函数

    • push_front(val): 将元素 val 插入到 deque 的前端。
    • push_back(val): 将元素 val 插入到 deque 的后端。
    • pop_front(): 删除 deque 的第一个元素。
    • pop_back(): 删除 deque 的最后一个元素。
    • front(): 返回 deque 的第一个元素的引用。
    • back(): 返回 deque 的最后一个元素的引用。
    • size(): 返回 deque 中元素的数量。
    • empty(): 检查 deque 是否为空。
    • clear(): 清空 deque 中的所有元素。
  5. 使用场景

    • 当需要在队列两端频繁地插入和删除元素时,deque 是比较合适的选择。
    • 可用于实现双端队列数据结构、广度优先搜索等算法中需要双端操作的情况。

       总体而言,deque 提供了一种灵活、高效的双端队列实现,适用于需要在队列两端进行频繁插入和删除操作的场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/27627.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL的三种重要的日志

日志 Mysql有三大日志系统 Undo Log&#xff08;回滚日志&#xff09;&#xff1a;记录修改前的数据&#xff0c;用于事务回滚和 MVCC&#xff08;多版本并发控制&#xff09;。 Redo Log&#xff08;重做日志&#xff09;&#xff1a;记录数据变更&#xff0c;用于崩溃恢复&…

【java】指定类,指定package,找到package下面,这个类的所有子类

目录 ■java代码 ■注意 ■运行效果 ■包的结构 ■java代码 package com.sxz.study.reflect;import java.io.File; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.Enumeration; import java.util.List;public class …

缓存技术实战[一文讲透!](Redis、Ecache等常用缓存原理介绍及实战)

目录 文章目录 目录缓存简介工作原理缓存分类1.按照技术层次分类2.按照应用场景分类3.按照缓存策略分类 应用场景1.硬件缓存2.软件缓存数据库缓存Web开发应用层缓存 3.分布式缓存4.微服务架构5.移动端应用6.大数据处理7.游戏开发 缓存优点缓存带来的问题 常见常用Java缓存技术1…

Unity 之通过自定义协议从浏览器启动本地应用程序

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! Unity 之通过自定义协议从浏览器启动本地应用程序 TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、心进…

树莓派等Linux开发板上使用 SSD1306 OLED 屏幕,bullseye系统 ubuntu,debian

Raspberry Pi OS Bullseye 最近发布了,随之而来的是许多改进,但其中大部分都在引擎盖下。没有那么多视觉差异,最明显的可能是新的默认桌面背景,现在是大坝或湖泊上的日落。https://www.the-diy-life.com/add-an-oled-stats-display-to-raspberry-pi-os-bullseye/ 通过这次操…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 特惠寿司(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 特惠寿司(100分) 🌍 评测功能需要订阅专栏后私信联系清隆解…

王思聪日本街头在被偶遇

王思聪日本街头再被偶遇&#xff0c;甜蜜约会日常成网友热议焦点近日&#xff0c;有网友在日本街头再次偶遇了“国民老公”王思聪&#xff0c;这次他不仅携带着一位美丽的女友&#xff0c;还展现出了两人之间亲密无间的互动&#xff0c;让不少网友感叹&#xff1a;这真的是每天…

八、BGP

目录 一、为何需要BGP&#xff1f; 二、BGP 2.1、BGP邻居 2.2、BGP报文 2.3、BGP路由 2.4、BGP通告遵循原则 2.5、BGP实验 第一步&#xff1a;建立邻居 第二步&#xff1a;引入路由 BGP路由黑洞 路由黑洞解决方案 1、IBGP全互联 2、路由引入 3、MPLS 多协…

甘肃这款饼子很火 你是否有吃过呢

白吉饼那独特的外形&#xff0c;圆圆的十分可爱。&#x1f44f;它的表皮酥脆&#xff0c;内里绵软&#xff0c;麦香四溢。&#x1f60b;拿在手里沉甸甸的&#xff0c;就知道用料十足。 无论是直接吃&#xff0c;感受那纯粹的面香&#xff0c;还是夹上腊汁肉&#xff0c;变成美味…

ThinkPHP5.0 apache服务器配置URL重写,index.php去除

本地环境wamp .htaccess文件代码 <IfModule mod_rewrite.c>Options FollowSymlinks -MultiviewsRewriteEngine onRewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L] </IfModule> 踩过这个坑&a…

dbForge Studioor MySQL v6 解锁版 安装教程(MYSQL数据库客户端)

前言 dbForge Studioor MySQL是一个在Windows平台被广泛使用的MySQL客户端&#xff0c;它能够使MySQL开发人员和管理人员在一个方便的环境中与他人一起完成创建和执行查询&#xff0c;开发和调试MySQL程序&#xff0c;自动化管理MySQL数据库对象等工作。 一、下载地址 下载链…

什么是GPT-4

什么是GPT-4 ChatGPT 可以说&#xff0c;ChatGPT的发展&#xff0c;主要的分水岭在GPT-4&#xff0c;GPT-4主要是文本对话&#xff0c;且训练度也不够完善。GPT-4之后不但训练度得到了巨大提升&#xff0c;模型支持的参数量更是预计有1万亿参数&#xff0c;在这之后出现的GPT-4…

图书管理系统(SpringBoot+SpringMVC+MyBatis)

目录 1.数据库表设计 2.引入MyBatis和MySQL驱动依赖 3.配置数据库&日志 4.Model创建 5.用户登录功能实现 6.实现添加图书功能 7.实现翻页功能 1.数据库表设计 数据库表是应⽤程序开发中的⼀个重要环节, 数据库表的设计往往会决定我们的应⽤需求是否能顺利实现, 甚至决…

探索档案未来,尽在ARCHE-2024

2024年第三届上海国际智慧档案展览会暨高峰论坛&#xff08;ARCHE-2024&#xff09;将于2024年6月19日至21日在上海跨国采购会展中心隆重举行。深圳市铨顺宏科技有限公司应邀参展&#xff0c;将以全新形象盛装亮相&#xff0c;展示其在档案管理领域的最新技术和解决方案。 ARC…

UC Berkeley简介以及和Stanford的区别与联系

UC Berkeley Source: Google Map 中文版 UC Berkeley&#xff0c;全称University of California, Berkeley&#xff0c;是一所位于美国加利福尼亚州伯克利市的世界知名公立研究型大学。以下是关于UC Berkeley的详细介绍&#xff1a; 学术声誉和排名 学术声誉&#xff1a; U…

PROSAIL模型前向模拟与植被参数遥感

原文链接&#xff1a;PROSAIL模型前向模拟与植被参数遥感 “绿水青山就是金山银山”的生态文明理念现已深入人心&#xff0c;从顶层设计到全面部署&#xff0c;生态文明建设进入举措最实、推进最快、力度最大、成效最好的时期。生态文明评价必须将生态系统健康作为基本内容&am…

超详解——Python 字典详解——小白篇

目录 1. 创建字典 示例&#xff1a; 2. 访问字典中的元素 示例&#xff1a; 3. 修改字典元素 示例&#xff1a; 4. 删除字典元素 示例&#xff1a; 5. 查找元素是否是字典的键 示例&#xff1a; 6. 标准类型操作符 获取字典长度 合并两个字典 7. 常用内置函数 k…

TFT屏幕波形显示

REVIEW 关于TFT显示屏&#xff0c;之前已经做过彩条显示&#xff1a; TFT显示屏驱动_tft驱动-CSDN博客 关于ROM IP核&#xff0c;以及coe文件生成&#xff1a; FPGA寄存器 Vivado IP核_fpga寄存器资源-CSDN博客 1. TFT屏幕ROM显示正弦波 ①生成coe文件 %% sin-cos wave dat…

【Linux】基础IO [万字之作]

目录 一.重谈文件 二.重谈C文件操作 1.操作 1.文件的打开和关闭 2.文件的读写操作 ​编辑 1.fgetc函数 2.fputc函数 3.fputs函数 4.fgets函数 5.fprintf函数 6.fscanf函数 7.fread函数 8.fwrite函数 三.重谈当前路径 四.系统文件操作接口 1.Open函数 2.write函数 3…

记周末百度云防御CC攻击事件

今天一早&#xff0c;收到百度智能云短信提醒&#xff0c;一位客户的网站遭遇了CC攻击。 主机吧赶紧登陆客户网站查看&#xff0c;是否正常&#xff0c;看是否需要通知客户。 结果打开正常&#xff0c;看情况并没什么影响&#xff0c;那就等攻击结果了再看吧。 下午的时候&am…