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

news2024/11/27 17:35:47

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() {
    // 创建一个空的双端队列 deque
    std::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;  // 输出: 2
    std::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.coloradmin.cn/o/1825628.html

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

相关文章

【字符串函数】

1.strlen的使⽤和模拟实现 size_t strlen ( const char * str ); 1.字符串以 \0 作为结束标志&#xff0c;strlen函数返回的是在字符串中 \0 前⾯出现的字符个数&#xff08;不包 含 \0 )。 2.参数指向的字符串必须要以 \0 结束。 3.注意函数的返回值为size_t&#xff0c;是⽆…

面试题 17.06. 2出现的次数

题解&#xff1a;. - 力扣&#xff08;LeetCode&#xff09;. - 力扣&#xff08;LeetCode&#xff09; 数位 DP 通用模板_哔哩哔哩_bilibili class Solution { public:int numberOf2sInRange(int n) {std::string str to_string(n);int len str.size();std::vector<std:…

【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 …

Polkadot <> Kusama 桥:打造无信任互操作性的开创性范例

原文&#xff1a;https://www.parity.io/blog/trustless-interoperability 作者&#xff1a;Adrian Catangiu&#xff5c;Rust 区块链核心工程师&#xff0c;Parity Technologies 编译&#xff1a;OneBlock Polkadot <> Kusama 桥是无信任互操作性的开创性范例。本文深…

Ubuntu server 24 (Linux) 安装部署samba服务器 共享文件目录 windows访问

1 安装 sudo apt update sudo apt-get install samba #启动服务 sudo systemctl restart smbd.service sudo systemctl enable smbd.service #查看服务 2 创建用户 #创建系统用户 sudo useradd test2 #配置用户密码 sudo smbpasswd -a test2 # smbpasswd: -a添加用户 …

P1002 [NOIP2002 普及组] 过河卒

[NOIP2002 普及组] 过河卒 题目描述 棋盘上 A A A 点有一个过河卒&#xff0c;需要走到目标 B B B 点。卒行走的规则&#xff1a;可以向下、或者向右。同时在棋盘上 C C C 点有一个对方的马&#xff0c;该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为…

金融科技:推动保险行业数字化转型的引擎

随着科技的飞速发展&#xff0c;金融科技&#xff08;FinTech&#xff09;已经成为推动金融行业变革的重要力量。特别是在保险行业&#xff0c;金融科技正引领着一场深刻的数字化转型&#xff0c;为保险公司带来了前所未有的机遇与挑战。本文将探讨金融科技如何推动保险行业的数…

vue3:实现图片放大浏览功能组件

两种实现方式&#xff1a; 1.将原本的盒子与img标签放大至全屏浏览。 2.新建一个div和img标签进行全屏浏览。这样不会改变布局。 第一种&#xff1a; 效果&#xff1a; 组件代码&#xff1a; <template><div :class"isScreen ? fullImg : norImg">…

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

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

AI Vs 作家?Groqbook: AI写书神器,使用 Groq 和 Llama3 几秒生成一本完整的书籍!

✨点击这里✨&#xff1a;&#x1f680;原文链接&#xff1a;&#xff08;更好排版、视频播放、社群交流、最新AI开源项目、AI工具分享都在这个公众号&#xff01;&#xff09; AI Vs 作家&#xff1f;Groqbook: AI写书神器&#xff0c;使用 Groq 和 Llama3 几秒生成一本完整的…

【Java】解决Java报错:InterruptedException in Multi-threaded Applications

文章目录 引言一、InterruptedException的定义与概述1. 什么是InterruptedException&#xff1f;2. InterruptedException的常见触发场景3. 示例代码 二、解决方案1. 正确处理InterruptedException2. 合理使用中断机制3. 使用更高层次的并发工具 三、最佳实践1. 避免吞掉Interr…

网络安全形势迫在眉睫!云WAF保护私有云安全!

业务上云面临新的WEB安全挑战 目前&#xff0c;所有的组织都在积极地接受企业的“云”&#xff0c;推进数字化变革。在服务云计算和私有云平台构建中&#xff0c;用户除了要面对各种常见的网络攻击&#xff0c;还需要面对虚拟环境下的非授权访问、虚拟机逃逸和敏感信息泄漏等问…

QT小技巧

QT小技巧 滑条的美化 美化前 代码如下 //滑条的美化ui->horizontalSlider->setStyleSheet("QSlider::groove:horizontal {""border:1px solid skyblue;""background-color:skyblue;""height:10px;""border-radius:5px…

Vscode flake8插件 python代码语法格式检测/代码过长等误报设置

在vscode中python格式检测使用flake8插件很方便&#xff0c;但是经常会报出一些不必要错误&#xff0c;影响开发效率&#xff0c;忽略这些错误可以帮助减少对于特定项目可能不太关键的PEP 8警告或代码风格问题的干扰&#xff0c;特别是在项目有自己的格式化和编码标准时。使用f…

【Windows】配置Flutter开发环境

一、下载 flutter sdk 点此跳至下载官网 下载好flutter sdk&#xff0c;并解压到自定义的位置。 二、配置环境变量 此电脑 --> 右键 选择 属性 --> 点击 高级系统设置 --> 会弹出系统属性的窗口&#xff0c;点击 环境变量 按钮 1.配置加速镜像地址 PUB_HOSTED_…

Cheat Engine 学习

文章目录 Exact Value scanning任务实现步骤Unknown initial value任务实现步骤原理说明Floating points任务实现步骤原理说明Code finder任务实现步骤原理说明Pointers任务实现步骤原理说明Change Pointer 操作:Active(活跃状态)和数值修改:Code Injection任务概述实现步骤…

IS022000认证:食品安全管理的金标准

食品安全是食品行业的命脉&#xff0c;IS022000食品安全管理体系认证作为最权威的认证之一&#xff0c;为企业提供了强有力的保障。要理解IS022000认证的意义&#xff0c;我们需要先了解它与HACCP和IS09001认证的关系。 HACCP&#xff08;Hazard Analysis and Critical Control…

【计算机毕业设计】基于springboot的大创管理系统【源码+lw+部署文档】

包含论文源码的压缩包较大&#xff0c;请私信或者加我的绿色小软件获取 免责声明&#xff1a;资料部分来源于合法的互联网渠道收集和整理&#xff0c;部分自己学习积累成果&#xff0c;供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者…

从零入手人工智能(3)—— 线性回归

1.前言 实践是验证和理解理论知识的重要手段&#xff0c;在进行实际编程之前&#xff0c;我们首先确保编程环境已正确搭建。若编程环境尚未搭建完毕&#xff0c;建议参照《从零入手人工智能&#xff08;2&#xff09;——搭建开发环境》&#xff0c;文章链接如下&#xff1a; …

HAL库开发--第一盏灯

知不足而奋进 望远山而前行 目录 文章目录 前言 学习目标 学习内容 需求 开发流程 项目创建 芯片配置 功能配置 时钟配置 项目配置 编写代码 编译测试 烧录失败解决 ​编辑 总结 前言 在嵌入式系统开发中&#xff0c;掌握HAL库开发流程、STMCubeMX配置过程以及…