【C++入门到精通】C++入门 —— 容器适配器、stack和queue(STL)

在这里插入图片描述

阅读导航

  • 前言
  • stack
    • 1. stack概念
    • 2. stack特点
    • 3. stack使用
  • queue
    • 1. queue概念
    • 2. queue特点
    • 3. queue使用
  • 容器适配器
    • 1. 什么是适配器
    • 2. STL标准库中stack和queue的底层结构
    • 3. STL标准库中对于stack和queue的模拟实现
      • ⭕stack的模拟实现
      • ⭕stack的模拟实现
  • 总结
  • 温馨提示

前言

文章绑定了VS平台下std::stack和std::queue的源码,大家可以下载了解一下😍
前面我们讲了C语言的基础知识,也了解了一些数据结构,并且讲了有关C++的命名空间的一些知识点以及关于C++的缺省参数、函数重载,引用 和 内联函数也认识了什么是类和对象以及怎么去new一个 ‘对象’ ,以及学习了几个STL的结构也相信大家都掌握的不错,接下来博主将会带领大家继续学习有关C++比较重要的知识点—— stack & queue(STL)。下面话不多说坐稳扶好咱们要开车了😍

stack

1. stack概念

stack 的文档介绍

在C++中std::stack是一个模板类,它是基于容器的适配器,用于实现堆栈数据结构。堆栈是一种后进先出(LIFO)的数据结构,类似于现实生活中的一叠盘子。std::stack类位于<stack>头文件中,并且是C++标准库的一部分。它提供了一组成员函数和操作符,用于对堆栈进行操作。
在这里插入图片描述

2. stack特点

  1. 后进先出(LIFO):std::stack是一种后进先出的数据结构,这意味着最后压入堆栈的元素将首先被弹出

  2. 基于容器的适配器:std::stack是基于容器的适配器,它使用底层容器来存储元素。默认情况下,std::deque被用作底层容器,但你也可以选择其他容器,如std::vectorstd::list

  3. 快速插入和删除:由于std::stack是基于容器的适配器,它使用底层容器的插入和删除操作来实现元素的压入和弹出。这些操作的时间复杂度通常是常数时间,因此插入和删除操作非常高效

  4. 无索引访问:std::stack不支持通过索引访问元素。你只能访问堆栈顶部的元素,即使用top()函数。如果你需要访问其他位置的元素,你需要先将顶部的元素弹出。

  5. 无迭代器支持:std::stack不支持迭代器,因此你不能使用迭代器遍历堆栈中的元素。如果你需要遍历堆栈中的元素,你需要先将它们弹出。

  6. 大小可变:std::stack的大小是可变的,你可以根据需要动态地压入和弹出元素。

3. stack使用

  1. 包含头文件:首先,你需要包含<stack>头文件,以便使用std::stack类。
#include <stack>
  1. 创建堆栈对象:使用std::stack类创建一个堆栈对象。你需要指定堆栈中元素的类型。例如,如果你想创建一个存储整数的堆栈,你可以这样做:
std::stack<int> myStack;
  1. 压入元素:使用push(element)函数将元素压入堆栈的顶部。你可以连续调用push()函数来压入多个元素。
myStack.push(10);
myStack.push(20);
myStack.push(30);
  1. 弹出元素:使用pop()函数从堆栈的顶部移除元素。你可以使用循环或条件语句来连续弹出元素。
myStack.pop();
  1. 访问顶部元素:使用top()函数可以访问堆栈顶部的元素,但不会将其从堆栈中移除。
int topElement = myStack.top();
  1. 检查堆栈是否为空:使用empty()函数可以检查堆栈是否为空。如果堆栈为空,返回true;否则返回false
if (myStack.empty()) {// 堆栈为空
} else {// 堆栈不为空
}
  1. 获取堆栈的大小:使用size()函数可以获取堆栈中元素的数量。
int stackSize = myStack.size();

这些是使用std::stack的一般步骤。可以根据需要进行堆栈的操作,如压入元素、弹出元素、访问顶部元素等。

queue

1. queue概念

queue的文档介绍

在C++中,queue(队列)是一种数据结构,它遵循先进先出(FIFO)的原则。它类似于现实生活中的排队,新元素被添加到队列的末尾,而从队列中移除元素时,总是从队列的前端开始
在这里插入图片描述

