容器适配器的介绍和模拟实现

news2024/11/15 15:31:06

在这里插入图片描述

💗 💗 博客:小怡同学
💗 💗 个人简介:编程小萌新
💗 💗 如果博客对大家有用的话,请点赞关注再收藏 🌞

Stack的介绍

  1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中。专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行
    元素的插入与提取操作。
  2. 标准容器vector、deque、list均符合这些需求,默认情况下,如果没有为stack指定特定的底层容器,默认情况下使用deque
    //容器适配器简单来说就是封装其它容器进行使用

stack的常见类函数

stack() 构造空的栈
empty() 检测stack是否为空
size() 返回stack中元素的个数
top() 返回栈顶元素的引用
push() 将元素val压入stack中
pop() 将stack中尾部的元素弹出

stack的模拟实现


#include <iostream>
using namespace std;
#include <list>
#include <deque>

namespace zjy
{
	template <class T, class Container = deque<T>>
	class MyStack
	{
	public:
		void Push(const T& x)
		{
			_con.push_back(x);
		}
		void Pop()
		{
			_con.pop_back();
		}
		T& Top()
		{
			return _con.back();
		}
		bool Empty()
		{
			return _con.empty();
		}
		size_t Size()
		{
			return _con.size();
		}
		void Print()
		{
			for (auto& st : _con)
			{
				cout << st << endl;
			}
		}
	private:
		Container _con;
	};

};

Queue的介绍

  1. 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端
    提取元
    2.标准容器类deque和list满足了这些要求。默认情况下,如果没有为queue实例化指定容器类,则使用标
    准容器deque。

Queue的常见类函数

queue() 构造空的队列
empty() 检测队列是否为空,是返回true,否则返回false
size() 返回队列中有效元素的个数
front() 返回队头元素的引用
back() 返回队尾元素的引用
push() 在队尾将元素val入队列
pop() 将队头元素出队列

Queue的模拟实现

#include <iostream>
using namespace std;
#include <list>
#include <deque>

namespace zjy
{
	template <class T, class Container = deque<T>>
	class MyStack
	{
	public:
		void Push(const T& x)
		{
			_con.push_back(x);
		}
		void Pop()
		{
			_con.pop_front();
		}
		T& Front()
		{
			return _con.front();
		}
		T& Back()
		{
			return _con._back();
		}

		bool Empty()
		{
			return _con.empty();
		}
		size_t Size()
		{
			return _con.size();
		}
		void Print()
		{
			for (auto& st : _con)
			{
				cout << st << endl;
			}
		}
	private:
		Container _con;
	};

};

Priority_queue的介绍和模拟实现

  1. 优先队列是一种容器适配器
  2. 标准容器类vector和deque满足这些需求。默认情况下,如果没有为特定的priority_queue类实例化指
    定容器类,则使用vector。
    3.在vector上又使用了堆算法将vector中元素构造成
    堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。

Priority_queue的常见类函数

priority_queue()/priority_queue(first,last) 构造一个空的优先级队列
empty( )检测优先级队列是否为空,是返回true,否则返回
false
top( ) 返回优先级队列中最大(最小元素),即堆顶元素
push(x) 在优先级队列中插入元素x
pop() 删除优先级队列中最大(最小)元素,即堆顶元素

Priority_queue的模拟实现

优先队列的模拟实现会运用到仿函数
仿函数的简介;就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了。


namespace zjy
{

	template<class T, class Container = vector<T>, class Compare = less<T> >//less<T>为大堆
	class priority_queue
	{
	private:
		void AdjustUp(int child)//向上调整,这里增加元素,层层向上调整
		{
			Compare  com;
			int parent = (child - 1) / 2;
			while (parent >= 0)
			{
				Compare com;
				if (com(_con[parent] , _con[child]))
				{
					swap(_con[parent], _con[child]);
					 child = parent;
					parent = (child - 1) / 2;

				}
				else
				{
					break;
				}
				
			}
		}
		void AdjustDown(int parent)//向下调整,这里删除,建堆会使用到
		{
			Compare com;
			int child = parent* 2+1;
			
			while (child < _con.size())
			{
				if ((child + 1) < _con.size() && com( _con[child],  _con[child + 1]))
				{
					child++;
				}
				if (com(_con[child] , _con[parent]))
				{
					std::swap(_con[child],_con[parent]);
					parent = child;
					child = parent * 2 + 1;
				}
				else
				{
					break;
				}
				
			}
		}
		const T& top()
		{
			return _con[0];

		}
		bool empty()
		{
			return _con.empty();
		}
		size_t size()
		{
			return _con.size();
		}
	public:
		template<class InputIterator>
		priority_queue(InputIterator first, InputIterator last)//迭代器构造
		{
			while (first != last)
			{
				_con.push_back(*first);
				first++;
			}
			for (int i = (_con.size() - 2) / 2; i >= 0; i--)
			{
				AdjustDown(i);
			}
		}
		void push(const T& x)
		{
			_con.push_back(x);
			
			AdjustUp(_con.size()-1);
		}
		void pop()
		{
			std::swap(_con[0],_con[_con.size()-1]);
			_con.pop_back();
			AdjustDown(0);

		}
 	private:
		Container _con;
	};
}

