C++初阶——简单实现stack和queue

目录

1、Deque(了解)

1.1 起源

1.2 结构

1.3 优缺点

1.4 应用

2、Stack

3、Queue

4、Priority_Queue


注意:stack,queue,priority_queue是容器适配器(container adaptor) ,封装一个容器,按照某种规则使用,一般不实现迭代器。

1、Deque(了解)

1.1 起源

vector和list优缺点,挺互补的,能不能实现一个容器,都具备他们的优点,就这样,deque诞生了,但是从现在来看,deque,并不算成功 。

1.2 结构

中控数组(map),是一个指针数组,指针指向一个buffer数组的地址,通过迭代器遍历。

细节:

1. map中的指针,一开始放在中间位置,方便头插数据。

2. 使用两个迭代器,start,finish。

3. 通过,取模,除,找到是在第几个buffer数组的第几个位置。

1.3 优缺点

优点:

1. 头插尾插效率高。

2. 随机下标访问也不错。

缺点:

3. 中部位置插入删除,需挪动数据,效率低。

4. 遍历数据,需频繁检查,效率低。

1.4 应用

STL中对stack和queue默认选择deque作为其底层容器,主要是因为:

1. stack和queue不需要遍历(因此stack和queue没有迭代器),只需要在固定的一端或者两端进行操作

2. 在stack中元素增长时,deque比vector的效率高(扩容时不需要搬移大量数据);

    在queue中元素增长时,deque不仅效率高,而且内存使用率高。(一次开更多的空间,只存数据,不存节点)

2、Stack

#pragma once
#include <deque>

using namespace std;

namespace Lzc
{
	template<class T, class Container = deque<T>>
	class stack
	{
	public:
		void push(const T& val)
		{
			_con.push_back(val);
		}
		void pop()
		{
			_con.pop_back();
		}
		const T& top() const
		{
			return _con.back();
		}
		size_t size() const
		{
			return _con.size();
		}
		bool empty() const
		{
			return _con.empty();
		}
	private:
		Container _con;
	};
}

3、Queue

#pragma once
#include <deque>

using namespace std;

namespace Lzc
{
	template<class T,class Container = deque<T>>
	class queue
	{
	public:
		void push(const T& val)
		{
			_con.push_back(val);
		}
		void pop()
		{
			_con.pop_front();
		}
		const T& front() const
		{
			return _con.front();
		}
		const T& back() const
		{
			return _con.back();
		}
		size_t size() const
		{
			return _con.size();
		}
		bool empty() const
		{
			return _con.empty();
		}
	private:
		Container _con;
	};
}

4、Priority_Queue

容器适配器,封装vector,采用堆的结构。堆+堆排序+topK问题_大顶堆小顶堆java-CSDN博客

先介绍一下仿函数:本质是一个类,这个类重载operator(),他的对象可以像函数一样使用。

如:Less le;    le.operator()(x,y) 等价于 le(x,y);

#include <algorithm>
#include <vector>

using namespace std;

// less(<) 升序
// greater(>) 降序
template<class T>
struct Less
{
	bool operator()(const T& x, const T& y)
	{
		return x < y;
	}
};

template<class T>
struct Greater
{
	bool operator()(const T& x, const T& y)
	{
		return x > y;
	}
};

int main()
{
	vector<int> v = {3,2,4,5,1,6,7,8,9};

	// void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

	sort(v.begin(),v.end(),Less<int>()); // 升序 函数模板,传对象(匿名对象)
	sort(v.begin(),v.end(),Greater<int>()); // 降序

	return 0;
}
#pragma once
#include <vector>

using namespace std;

namespace Lzc
{
	template<class T, class Container = vector<T>, class Compare = less<T>> // 使用std中的less<T>和greater<T>
	class priority_queue
	{
	public:
		void AdjustUp(size_t child)//建大堆,child为插入元素的下标
		{
			size_t parent = (child - 1) / 2;
			Compare com;
			while (child > 0)
			{
				//if (_con[parent] < _con[child])
				if (com(_con[parent], _con[child])) //建大堆
				{
					swap(_con[parent], _con[child]);
					child = parent;
					parent = (parent - 1) / 2;
				}
				else
					break;//没有交换,则就是在这个位置
			}
		}

