C++STL——stack与queue

news2025/1/16 18:51:49

stack与queue

  • stack与queue
  • priority_queue
  • 容器适配器
    • vector与list的反向迭代器模拟实现
    • 仿函数
    • deque(了解)
  • stack与queue模拟实现
  • priority_queue模拟实现

stack与queue

这两个就是之前数据结构学过的栈和队列,只不过多了几个接口。
stack:
在这里插入图片描述
在这里插入图片描述
queue:
在这里插入图片描述
在这里插入图片描述
这两个容器没有迭代器,这是因为怕我们更改导致顺序错误。

#include<iostream>
#include<stack>
#include<queue>
int main()
{
	stack<int> a;
	a.push(1);
	a.push(2);
	a.push(3);
	a.push(4);
	a.push(5);

	queue<int> b;
	b.push(6);
	b.push(7);
	b.push(8);
	b.push(9);
	b.push(0);

	while (!a.empty())
	{
		cout << a.top() << ' ';
		a.pop();
	}
	cout << endl;
	while (!b.empty())
	{
		cout << b.front() << ' ';
		b.pop();
	}
	return 0;
}

在这里插入图片描述

priority_queue

这个容器是优先级队列,看起来是队列,其实内部结构并不是队列,而是一个堆。
在这里插入图片描述
在这里插入图片描述

#include<iostream>
#include<queue>
int main()
{
	priority_queue<int> a;//大堆
	priority_queue<int, vector<int>, greater<int>> b;//小堆
	a.push(3);
	a.push(0);
	a.push(9);
	a.push(5);
	a.push(6);
	while (!a.empty())
	{
		cout << a.top() << ' ';
		a.pop();
	}
	cout << endl;
	b.push(3);
	b.push(0);
	b.push(9);
	b.push(5);
	b.push(6);
	while (!b.empty())
	{
		cout << b.top() << ' ';
		b.pop();
	}
	return 0;
}

在这里插入图片描述

容器适配器

什么是适配器呢?生活中我们用的充电器就是,一个充电器可以给好几种手机使用。
适配器是一种设计模式:该种模式是将一个类的接口转换成客户希望的另外一个接口。

vector与list的反向迭代器模拟实现

实现的目的主要是要求无论是list还是vector都可以用这个反向迭代器。
反向迭代器其实是迭代器位置变了而已,反向迭代器的begin与正向的end,反向迭代器的end与正向的begin指向同一个位置。

namespace baiye
{
	template<class Iterator, class Ref, class Ptr>
	struct Reverse_iterator
	{
		typedef Reverse_iterator<class Iterator, class Ref, class Ptr> self;
		Reverse_iterator(Iterator it)
			:_it(it)
		{}
		Ref operator*()//区别是否有const
		{
			Iterator tmp = _it;
			return *(--tmp);//因为begin是指向正向迭代器end的原因,所以需要--
		}
		self operator++()
		{
			_it--;
			return *this;
		}
		self operator--()
		{
			_it++;
			return *this;
		}
		bool operator!=(const Iterator it)const
		{
			return it != _it;
		}
		Ref operator->()
		{
			return &(operator*());
		}
		Iterator _it;//反向迭代器的本质
	};
}

仿函数

#include<iostream>
using namespace std;
namespace baiye
{
	template<class T>
	struct greater_than
	{
		bool operator()(const T& a, const T& b)
		{
			return a > b;
		}
	};
	template<class T>
	struct less_than
	{
		bool operator()(const T& a, const T& b)
		{
			return a < b;
		}
	};
}
int main()
{
	int a = 4;
	int b = 0;
	int c = 5;
	baiye::greater_than<int> compare;
	baiye::less_than<int> contrast;
	int sum = compare(a, b);
	cout << sum << endl;
	sum = compare(a, c);
	cout << sum << endl;
	sum = contrast(a, b);
	cout << sum << endl;
	sum = contrast(a, c);
	cout << sum << endl;

	return 0;
}

