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

news2024/10/7 4:37:39

在这里插入图片描述

阅读导航

  • 前言
  • 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.coloradmin.cn/o/904318.html

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

相关文章

单链表-Java实现

目录 概念 什么是链表&#xff1f; 为什么链表的头节点不能动&#xff0c;或者不能操作&#xff1f; 链表和数组的区别是什么&#xff1f; 实现 节点 单链表 末尾添加 遍历 按编号添加&#xff1a; 修改节点 删除 面试题 求单链表的长度 求单链表倒数第K个节点 …

Qt关于hex转double,或者QByteArray转double

正常的00 ae 02 33这种类型的hex数据类型可以直接通过以下代码进行转换 double QDataConversion::hexToDouble(QByteArray p_buf) {double retValue 0;if(p_buf.size()>4){QString str1 byteArrayToHexStr(p_buf.mid(0,1));QString str2 byteArrayToHexStr(p_buf.mid(1,…

更安全,更高效的自学网络安全与黑客技术

学习网络安全&#xff08;黑客技术&#xff09; 网络安全是&#xff1a;黑客技术是&#xff1a;网络安全与黑客技术的关系&#xff1a;自学网络安全学习的误区和陷阱&#xff1a;学习网络安全前期需要准备...学习网络安全中期大致步骤&#xff1a;学习网络安全推荐的学习资料&a…

【电子通识】什么是异常分析中的A-B-A方法

工作有了一定的经验之后&#xff0c;在做问题分析的时候&#xff0c;经常会听到别人说把这个部品&#xff08;芯片/模块&#xff09;拿去ABA一下&#xff0c;看看跟谁走。那么对于新人来说是否就会问一个问题&#xff1a;什么是ABA呢&#xff1f; A-B-A 交换是一种简单直接的交…

华为OD七日集训第1期 - 按算法分类,由易到难,循序渐进,玩转OD(文末送书)

目录 一、适合人群二、本期训练时间三、如何参加四、7日集训第一期 ~ 华为OD初体验五、精心挑选21道高频100分经典题目&#xff0c;作为入门。第1天、逻辑分析第2天、字符串处理第3天、数据结构第4天、双指针第5天、递归回溯第6天、二分查找第7天、贪心算法 && 二叉树 …

【双指针】经典数组双指针题LeetCode

文章目录 27. 移除元素 简单283. 移动零 简单&#x1f525;167. 两数之和 II - 输入有序数组 中等11. 盛最多水的容器 中等&#x1f525;15. 三数之和 中等&#xff08;N数之和&#xff09;中等&#x1f525;42. 接雨水 困难 &#x1f525;26. 删除有序数组中的重复项 简单5. 最…

Qt快速学习(一)--对象,信号和槽

目录 1.Qt概述 1.1 什么是Qt 2.2 手动创建 2.3 pro文件 2.4 一个最简单的Qt应用程序 3 第一个Qt小程序 3.1 按钮的创建 3.2 对象模型&#xff08;对象树&#xff09; 3.3 Qt窗口坐标体系 4 信号和槽机制 4.1 系统自带的信号和槽 4.2 自定义信号和槽 4.3信号槽的拓展 4…

GSM/CDMA/VoLTE/VoIP通话

1.GSM(Global System for Mobile Communications) 本质是一种多址技术&#xff0c;将多个通话放入一段无线电频道的方法。特点是通过“时间划分”&#xff0c;称为时分多址。 2.CDMA(Code Division Multiple Access) 一种多址技术&#xff0c;将多个通话放入一段无线电频道的…

11_Redis经典五大类型源码及底层实现

Redis经典五大类型源码及底层实现 一、Redis数据类型的底层数据结构 SDS动态字符串双向链表压缩列表 zpilist哈希表 hashtable调表 skiplist整数集合 intset快速列表 quicklist紧凑列表 listpack 二、Redis源码地址 Github&#xff1a;https://github.com/redis/redis 三、…

Appium 2安装与使用java对Android进行自动化测试

文章目录 1、Appium 2.1安装1.1、系统要求1.2、安装Appium2.1服务1.3、安装UiAutomator2驱动1.4、安装Android SDK platform tools1.5、下载OpenJDK 2、Android自动代码例子2.1、安装Android自动化测试元素定位工具Appium Inspector2.2、编写android app自动化测试代码和使用ex…

Lemon8与中国各大社交平台的内容输出整合,将会掀起何种风浪?

近期,Lemon8迅速在北美地区展开了布局,短短几天的时间,下载量就冲到了美国APP下载总榜的前十,随后更是直登顶生活类APP首榜。作为字节跳动旗下的出海内容平台,一经问世后,就受到了大量用户的关注,并吸引了海外媒体以及营销人士的目光。那么Lemon8与中国各大社交平台的内容输出整…

机器学习笔记之优化算法(十六)梯度下降法在强凸函数上的收敛性

机器学习笔记之优化算法——梯度下降法在强凸函数上的收敛性 引言回顾&#xff1a;凸函数与强凸函数梯度下降法&#xff1a;凸函数上的收敛性分析 关于白老爹定理的一些新的认识梯度下降法在强凸函数上的收敛性收敛性定理介绍结论分析证明过程 引言 本节将介绍&#xff1a;梯度…

人工智能大模型加速数据库存储模型发展 行列混合存储下的破局

数据存储模型 ​专栏内容&#xff1a; postgresql内核源码分析手写数据库toadb并发编程toadb开源库 个人主页&#xff1a;我的主页 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 概述 在数据库的发展过程中&#xff0c;关…

【Linux】进程间通信之信号机制

文章目录 信号的概念信号的产生硬件产生&#xff08;按键盘中的按键&#xff09;软件产生kill函数kill命令abort函数raise函数 捕捉信号后的处理方式默认处理方式SIG_DFL忽略处理方式SIG_IGN自定义信号处理方式signal函数sigaciotn函数 信号的注册进程中的未决信号集&#xff0…

在python中通过调用dll来提高运行速度

1、前言 最近项目中需要录制键鼠命令&#xff0c;然后再通过注入的方式回放录制过程。一般来说&#xff0c;普通的一些点击命令完全可以通过python的一些包来完成键鼠模拟操作&#xff0c;比如通过pyautogui包。但是&#xff0c;鼠标移动过程中&#xff0c;如果采用频率很高的…

C++对象模型实验(clang虚函数表结构)

摘要&#xff1a;本科期间有对比过msvc&#xff0c;gcc&#xff0c;clang的内存布局&#xff0c;距今已经6-7年了&#xff0c;当时还是使用的c11。时间过得比较久了&#xff0c;这部分内容特别是内存对齐似乎C17发生了一些变化&#xff0c;因此再实践下C类模型。本文描述了C不同…

DuckDB Executor:物理计划构建Pipeline并执行(PipelineExecutor)

2023-03-20 duckdb-Push-Based Execution Model 如下SQL的物理计划执行 select 100(select 3), id from user where id (select id from score where id 1) Pipeline与MetaPipeline Pipeline是一串Op. MetaPipeline是pipeline组成的树 Executor构建MetaPipeline MetaPip…

【汇编语言】关于“段”的总结

文章目录 各种段三种段具体案例截图数据段、栈段、代码段同时使用不同段地址数据段、栈段、代码段同时使用一个段地址![在这里插入图片描述](https://img-blog.csdnimg.cn/45c299950ad949e3a90b7ed012b3a9ee.png) 各种段 1、基础 物理地址 段地址 x 16 偏移地址 2、做法 编…

Redis——主从复制+集群搭建(非哨兵)

主从复制 概念 主从复制&#xff0c;是指将一台Redis服务器的数据&#xff0c;复制到其他的Redis服务器。前者称为主节点(master/leader)&#xff0c;后者称为从节点(slave/follower); 数据的复制是单向的&#xff0c;只能由主节点到从节点。Master以写为主&#xff0c;Slave…

CentOS6.8图形界面安装Oracle11.2.0.1.0

Oracle11下载地址 https://edelivery.oracle.com/osdc/faces/SoftwareDelivery 一、环境 CentOS release 6.8 (Final)&#xff0c;测试环境&#xff1a;内存2G&#xff0c;硬盘20G&#xff0c;SWAP空间4G Oracle版本&#xff1a;Release 11.2.0.1.0 安装包&#xff1a;V175…