反向迭代器的的介绍和模拟实现

反向迭代器是一种反向遍历容器的迭代器
//这里直接封装正向迭代器


	template<class iterator , class Ref  ,class Ptr>
	class reverse_iterator
	{
	public:
		typedef reverse_iterator<iterator, Ref, Ptr> self;
		reverse_iterator(const iterator& _it)
			:it(_it)
		{}
		self& operator++()//前置++
		{
			--it;
			return *this;
		}

		self operator++(int)//后置++
		{
			self tmp(it);
			it--;
			return tmp;
		}

		self& operator--() 
		{
			it++;
			return *this;
		}

		self operator--(int)
		{
			self tmp(it);
			it++;
			return tmp;
		}

		bool operator!=(const self& n) const
		{
			return it != n.it;
		}

		bool operator==(const self& n) const
		{
			return it == n.it;
		}


		Ref operator*() //解引用访问数据
		{ 
			iterator tmp = it;
			return *(--tmp);//因为反向所以解引用前一位
		}

		Ptr operator->()
		{
			return  &(operator*());
		}
		
	private:
		iterator it;
	};
}

在这里插入图片描述

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

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

相关文章

如何看到公司所有员工的收发件,并以员工名义一键发信

对于企业管理层来说, 了解并监控员工的企业邮箱成为了日常工作中的一部分。这不仅可以帮助企业更好地掌握业务进展, 还能够提高工作效率。本文将详细介绍如何通过Zoho邮箱实现这一目标, 包括相关的技术原理、实现的好处以及具体的实施步骤。 一、实现的技术: POP3 和 IMAP 要…

C++类和对象(2)——构造函数和析构函数

###前言&#xff1a;此文主要介绍C中的六种默认成员函数&#xff1b;默认的意思就是我们不写编译器会自动生成&#xff1b;这些函数在类里面自动生成&#xff1b;但是我们也可以自己写&#xff1b;学习这几种默认成员函数从两个方面入手&#xff1a; &#xff08;1&#xff09…

“AI大语言模型+”助力大气科学相关交叉领域实践技术应用

查看原文>>>“AI大语言模型”助力大气科学相关交叉领域实践技术应用 目录 专题一、预备知识 专题二、科研辅助专题 专题三、可视化专题——基于GPT实现 专题四、站点数据处理 专题五、WRF专题——基于GPT和Python实现 专题六、遥感降水专题——基于GPT和Python…

#java学习笔记(面向对象)----(未完结)

一基础相关知识点&#xff1a; 1. 一个对象的调用 首先我们创建一个Phone类 public class Phone {//成员变量String name;int age;String favourite;//成员方法public void myName(){System.out.println(name);}public void myAge(){System.out.println(age);}public void m…

免费写作神器,自动生成高质量文章

在当今数字化的时代&#xff0c;信息的传播和创作变得前所未有的重要。无论是企业的营销推广、个人的博客写作&#xff0c;还是学术研究报告&#xff0c;优质的文章都能发挥巨大的作用。而随着人工智能技术的飞速发展&#xff0c;免费的ai写作工具应运而生&#xff0c;为我们带…

虚拟内存惹

二、理解 虚拟内存 虚拟内存存在的原因物理地址和虚拟地址虚拟内存的其他介绍 虚拟内存存在的原因 计算机系统有两种地址&#xff1a;1、物理地址 2、虚拟地址 物理地址&#xff1a;是指真实的地址&#xff0c;是物理存在的&#xff0c;比如RAM、flash等 虚拟地址&#xff1a;…

使用相同模型相同数据集,为什么每次运行得到的损失值都不一样?

今天小编在学习 PyTorch 时,突然发现咋每次运行所得损失绘制的曲线都不一样呢&#xff1f;即使小编使用torch.manual_seed()函数固定 torch 的随机数种子每次运行的结果还是不一样&#xff0c;因此小编就写一篇文章记录一下。 数据集 本次使用的数据集是小编自定义的小型数据…

MySQL数据管理 - 查询语句

文章目录 查询数据1 查询指定列2 条件查询3 合并查询4 模糊查询5 聚合函数查询6 对值进行排序7 分组查询8 分页查询9 数据库关联查询1 内连接 INNER JOIN2 LEFT JOIN3 右连接 10 数据库子查询参考 查询数据 数据库最常用的操作就是查询&#xff0c;也是数据操作的基础&#xf…

MySQL基础练习题23-门店处理

