c++STL系列——(十)Adapter

目录

栈适配器

基本特性

基本操作

实际应用

队列适配器

基本特性

基本操作

实际应用

优先队列适配器

基本特性

基本操作

实际应用

总结


引言

当提到C++ STL(标准模板库)中的适配器(Adapter),我们通常指的是stack、queue和priority_queue这三种容器适配器。它们提供了对底层容器(如vector、deque或list)的封装,使得可以使用不同的接口来操作数据结构。本文将深入探讨C++ STL中的这三种适配器,包括其基本特性、用法以及实际应用。

stack:栈适配器

基本特性

栈是计算机科学中一种基本但极其强大的数据结构,其操作原则是后进先出(LIFO,Last In First Out)。这意味着最后被添加到栈中的元素将是第一个被移除的。在C++标准库中,std::stack是作为容器适配器实现的,它提供了对一个底层容器(如std::vectorstd::dequestd::list)的封装,使其表现得像一个栈。这种封装不仅隐藏了底层容器的复杂性,还确保了数据的LIFO操作特性得以保持。

基本操作

入栈与出栈
std::stack<int> myStack;
myStack.push(1);  // 入栈
myStack.pop();    // 出栈

实际应用

括号匹配

在编程语言和表达式的解析中,括号匹配是一个基本而重要的问题。它涉及到检查代码或表达式中的括号是否正确配对和嵌套。这不仅是编译器设计中的一个关键步骤,也是确保代码逻辑正确性的基础。不正确的括号匹配可能导致编译错误或逻辑错误,影响程序的运行。

栈的后进先出(LIFO)特性使其成为处理括号匹配问题的理想选择。当遇到开放括号(如(, [, {)时,将其推入栈中。随后,每当遇到闭合括号(如), ], })时,检查栈顶的括号是否与之匹配。如果匹配,从栈中弹出栈顶的括号,表示这一对括号已正确闭合。如果不匹配或栈为空,则表示括号匹配失败。最终,如果所有括号都能正确匹配,栈应为空。

代码

bool isParenthesesValid(const std::string& s) {std::stack<char> myStack;for (char c : s) {if (c == '(') {myStack.push(c);} else if (c == ')') {if (myStack.empty() || myStack.top() != '(') {return false;} else {myStack.pop();}}}return myStack.empty();
}

queue:队列适配器

基本特性

队列是一种基础而重要的数据结构,在多种编程场景中都有广泛应用,其核心原则是先进先出(FIFO, First In First Out)。这意味着最先被添加到队列中的元素将是第一个被移除的。在C++标准库中,std::queue是作为容器适配器实现的,它封装了一个底层容器(通常是std::dequestd::list),并提供了一套标准的队列操作接口。通过隐藏底层容器的具体实现,std::queue使得元素的入队和出队操作变得简单直观。

基本操作

入队与出队
std::queue<int> myQueue;
myQueue.push(1);  // 入队
myQueue.pop();    // 出队

实际应用

广度优先搜索(BFS)

广度优先搜索(BFS)是图论和树遍历领域中的一种基本算法,它从一个给定的起点开始,逐层遍历图或树的所有节点,确保每个节点都能被访问且仅被访问一次。BFS的关键在于它按照节点被发现的顺序进行搜索,这就是为什么队列这种先进先出(FIFO)的数据结构在BFS实现中扮演着核心角色。

使用队列进行BFS时,算法从将起始节点加入到队列开始。随后,进行以下操作直到队列为空:

  1. 节点出队:从队列的前端移除一个节点,并对其进行处理(比如检查是否为目标节点)。
  2. 邻接节点入队:将当前节点的所有未访问过的邻接节点加入队列的末尾。这一步确保了节点会按照它们被发现的顺序进行访问。
  3. 标记已访问:为了避免节点被重复访问,每当一个节点出队并处理后,需要将其标记为已访问。