在这里插入图片描述
仿函数其实是一个类,在函数回调他用起来比函数地址好用,如果在某一段代码需要用到函数回调,这个函数的参数特别多,写出来之后会破坏代码看起来的美感。
在这里插入图片描述

deque(了解)

这是一个双端队列。他是vector与list的结合体,但是又没有vector与list在某一方面好用。
在这里插入图片描述
链接:https://legacy.cplusplus.com/reference/deque/deque/?kw=deque
大概的结构是这样的:
在这里插入图片描述
图片出自侯捷老师的《STL源码剖析》。
在开辟一个deque类的时候会有一个指针数组,里面的指针指向了模板的类型,
cur是指向数组当前访问的位置,first是指向第一个位置,last指向末尾,node不是和他们三个一个层次的,而是指向指针数组的指针。
在如果一个fairse指向的空间满了,头插就会在node指向元素的下一个位置开辟空间,在第一个位置进行插入,如果想头插就会在node指向的前一个元素进行空间开辟,然后再末尾的位置进行数据写入。
在这里插入图片描述
cur是用来遍历node指向的内容的,他是用来实现++,- -的。

stack与queue模拟实现

stack

namespace baiye
{
    template<class T, class Con = deque<T>>//这里也可以用list或者vector
    class stack
    {
    public:
        stack()
        {}
        void push(const T& x)
        {
            _c.push_back(x);
        }
        void pop()
        {
            _c.pop_back();
        }

        T& top()
        {
            return _c.back();
        }

        const T& top()const
        {
            return _c.back();
        }

        size_t size()const
        {
            return _c.size();
        }

        bool empty()const
        {
            return _c.empty();
        }

    private:
        Con _c;
    };
}

queue

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

priority_queue模拟实现

priority_queue

#include<iostream>
#include<stack>
#include<queue>
#include<deque>
#include<list>
#include<vector>
#include<algorithm>
using namespace std;
namespace baiye
{
    template<class T>
    struct less
    {
        bool operator()(const T& a, const T& b)
        {
            return a < b;
        }
    };
    template <class T, class Container = vector<T>, class Compare = less<T> >
    class priority_queue
    {
    public:
        
        void adjust_up(size_t child)//向上调整
        {
            Compare com;//仿函数
            while (child > 0)
            {
                if(com(c[(child - 1) / 2], c[child]))
                {
                    swap(c[child], c[(child - 1) / 2]);
                    child = (child - 1) / 2;
                }
                else
                {
                    break;
                }
            }
        }
        void adjust_down(size_t parent)//向下调整
        {
            size_t left = parent * 2 + 1;//左孩子
            Compare com;//仿函数
            while (left < c.size())
            {
                if (left + 1 < c.size() && com(c[left], c[left + 1]))
                {
                    left++;
                }
                if (com(c[parent], c[left]))
                {
                    swap(c[left], c[parent]);
                    parent = left;
                    left = parent * 2 + 1;
                }
                else
                {
                    break;
                }
            }
        }
        priority_queue()
        {}
        template <class InputIterator>
        priority_queue(InputIterator first, InputIterator last)
            :c(first,last)
        {
            for (int i = (c.size() - 2) / 2; i >= 0; i--)//建堆
            {
                adjust_down(i);
            }
        }
        bool empty() const
        {
            return c.empty();
        }
        size_t size() const
        {
            return c.size();
        }
        const T& top() const
        {          
            return c[0];
        }
        void push(const T& x)
        {
            c.push_back(x);
            adjust_up(c.size()-1);
        }
        void pop()
        {
            swap(c[0], c[c.size() - 1]);
            c.pop_back();
            adjust_down(0);
        }

    private:
        Container c;
    };
}

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

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

相关文章

【MySQL】MySQL 8 的 JSON 新特性详解(1)JSON 数据类型

目录一、概述二、MySQL 8 的环境搭建三、创建数据库、数据表并插入默认数据四、JSON格式数据的增加和查询1. 增加一条带JOSN格式的数据2.查询JSON内数据3.带筛选条件的查询五、总结一、概述 你好&#xff0c;我是小雨青年&#xff0c;一名使用MySQL 8 的程序员。 MySQL 8 引入…