目录 题目 准备数据 分析数据 方法一 方法二 题目 从分店明细表中获取门店面积。 准备数据 -- 创建库 drop database if exists db_1; create database db_1; use db_1;-- 创建门店面积表 tb_store_area CREATE TABLE tb_store_area (store_no VARCHAR(50),area…

[器械财讯]TRiCares完成近4亿融资,推动Topaz三尖瓣置换系统发展

一、融资成功助力临床研究 法国医疗器械公司TRiCares近期宣布&#xff0c;其D轮融资成功筹集5000万美元&#xff0c;所得资金将专用于支持其核心产品——经导管三尖瓣置换系统&#xff08;TTVR&#xff09;Topaz的临床研究和开发。这笔资金将用于在美国和欧盟开展临床研究&…

手持红外热成像仪的使用方法_鼎跃安全

手持红外热成像仪是一种便携设备&#xff0c;方便在现场进行温度检测和成像。他们能将物体发出的不可见红外能量转化为可见的热图像&#xff0c;直观展示物体表面的温度分布情况&#xff1b;广泛应用于电气设备维修、环保检查、应急救援等领域。接下来&#xff0c;我们一起来了…

行业原型:智慧教育线上平台-学院原型

行业原型预览链接&#xff1a; 文件类型&#xff1a;.rp 支持版本&#xff1a;Axrure RP 8 文档名称&#xff1a;智慧教育线上平台-学院 文件大小&#xff1a;1.80 MB 目录内容介绍 文档内容介绍 回复“211110” 领取

《最新出炉》系列小成篇-Python+Playwright自动化测试-66 - 等待元素至指定状态(出现、移除、显示和隐藏)

1.简介 在我们日常工作中进行UI自动化测试时&#xff0c;保证测试的稳定性至关重要。其中一个关键方面是正确地定位和操作网页中的元素。在网页中&#xff0c;元素可能处于不同的状态&#xff0c;有些可能在页面加载完成之前不在DOM中&#xff0c;需要某些操作后才会出现&…

视频剪辑sdk,跨平台部署,助力企业差异化竞争

在这个内容为王的时代&#xff0c;视频已成为连接用户、传递价值的核心媒介。无论是社交媒体、在线教育、短视频平台还是新闻资讯&#xff0c;高质量的视频内容都是吸引用户、提升用户体验的关键。然而&#xff0c;对于众多企业而言&#xff0c;如何高效、专业地处理视频内容&a…

字节跳动春节抖音视频红包系统设计与实现--图文解析

字节跳动春节抖音视频红包系统设计与实现–图文解析 原作者&#xff1a;字节跳动技术团队 原文链接&#xff1a;https://www.toutiao.com/article/7114224228030841374 原标题&#xff1a;2022 春节抖音视频红包系统设计与实现 我们做了什么 业务背景 在春节活动期间&…

洛谷 P10034 「Cfz Round 3」Circle

[Problem Discription] \color{blue}{\texttt{[Problem Discription]}} [Problem Discription] [Solution] \color{blue}{\texttt{[Solution]}} [Solution] 这是道好题。 建图&#xff0c;对每一个 i → p i i \to p_{i} i→pi​ 都建立一个有向边&#xff0c;就可以得到一个…

记一次学习--[网鼎杯 2018]Comment二次注入

目录 本文章只展示二次注入过程&#xff0c;后续获取flag并不展示 靶场 网站流程、密码的破解和目录的查询以及对于源代码获取 密码暴力破解 网站目录扫描 网站源代码获取 网站流程 尝试注入 注入代码 本文章只展示二次注入过程&#xff0c;后续获取flag并不展示 靶场…

IntelliJ IDEA 2024.2 夏季大版本发布,不得不说,更强了!

因 CSDN 上传大小限制&#xff0c;本文推荐微信中阅读&#xff0c;动图更完整&#xff0c;微信中阅读&#xff0c;请欢迎关注公众号&#xff1a;CodeFit 创作不易&#xff0c;如果你觉得这篇文章对您有帮助&#xff0c;请不要忘了 点赞、分享 和 关注&#xff0c;为我的 持续创…

Katalon Studio 使用教程——自动获取元素定位功能

这个功能很实用&#xff0c;简单来讲可以形容为&#xff0c;想要哪里点哪里&#xff0c;so easy。 比如你想定位某个输入框&#xff0c;只需要按住【Alt】&#xff0c;点一下输入框&#xff0c;系统就自动记录下来这个输入框叫什么&#xff0c;它的xpath是什么。你想要按钮就点…

arXiv2024.8.6 | LLaVA-OneVision:Easy Visual Task Transfer

Comment: Project Homepage: https://llava-vl.github.io/blog/2024-08-05-llava-onevision/ 论文标题&#xff1a;LLaVA-OneVision&#xff1a;Easy Visual Task Transfer 论文地址&#xff1a;https://arxiv.org/abs/2408.03326 GitHub&#xff1a;https://llava-vl.githu…