2. queue特点

  1. 先进先出(FIFO):std::queue是一种先进先出的数据结构,这意味着最先添加到队列的元素将首先被移除。

  2. 基于容器的适配器:std::queue是基于容器的适配器,它使用底层容器来存储元素。

  3. 快速插入和删除:由于std::queue是基于容器的适配器,它使用底层容器的插入和删除操作来实现元素的添加和移除。这些操作的时间复杂度通常是常数时间,因此插入和删除操作非常高效。

  4. 无索引访问:std::queue不支持通过索引访问元素。你只能访问队列的前端和末尾元素,即使用front()back()函数。

  5. 无迭代器支持:std::queue不支持迭代器。如果你需要遍历队列中的元素,你需要先将它们移除。

  6. 大小可变:std::queue的大小是可变的,你可以根据需要动态地添加和移除元素。

3. queue使用

  1. 包含头文件:首先,你需要包含<queue>头文件,以便使用std::queue类。
#include <queue>
  1. 创建队列对象:使用std::queue类创建一个队列对象。你需要指定队列中元素的类型。例如,如果你想创建一个存储整数的队列,你可以这样做:
std::queue<int> myQueue;
  1. 添加元素:使用push(element)函数将元素添加到队列的末尾。你可以连续调用push()函数来添加多个元素。
myQueue.push(10);
myQueue.push(20);
myQueue.push(30);
  1. 移除元素:使用pop()函数从队列的前端移除元素。你可以使用循环或条件语句来连续移除元素。
myQueue.pop();
  1. 访问前端和末尾元素:使用front()函数可以访问队列的前端元素,使用back()函数可以访问队列的末尾元素,但不会将它们从队列中移除。
int frontElement = myQueue.front();
int backElement = myQueue.back();
  1. 检查队列是否为空:使用empty()函数可以检查队列是否为空。如果队列为空,返回true;否则返回false
if (myQueue.empty()) {// 队列为空
} else {// 队列不为空
}
  1. 获取队列的大小:使用size()函数可以获取队列中元素的数量。
int queueSize = myQueue.size();

这些是使用std::queue的一般步骤。可以根据需要进行队列的操作,如添加元素、移除元素、访问前端和末尾元素等。

容器适配器

1. 什么是适配器

适配器是一种设计模式,它允许将一个类的接口转换为另一个类的接口,以便两个类可以协同工作。适配器模式通常用于解决两个不兼容的接口之间的问题。

在C++中,适配器也可以指代标准库中的容器适配器。容器适配器是一种特殊类型的容器,它使用底层容器来提供不同的接口和功能。适配器通过封装底层容器的操作,提供了一组新的操作和语义

2. STL标准库中stack和queue的底层结构

虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为stack和队列只是对其他容器的接口进行了包装,STL标准库中std::stackstd::queue。它们分别基于底层容器(默认为std::deque)提供了堆栈和队列的功能。
在这里插入图片描述
在这里插入图片描述

3. STL标准库中对于stack和queue的模拟实现

⭕stack的模拟实现

template<class T, class Container = deque<T>>
class stack
{
public://入栈void push(const T& x){_con.push_back(x);}//出栈void pop(){_con.pop_back();}//返回栈顶数据T& top(){return _con.back();}//返回const类型栈顶数据const T& top() const{return _con.back();}//判断是否为空bool empty(){return _con.empty();}//返回栈的大小size_t size() const{return _con.size();}
private:Container _con;
};

⭕stack的模拟实现

template<class T, class Container = deque<T>>
class queue
{
public://进入队列void push(const T& x){_con.push_back(x);}		//出队列void pop(){_con.pop_front();}//返回队尾数据T& back(){return _con.back();}//返回队头数据T& front(){return _con.front;}//返回const类型队尾数据const T& back() const{return _con.back();}//返回const类型队头数据const T& front() const{return _con.front;}//判断是否为空bool empty() const{return _con.empty();}//返回队列大小size_t size() const{return _con.size();}
private:Container _con;
};

总结