Hadoop安装(二) --- Hadoop安装

目录 Hadoop安装&#xff08;一&#xff09;---JDK安装 修改hadoop313的权限 更改配置文件 配置core-site.xml 配置hadoop-env.sh 配置hdfs-site.xml 配置mapred-site.xml 配置yarn-site.xml 配置环境 刷新当前的shell环境 初始化 启动所有 SH 修改hadoop31…

Android Studio 从安装到第一个Android 应用Demo

安装Android Studio 安装需要 上网 &#xff0c;我这挺顺利的&#xff0c;就是在官网下载安装包&#xff0c;一路 Next&#xff0c;大概连下载总共半个小时。 第一个应用 参考官方教程&#xff1a;https://developer.android.com/codelabs/basic-android-kotlin-compose-firs…

Redis最佳实践

一、Redis键值设计 1.1、优雅的key结构 Redis的key&#xff0c;最佳实践约定&#xff1a; 遵循基本格式&#xff1a;【业务名称】:【数据名】:【id】长度不超过44字节不包含特殊字符 好处 可读性强避免key冲突方便管理更节省内存 1.2、拒绝BigKey BigKey通常以Key的大小和…

SOLIDWORKS PDM的智能报表自动生成工具

一、SOLIDWORKS企业高级报表软件介绍&#xff1a; SolidKits.Reports&#xff08;企业高级报表&#xff09;是一款无缝集成于SOLIDWORKS PDM的智能报表自动生成工具&#xff0c;可以自动生成企业所需的各类报表数据&#xff0c;涵盖结构数据报表、离散数据报表、变更数据报表、…

rocketmq源码-consumer负载均衡逻辑

前言 这篇笔记主要记录consumer在启动过程中&#xff0c;负载均衡的逻辑&#xff0c;多个消费者组成一个消费者组&#xff0c;对于集群模式&#xff0c;同一个消费者组中的多个消费者共同消费一个topic下的所有消息&#xff0c;所以每个consumer可能会处理N个messageQueue&…

【4】KVM管理 | 虚拟机的管理 | 克隆 | 快照

目录 1、虚机基本管理 2、虚机的克隆 3、增量镜像 4、虚机快照 1、虚机基本管理 查看正在运行的虚机 [rootlocalhost ~]# virsh list Id Name State ----------------------------------------------------查看所有的虚机 [rootlocalhost ~…

Apache Oozie(1):Apache Oozie简介

1 Oozie 概述 Oozie 是一个用来管理 Hadoop 生态圈 job 的工作流调度系统。由Cloudera 公司贡献给 Apache。Oozie 是运行于 Java servlet 容器上的一个 java web 应用。Oozie 的目的是按照 DAG&#xff08;有向无环图&#xff09;调度一系列的 Map/Reduce或者Hive 等任务。Ooz…

Java SE 进阶(二)之 HashSet底层原理

文章目录前言HashSet底层原理1.哈希表2.哈希值3.底层原理4.回答三个问题前言 关于Set和HashSet的API使用可参见 集合基础入门&#xff08;Collection&#xff0c;ArrayList&#xff0c;HashSet&#xff0c;HashMap&#xff09; HashSet底层原理 1.哈希表 HashSet集合底层采…

Vue组件 —— 单文件组件

追溯vue组件问题 在未讲项目之前&#xff0c;在 这一篇内容当中就讲到了组件引入使用&#xff0c;有内置的组件和动态组件以及封装一个swiper组件&#xff0c;组件也分为全局组件和局部组件&#xff0c;在讲在项目当中去使用组件之前先简单的回顾一下组件的编写&#xff1a; &…

89.【SpringBoot-02】