实际应用示例
void bfs(std::vector<std::vector<int>>& graph, int start) {std::queue<int> q;std::vector<bool> visited(graph.size(), false);q.push(start);visited[start] = true;while (!q.empty()) {int node = q.front();q.pop();// 处理当前节点nodefor (int neighbor : graph[node]) {if (!visited[neighbor]) {q.push(neighbor);visited[neighbor] = true;}}}
}

priority_queue:优先队列适配器

基本特性

优先队列适配器是一种数据结构,它提供了对底层容器的封装,以实现优先级队列的功能。在优先队列中,元素被插入时会根据预定义的优先级规则进行自动排序,使得具有最高优先级的元素始终位于队列的前端。这种自动排序的机制使得优先队列成为处理具有优先级的任务或数据的理想选择。

优先队列的基本特性包括:

  1. 封装底层容器: 优先队列适配器封装了一个底层容器,通常是一个动态数组或者二叉堆。这个底层容器存储了实际的元素数据,并提供了对这些数据的访问和管理接口。

  2. 自动排序: 在插入元素时,优先队列会根据事先定义好的优先级规则自动进行排序。通常情况下,元素的优先级是通过一个比较函数或者比较运算符来确定的。

  3. 高效的插入和删除操作: 由于优先队列使用了底层容器来存储元素,并且经过了排序,因此在插入和删除操作时可以达到较高的效率。对于二叉堆作为底层容器的优先队列来说,插入和删除操作的时间复杂度分别为 O(log n)。

  4. 支持动态调整优先级: 在某些实现中,优先队列还支持动态地调整元素的优先级。这意味着在元素已经插入到队列中后,仍然可以通过修改元素的优先级来重新调整其在队列中的位置。

基本操作

插入元素与取出顶部元素
std::priority_queue<int> myPriorityQueue;
myPriorityQueue.push(3);  // 插入元素
int topElement = myPriorityQueue.top();  // 取出顶部元素
myPriorityQueue.pop();  // 移除顶部元素

实际应用

任务调度

在操作系统的任务调度中,优先队列广泛用于根据任务的优先级来安排执行顺序:

struct Task {int priority;// other information
};
struct Compare {bool operator()(const Task& t1, const Task& t2) {return t1.priority < t2.priority;  // 定义优先级比较}
};
std::priority_queue<Task, std::vector<Task>, Compare> taskQueue;

总结

通过本文的介绍,你应该对C++ STL中的栈适配器stack、队列适配器queue和优先队列适配器priority_queue有了更加深入的了解。这三种适配器提供了方便的高层接口,使得我们能够更加轻松地操作数据结构,同时也能够应用到各种实际场景中。

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

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

相关文章

【Linux】调试工具gdb:初识

前言 今天来记录并学习一下gdb的使用 背景 程序的发布方式有两种&#xff0c;debug模式和release模式Linux gcc/g出来的二进制程序&#xff0c;默认是release模式要使用gdb调试&#xff0c;必须在源代码生成二进制程序的时候, 加上 -g 选项 使用 gdb FileName 退出&#x…

Pr下载安装(视频剪辑软件Pr安装包下载2024)

Adobe全家桶下载方式 AE下载 PR下载 将持续更新~ 文章目录 Adobe全家桶下载方式PR下载方式【点我获取下载链接】一、Pr简介二、链接内容包含1.PR软件2.PR教学课程 声明 PR下载方式【点我获取下载链接】 迅雷下载&#xff1a;迅雷下载方式百度网盘下载&#xff1a;百度网盘下…

效果炸裂!OpenAI首个视频生成模型发布,1分钟流畅高清,网友:整个行业RIP

刚刚&#xff0c;奥特曼发布OpenAI首个视频生成模型Sora。 完美继承DALLE 3的画质和遵循指令能力&#xff0c;能生成长达1分钟的高清视频。 AI想象中的龙年春节&#xff0c;红旗招展人山人海。 有紧跟舞龙队伍抬头好奇官网的儿童&#xff0c;还有不少人掏出手机边跟边拍&…

109 C++ 理解auto 类型推断,auto 应用场合

一。auto 类型推断 auto 用于变量的自动推断&#xff0c;原理是--在声明变量的时候&#xff0c;根据变量的初始值的类型&#xff0c;自动为此变量选择匹配的类型&#xff0c;而不需要我们显示指定类型 特点&#xff1a;1.auto 的类型推断是发生在编译期间的&#xff0c;所以不…

java 调用智谱ai 大模型的完整步骤(国内的 AI 大模型 对话)

要使用java 调用智谱AI的API进行异步调用&#xff0c;您需要遵循以下步骤&#xff1a; 1. **获取API密钥**&#xff1a; - 您需要从智谱AI平台获取一个API密钥&#xff08;API Key&#xff09;&#xff0c;这个密钥将用于所有API请求的身份验证。 2. **SDK源…

【MySQL/Redis】如何实现缓存一致

目录 不实用的方案 1. 先写 MySQL , 再写 Redis 2. 先写 Redis &#xff0c; 再写MySQL 3. 先删 Redis&#xff0c;再写 MySQL 实用的方案 1. 先删 Redis&#xff0c;再写 MySQL, 再删 Redis 2. 先写 MySQL , 再删 Redis 3. 先写MySQL&#xff0c;通过BinLog&#xff0…

傅里叶变换(Fourier Transform)简介

目录 1.什么是傅里叶变换2.应用场景开源的语音识别软件1.什么是傅里叶变换 傅里叶变换(Fourier Transform)是一种在数学、物理和工程等领域中广泛使用的数学变换。它是信号处理中的基础工具,用于将一个函数或信号从时域(或空间域)转换到频域。 傅里叶变换的基本思想是,…

ClickHouse--10--临时表、视图、向表中导入导出数据

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.临时表1.1 特征1.2 创建一个临时表 2.视图2.1 普通视图2.2 物化视图 3.向表中导入导出数据3.1 案例 1.临时表 1.1 特征 ClickHouse 支持临时表&#xff0c;临时表…

智能汽车行业产业研究报告:毫米波雷达优势明显,核心壁垒是芯片、天线阵列、波形设计

今天分享的是智能汽车系列深度研究报告&#xff1a;《智能汽车行业产业研究报告&#xff1a;毫米波雷达优势明显&#xff0c;核心壁垒是芯片、天线阵列、波形设计》。 &#xff08;报告出品方&#xff1a;国泰君安证券&#xff09; 报告共计&#xff1a;67页 毫米波雷达被广泛…

Flume(二)【Flume 进阶使用】

前言 学数仓的时候发现 flume 落了一点&#xff0c;赶紧补齐。 1、Flume 事务 Source 在往 Channel 发送数据之前会开启一个 Put 事务&#xff1a; doPut&#xff1a;将批量数据写入临时缓冲区 putList&#xff08;当 source 中的数据达到 batchsize 或者 超过特定的时间就会…

【前端web入门第六天】01 CSS浮动

⭐️第六天目标 解决布局问题如多个div标签在同一行的问题 简单来说,就是可以两个标签,一个在左边,另一个在右边. &#x1f449;相关知识 标准流浮动flex布局❗️ ❗️ ❗️ 标准流是先导,浮动和flex布局都可以解决问题,但是浮动在目标开发领域较为落后,主流的解决办法是flex…

OpenCV Mat实例详解 一

OpenCV中的Mat是一个类&#xff0c;它用存储图像信息。由两部分数据组成&#xff1a;矩阵头和像素值矩阵。矩阵头包含矩阵尺寸、存储方法、存储地址等信息&#xff0c;而像素值矩阵则存储实际的像素值数据。 Mat类在OpenCV中有十分重要的作用&#xff0c;图像信息的载入、保存、…

Java 中 一些常见的并发集合类

什么是并发集合&#xff1f;列举一些常见的并发集合类 并发集合是一种特殊的数据结构&#xff0c;它允许多个线程安全地访问和修改。在多线程编程的场景下&#xff0c;只有使用并发集合才能确保线程安全&#xff0c;避免多个线程在对同一个数据结构进行并发操作时引发的竞态条…

UI设计常见风格(1):一文读懂九个,教你如何辨识。

Hello&#xff0c;我是大千UI工场&#xff0c;设计风格是我们新开辟的栏目&#xff0c;上次讲了毛玻璃风格、辨识方法、应用场景、运用方法等&#xff0c;很受大家欢迎&#xff0c;本次带来常见的风格及辨识&#xff0c;让大家有个总览&#xff0c;以后会逐个讲解的&#xff0c…

【Java】零基础蓝桥杯算法学习——动态规划例题

例题&#xff1a;2023年第十四届蓝桥杯Java软件开发B组E题 蜗牛 参考解答&#xff1a; 参考代码示例&#xff1a; import java.util.Scanner; public class Main {static int N 100010;static int[] arr new int[N];static int[] a new int[N]; //传送带的起始坐标static …

人工智能之数学基础【最小二乘法】

原理 最小二乘法由勒让德(A.M.Legendre)于1805年在其著作《计算彗星轨道的新方法》中提出,主要思想是最小化误差二次方和寻找数据的最佳匹配函数,利用最小二乘法求解未知参数,使得理论值与观测值之差(即误差,或称为残差)的二次方和达到最小,即: E = ∑ i = 1 n ϵ …

【实战】一、Jest 前端自动化测试框架基础入门(一) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(一)

文章目录 一、前端要学的测试课1.前端要学的测试2.前端工程化的一部分3.前端自动化测试的例子4.前端为什么需要自动化测试&#xff1f;5.课程涵盖内容6.前置技能7.学习收获 二、Jest 前端自动化测试框架基础入门1. 自动化测试背景及原理前端自动化测试产生的背景及原理 2.前端自…

开什么店最稳定轻松?适合一个人开的实体店推荐

在创业的道路上&#xff0c;很多人都希望找到一种稳定轻松的开店方式。 作为一名资深的鲜奶吧创业者&#xff0c;我将分享我的经验和见解&#xff0c;希望能给那些想开实体店的朋友们一些启示&#xff01;&#xff01; 我开鲜奶吧已经有 5 年时间了&#xff0c;目前经营的是鲜…

MySQL查询状态

MySQL查询状态 在一个查询周期中&#xff0c;MySQL任何时刻都有一个状态&#xff0c;该状态可能会变化很多次&#xff0c;可以使用show full processlist来进行查看 Sleep 线程正在等待客户端发送新的请求 Query 线程正在执行查询或者正在将结果发送给客户端 Locked 该线程正在…

MIT-BEVFusion系列八--onnx导出1 综述及相机网络导出

目录 综述export-camera.py加载模型加载数据生成需要导出成 onnx 的模块Backbone 模块VTransform 模块 生成 onnx使用 pytorch 原生的伪量化计算方法导出 camera.backbone.onnx导出 camera.vtransform.onnx 综述 bevfusion的各个部分的实现有着鲜明的特点&#xff0c;并且相互…