stack是一种后进先出(LIFO)的数据结构,它是一种容器适配器。它的特点是最后添加的元素将首先被移除。stack使用底层容器来存储元素,默认情况下使用std::deque作为底层容器。。queue是一种先进先出(FIFO)的数据结构,也是一种容器适配器。它使用底层容器来存储元素,默认情况下使用std::deque作为底层容器。适配器是一种设计模式,它允许将一个类的接口转换为另一个类的接口,以便两个类可以协同工作。在STL标准库中,stack和queue是基于其他容器实现的容器适配器。它们使用底层容器来存储元素,并提供了堆栈和队列的功能。

温馨提示

感谢您对博主文章的关注与支持!在阅读本篇文章的同时,我们想提醒您留下您宝贵的意见和反馈。如果您喜欢这篇文章,可以点赞、评论和分享给您的同学,这将对我提供巨大的鼓励和支持。另外,我计划在未来的更新中持续探讨与本文相关的内容。我会为您带来更多关于C++以及编程技术问题的深入解析、应用案例和趣味玩法等。请继续关注博主的更新,不要错过任何精彩内容!

再次感谢您的支持和关注。我们期待与您建立更紧密的互动,共同探索C++、算法和编程的奥秘。祝您生活愉快,排便顺畅!
在这里插入图片描述

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

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

相关文章

微信小程序:模板使用

目录 模板的优点&#xff1a; 一、静态模板创建 二、静态模板使用 1.*.wxml引入模板 2.模板使用 3.*.wxss引入模板的样式 三、动态模板创建 四、动态模板使用 1.*.wxml引入模板 2.模板使用 3.*.js定义动态数据 五、结果展示 总结 模板的优点&#xff1a; 有利于保持网…

记录--webpack和vite原理

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 前言 每次用vite创建项目秒建好&#xff0c;前几天用vue-cli创建了一个项目&#xff0c;足足等了我一分钟&#xff0c;那为什么用 vite 比 webpack 要快呢&#xff0c;这篇文章带你梳理清楚它们的原理…

【算法——双指针】LeetCode 11 盛最多水的容器

题目描述&#xff1a; 解题思路&#xff1a; 如图所示&#xff1a; 1、我们考虑相距最远的两个柱子所能容纳水的面积。宽度是两根柱子之间的距离8&#xff1b;高度取决于两根柱子之间较短的那个&#xff0c;即左边柱子的高度3。水的面积就是3824。 2、如果选择固定一根柱子&…

在线HmacMd5加密工具--在线获取哈希值又称摘要

具体请前往&#xff1a;在线计算HMacMd5工具

Flink-----Yarn应用模式作业提交流程

Yarn应用模式作业提交流程 在Yarn当中又分为Session&#xff0c;PerJob&#xff0c;Application&#xff0c;建议和推荐使用独立集群的&#xff0c;其中就包含PerJob 和Application&#xff0c;但是1.17版本的Flink已将PerJob标记为过时&#xff0c;并且Application可以解决Pe…

地球IT

地球是我们生活的家园&#xff0c;也是人类发展的基地。地球不仅仅是一个行星&#xff0c;更是一个复杂而有机的生态系统。 地球直径约为12,742公里&#xff0c;被称为“蓝色星球”&#xff0c;因为它的表面约70%被水覆盖。海洋是地球上最大的生态系统之一&#xff0c;它们扮演…

Hi-TRS:骨架点视频序列的层级式建模及层级式自监督学习

论文题目&#xff1a;Hierarchically Self-Supervised Transformer for Human Skeleton Representation Learning 论文下载地址&#xff1a;https://www.ecva.net/papers/eccv_2022/papers_ECCV/papers/136860181.pdf 代码地址&#xff1a;https://github.com/yuxiaochen1103…

Dodaf架构的学习分享

一.Dodaf的内容 Dodaf的背景 DODAF&#xff08;Department of Defense Architecture Framework&#xff09;起源于美国国防部&#xff0c;是一个用于支持复杂系统设计、规划和实施的架构框架。以下是DODAF的背景和起源&#xff1a; 复杂系统需求&#xff1a;在军事和国防领域&…

0102垂直分片-jdbc-shardingsphere

1 前言 垂直分片分为垂直分库于垂直分表&#xff0c;但是实际应用中数据库表会根据业务需要提前做好规划&#xff0c;垂直分表的情况很少使用。但是随着业务增长&#xff0c;某些重点业务数据库压力增大&#xff0c;可能考虑需要考虑垂直分库的情况。 垂直分库&#xff0c;简…