SpringBoot聊一聊如何构建一个网站(十四)、.SpringBoot整合数据库操作1.整合JDBC(1).SpringData简介(2).整合JDBC(3).JdbcTemplate ⭐2. 整合Druid数据源 &#xff08;德鲁伊&#xff09;(1).Druid简介(2).配置数据源(3).配置Druid数据源监控(4).配置Druid数据源过滤器(5).注解…

Echarts的Y轴添加定值横线的示例

第010个点击查看专栏目录Echarts折线图的y轴要画一条横线&#xff0c;主要是在series中设置markLine的图表标线参数&#xff0c;具体的参考源代码。文章目录示例效果示例源代码&#xff08;共142行&#xff09;相关资料参考专栏介绍示例效果 示例源代码&#xff08;共142行&…

怎么在Windows电脑更新 DirectX ?

玩游戏的人应该都对DirectX不陌生&#xff0c;它可以提高游戏或多媒体程序的运行效率&#xff0c;增强3d图形和声音效果。但很多人都不知道DirectX该如何更新&#xff0c;这篇文章将以Win10为例&#xff0c;教大家怎么在电脑上更新DirectX。 一、检查当前DirectX版本 如果你不…

简单聊一聊组件封装

封装一个思维导图组件 最近封装了一个简单的思维导图组件&#xff0c;在此简单记录一下心里历程 组件样式 组件结构设计 节点之间的线分成三部分&#xff0c;分别是竖线左边的横线A、竖线B、竖线右边的横线C&#xff0c;所以一个节点可以包含以下几个元素&#xff1a; 横线…

VBA提高篇_18 VBA代码录制优化Select(tion)及表格合并Merge(cells()/Rows()/Columns()

文章目录1. Cells(1,1)2. Rows(Str)和Columns(Str)3. VBA合并单元格3.1 Range.MergeCells属性:3.2 Range.Merge/UnMerage属性:3.3 Range.Merge(参数True/False)3.4 操作合并/取消合并单元格的两种方法4. Select / Selection 和 录制宏的代码优化4.1 Select / Selection4.2 录制…

anconda的pip下载包出现的问题

问题一: 在anconda里面如何创建新的python环境(也就是更换新的python版本) 1.先打开anconda软件,创建需要的环境 2. 环境创建好之后,去pycharm里面进行配置解释器 3. 这样就可以用了 问题二:pip的安装软件时出现包找不到的问题? 注意:因为我们刚刚创建了一个python环境,等…

Python基于已知的分幅条带号筛选出对应遥感影像文件的方法

本文介绍基于Python语言&#xff0c;结合已知研究区域中所覆盖的全部遥感影像的分幅条带号&#xff0c;从大量的遥感影像文件中筛选落在这一研究区域中的遥感影像文件的方法。 首先&#xff0c;先来明确一下本文所需实现的需求。现已知一个研究区域&#xff08;四川省&#xff…

【C++】C++入门 函数重载

前言 自然语言中&#xff0c;一个词可以有多重含义&#xff0c;人们可以通过上下文来判断该词真实的含义&#xff0c;即该词被重载了。 函数重载一、函数重载定义二、函数重载的条件1. 参数类型不同2. 参数个数不同3. 参数类型顺序不同三、函数重载的原理--名字修饰(name Mangl…

怎么把网页变成灰色?怎么让头像或某一部分不变灰色?filter/backdrop-filter/mix-blend-mode/svg/grayscale(1)

在国家公祭日&#xff0c;我们哀悼沉思&#xff0c;势要勿忘国耻振兴中华&#xff1b;在国家重要人物逝世后&#xff0c;举国哀悼&#xff1b;这些时段很多网站都会积极呼应&#xff0c;给与自己的网页设置成灰色&#xff1b;那给网页设置成灰色是经过怎样的设置来实现的呢&…

利用pandas_udf加速机器学习任务

note pandas udf和python udf区别&#xff1a;前者向量化是在不同partition上处理pandas_udf使用panda API来处理分布式数据集&#xff0c;而toPandas()将分布式数据集转换为本地数据&#xff0c;然后使用pandas进行处理&#xff0c;如果Pyspark的dataframe非常大&#xff0c;…