		void AdjustDown(size_t parent)//建大堆,n为a的元素个数,parent为要向下调整的元素下标
		{
			size_t child = 2 * parent + 1;
			Compare com;
			while (child < size())
			{
				//if (_con[child] < _con[child + 1] && child + 1 < n) // 假设法,建大堆
				if (com(_con[child], _con[child + 1] && child + 1 < size()))
					child++;
				// if (_con[parent] < _con[child]) // 建大堆
				if (com(_con[parent], _con[child]))
				{
					swap(_con[parent], _con[child]);
					parent = child;
					child = 2 * child + 1;
				}
				else
					break;
			}
		}

		void push(const T& val)
		{
			_con.push_back(val);
			AdjustUp(size() - 1);
		}
		void pop()
		{
			swap(_con[0], _con[size() - 1]);
			_con.pop_back();
			AdjustDown(0);
		}
		const T& top() const
		{
			return _con.front();
		}
		size_t size() const
		{
			return _con.size();
		}
		bool empty() const
		{
			return _con.empty();
		}
	private:
		Container _con;
	};
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Git】六、企业级开发模型

文章目录 Ⅰ. 前言Ⅱ. 系统开发环境Ⅲ. Git 分支设计规范master分支release分支develop分支feature分支hotfix分支 Ⅰ. 前言 ​ 我们知道&#xff0c;一个软件从零开始到最终交付&#xff0c;大概包括以下几个阶段&#xff1a;规划、编码、构建、测试、发布、部署和维护。 ​…

Apache SeaTunnel 构建实时数据同步管道(最新版)

文章作者 王海林 白鲸开源 数据集成引擎研发 Apache SeaTunnel Committer & PMC Member&#xff0c;Apache SkyWalking Committer&#xff0c;多年平台研发经验&#xff0c;目前专注于数据集成领域。 导读 在当今数字化快速发展的时代&#xff0c;数据已然成为企业决策…

在 Windows 上配置 Ollama 服务并开放局域网访问

为了在局域网内共享 Ollama 服务&#xff0c;我们需要完成以下两步&#xff1a; 1、设置 Ollama 的环境变量 OLLAMA_HOST&#xff0c;使其监听局域网的 IP 地址。 &#xff08;1&#xff09; 配置 Ollama 服务的监听地址 Ollama 服务使用环境变量 OLLAMA_HOST 来指定监听的地…

错误 MSB3073 命令“setlocal“

最近在搞opencv的c版本。报了这个错很头疼。 点击项目>属性 把这里命令行删掉就行。

【时时三省】(C语言基础)常量和变量

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 在计算机高级语言中&#xff0c;数据有两种表现形式&#xff1a;常量和变量。 常量 在程序运行过程中&#xff0c;其值不能被改变的量称为常量。数值常量就是数学中的常数。 常用的常量有以…

deep-research 专用评测数据集

Deep Research自2025年2月初由OpenAI推出后迅速引发全球关注&#xff0c;其通过端到端强化学习技术实现多步骤研究任务自动化&#xff0c;能在数十分钟内生成分析师水平报告&#xff0c;效率远超人类&#xff08;耗时从30分钟到30天不等&#xff09;&#xff0c;被学者评价为“…

WordPress平台如何接入Deepseek,有效提升网站流量

深夜改代码到崩溃&#xff1f;《2024全球CMS生态报告》揭露&#xff1a;78%的WordPress站长因API对接复杂&#xff0c;错失AI内容红利。本文实测「零代码接入Deepseek」的保姆级方案&#xff0c;配合147SEO的智能发布系统&#xff0c;让你用3个步骤实现日均50篇EEAT合规内容自动…

QT零基础学习之路(六)--如何添加资源文件

源码地址&#xff08;优先更新&#xff09;&#xff1a;点击此处

【愚公系列】《Python网络爬虫从入门到精通》033-DataFrame的数据排序

标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…

Python入门12:面向对象的三大特征与高级特性详解

面向对象编程&#xff08;OOP&#xff09;是Python编程中非常重要的一部分&#xff0c;它通过封装、继承和多态这三大特征&#xff0c;帮助我们更好地组织和管理代码。除此之外&#xff0c;Python还提供了一些其他特性&#xff0c;如类属性、类方法和静态方法&#xff0c;进一步…

20分钟 Bash 上手指南

文章目录 bash 概念与学习目的第一个 bash 脚本bash 语法变量的使用位置参数管道符号&#xff08;过滤条件&#xff09;重定向符号条件测试命令条件语句case 条件分支Arrayfor 循环函数exit 关键字 bash 脚本记录历史命令查询文件分发内容 bash 概念与学习目的 bash&#xff0…

观成科技:海莲花“PerfSpyRAT”木马加密通信分析

1.概述 在2024年9月中旬至10月&#xff0c;东南亚APT组织“海莲花”通过GitHub发布开源安全工具项目&#xff0c;针对网络安全人员发起了定向攻击。通过对相关攻击活动进行分析&#xff0c;可以将其与一些海莲花的样本关联起来。这些样本的通信数据结构与海莲花此前使用的攻击…

Orange 开源项目 - 集成百度智能云-千帆大模型

1 集成百度智能云-千帆大模型 百度智能云-千帆ModelBuilder百度智能云千帆大模型服务与开发平台ModelBuilder&#xff08;以下简称千帆ModelBuilder&#xff09;是面向企业开发者的一站式大模型开发及服务运行平台。千帆ModelBuilder不仅提供了包括文心一言底层模型和第三方开源…

猿大师播放器:网页内嵌VLC/FFPlayer在Web端直接播放RTSP/RTMP/H.265视频流

据统计&#xff0c;2024年中国视频转码服务器市场规模已突破百亿&#xff0c;但企业IT投入中约40%用于转码服务器的采购与维护&#xff0c;消防、安防等场景对实时性的严苛要求&#xff08;如火灾预警需秒级响应&#xff09;&#xff0c;使得传统转码方案因延迟过高而屡屡失效&…

uni-app 开发 App 、 H5 横屏签名(基于lime-signature)

所用插件&#xff1a;lime-signature 使用到 CSS 特性 绝对定位transform 旋转transform-origin transform 原点 复习一下定位元素&#xff08;相对定位、绝对定位、粘性定位&#xff09; 代码# <template><view class"signature-page"><view clas…

搜广推校招面经三十一

vivo策略算法 一、机器学习中 L1 和 L2 正则化的原理 见【搜广推校招面经二十五】 L1 正则化将某些特征权重置0实现模型简化&#xff0c;而 L2 正则化主要通过平滑权重来实现模型简化。 1.1. 正则化的原理 正则化的核心思想是在损失函数中加入一个惩罚项&#xff08;Regula…

DeepSeek+Kimi生成高质量PPT

DeepSeek与Kimi生成PPT全流程解析 一、工具分工原理 DeepSeek核心作用&#xff1a;生成结构化PPT大纲&#xff08;擅长逻辑构建与内容优化&#xff09;Kimi核心作用&#xff1a;将文本转换为视觉化PPT&#xff08;提供模板库与排版引擎&#xff09; 二、操作步骤详解 1. 通…

vmware虚拟机安装使用教程【视频】

vmware虚拟机安装使用教程【视频】 VMware是一款强大的桌面级虚拟化软件&#xff0c;它允许用户在单个计算机上同时运行多个操作系统&#xff0c;每个操作系统都被称为一个虚拟机&#xff08;VM&#xff09;。这种技术不仅方便了软件测试、系统开发&#xff0c;还便于资源管理&…

【Linux Oracle】time命令+oracle exp压缩

Linux && Oracle相关文档&#xff0c;希望互相学习&#xff0c;共同进步 风123456789&#xff5e;-CSDN博客 1.说明 Linux中的time命令&#xff1a;主要用于测量命令的执行时间&#xff0c;并显示该命令在执行过程中所使用的系统资源情况&#xff0c;如CPU时间、内存和…