阿里云故障洞察提效 50%,全栈可观测建设有哪些技术要点?

本文根据作者在「TakinTalks 稳定性社区 」公开分享整理而成 #一分钟精华速览# 全栈可观测是一种更全面、更综合和更深入的观测能力&#xff0c;能协助全面了解和监测系统的各个层面和组件&#xff0c;它不仅仅是一个技术上的概念&#xff0c;更多地是技术与业务的结合。在“…

Dockerfile创建 LNMP 服务+Wordpress 网站平台

文章目录 一.环境及准备工作1.项目环境2.服务器环境3.任务需求 二.Linux 系统基础镜像三.docker构建Nginx1.建立工作目录上传安装包2.编写 Dockerfile 脚本3.准备 nginx.conf 配置文件4.生成镜像5.创建自定义网络6.启动镜像容器7.验证 nginx 四.docker构建Mysql1. 建立工作目录…

【C++奇遇记】构造函数 | 初始化列表

&#x1f3ac; 博客主页&#xff1a;博主链接 &#x1f3a5; 本文由 M malloc 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;LeetCode刷题集 数据库专栏 初阶数据结构 &#x1f3c5; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如…

Yellowbrick新手入门简介:用于Python机器学习模型可视化的工具库

Yellowbrick 是一个新的 Python 库&#xff0c;它扩展了 Scikit-Learn API&#xff0c;将可视化合并到机器学习工作流程中。 Yellowbrick需要依赖诸多第三方库&#xff0c;包括Scikit-Learn&#xff0c;Matplotlib&#xff0c;Numpy等等。 Yellowbrick 是一个开源的纯 Python…

uploadifive php上传进度条插件 解决动态传参数问题

uploadifive默认只能在加载时,静态传递参数.如果想让用户输入参数.再动态读取.传到后端,是没有直接的办法的 效果图 但我们可以通过settings.formData 来修改配置的方式传参数,完整演示 <form id"file_form{$v.id}" style"display:none"><hr/>…

开源后台管理系统Geekplus Admin

本系统采用前后端分离开发模式&#xff0c;后端采用springboot开发技术栈&#xff0c;mybatis持久层框架&#xff0c;redis缓存&#xff0c;shiro认证授权框架&#xff0c;freemarker模版在线生成代码&#xff0c;websocket消息推送等&#xff0c;后台管理包含用户管理&#xf…

rn和flutter出现“Running Gradle task ‘assembleDebug

在第一次运行rn和flutter时&#xff0c;会卡在Running Gradle task assembleDebug&#xff0c;可以使用阿里的镜像&#xff0c;如下图&#xff1a; maven { url https://maven.aliyun.com/repository/google/ } google() maven { url https://maven.aliyun.com/repository/jcen…

【NAS群晖drive异地访问】使用cpolar远程访问内网Synology Drive「内网穿透」

文章目录 前言1.群晖Synology Drive套件的安装1.1 安装Synology Drive套件1.2 设置Synology Drive套件1.3 局域网内电脑测试和使用 2.使用cpolar远程访问内网Synology Drive2.1 Cpolar云端设置2.2 Cpolar本地设置2.3 测试和使用 3. 结语 前言 群晖作为专业的数据存储中心&…

无涯教程-TensorFlow - 分布式计算

本章将重点介绍如何开始使用分布式TensorFlow&#xff0c;目的是帮助开发人员了解重复出现的基本分布式TF概念&#xff0c;如TF服务器。无涯教程将使用Jupyter Notebook分布式TensorFlow。 第1步 - 导入分布式计算必需的必要模块- import tensorflow as tf 第2步 - …

Linux 系统编程拾遗

Linux 系统编程拾遗 进程的创建 进程的创建 fork()、exit()、wait()以及execve()的简介 创建新进程&#xff1a;fork()

Python自动化小技巧18——自动化资产月报(word设置字体表格样式,查找替换文字)

案例背景 每月都要写各种月报&#xff0c;经营管理月报&#xff0c;资产月报.....这些报告文字目标都是高度相似的&#xff0c;只是需要替换为每个月的实际数据就行&#xff0c;如下&#xff1a; (打码是怕信息泄露.....) 可以看到&#xff0c;这个报告的都是高度模板化&…