STL—stack与queue

news2025/1/21 4:06:12

目录

Stack

        stack的使用

        stack的模拟实现

queue

queue的使用

queue的模拟实现

priority_queue 

        priority_queue的用法

         priority_queue的模拟实现

 容器适配器

        种类 


Stack

        http://www.cplusplus.com/reference/stack/stack/?kw=stack

         stack是栈,后入先出

        stack的使用

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

        stack的模拟实现

template<class T>
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:
std::vector<T> _c;
};

queue

        cplusplus.com/reference/queue/queue/ 

        queue 队列 后入先出

queue的使用

queue构造队列
empty是否为空
size元素个数
front返回队列头元素的引用
back返回队列尾元素的引用
push将元素val压入队尾
pop将stack中头部的元素弹出

queue的模拟实现

template<class 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:
std::list<T> _c;
};

priority_queue 

cplusplus.com/reference/queue/priority_queue/

         这个是优先队列,会自排序,内部是按照堆排序来的,可以设定是正排序或者逆排序

        priority_queue的用法

priority_queue()构造空的优先级队列
empty判空
top返回堆顶元素
push插入元素x
pop删除堆顶元素
 greater<T> 排列反序的重载

         priority_queue的模拟实现

#pragma once
#include<iostream>
#include<vector>
using namespace std;
namespace m
{
    template<class T>
    struct less
    {
        bool operator()(const T& A,const T& B)
        {
            return A < B;
        }
    };
 
    template<class T>
    struct greater
    {
        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:
        priority_queue() = default;
 
        template <class InputIterator>
        priority_queue(InputIterator first, InputIterator last)
        {
            while (first != last)
            {
                this->push(*first);
                first++;
            }
        }
 
        bool empty() const
        {
            return c.empty();
        }
        size_t size() const
        {
            return c.size();
        }
        T top() const
        {
            return c.front();
        }
 
        void push(const T& x)
        {
            c.push_back(x);
            this->AdjustUP(c.size() - 1);
        }
        void pop()
        {
            if (empty())
                return;
 
            swap(c.front(),c.back());
            c.pop_back();
            AdjustDown(0);
 
        }
 
    private:
        void AdjustUP(int child)
        {
            int parent = (child - 1) / 2;
            while (child)
            {
                if (comp(c[parent], c[child]))
                {
                  swap(c[parent], c[child]);
                  child = parent;
                  parent = (child - 1) / 2;
                }
                else
                {
                    return;
                }
            }
        }
        void AdjustDown(int parent)
        {
            int child = 2 * parent;
            while (child < size())
            {
                if (child < size() - 1 && comp(c[child], c[child + 1]))
                {
                    child++;
                }
 
                if (comp(c[parent], c[child]))
                {
                    swap(c[parent], c[child]);
                    parent = child;
                    child = 2 * parent;
                }
                else
                    return;
 
            }
        }
        void swap(T& left, T& right)
        {
            T c = left;
            left = right;
            right = c;
        }
        Container c;
        Compare comp;
    };
 
};

 容器适配器

        容器适配器是一种机制,能使某种容器的行为看起来像另一种容器。它接受一种已有的容器类型,并使其操作起来像另一种类型的容器。

        在C++标准库中,容器适配器是一种特殊的数据结构,它并不直接存储数据,而是通过对底层容器的接口进行包装和转换,来实现特定的数据访问和操作方式。

        种类 

        C++标准库定义了三个主要的容器适配器,分别是stack(栈)、queue(队列)和priority_queue(优先队列)

        一般情况下 stack是基于deque实现的

                           queue是基于deque实现的

                           priority_queue是基于vector实现的 

        deque 

        deque是一种双开口的“连续”的空间数据结构,可以在头尾插入和删除,时间复杂度为O(1),对比vector头插效率高,对比list空间利用率高

        deque是一种复杂的数据结构

        缺点是

        与vector比较,deque的优势是:头部插入和删除时,不需要搬移元素,效率特别高,而且在扩容时,也不需要搬移大量的元素,因此其效率是必vector高的。
        与list比较,其底层是连续空间,空间利用率比较高,不需要存储额外字段。
        但是,deque有一个致命缺陷:不适合遍历,因为在遍历时,deque的迭代器要频繁的去检测其是否移动到某段小空间的边界,导致效率低下,而序列式场景中,可能需要经常遍历,因此在实际中,需要线性结构时,大多数情况下优先考虑vector和list,deque的应用并不多,而目前能看到的一个应用就是,STL用其作为stack和queue的底层数据结构。

        但是

因为stack queue不需要遍历,使用deque几乎是结合了它的优点 

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

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

相关文章

AI可信论坛亮点:合合信息分享视觉内容安全技术前沿

前言 在当今科技迅猛发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;技术正以前所未有的速度改变着我们的生活与工作方式。作为AI领域的重要盛会&#xff0c;CSIG青年科学家会议AI可信论坛汇聚了众多青年科学家与业界精英&#xff0c;共同探讨AI技术的最新进展、挑…

调试Hadoop源代码

个人博客地址&#xff1a;调试Hadoop源代码 | 一张假钞的真实世界 Hadoop版本 Hadoop 2.7.3 调试模式下启动Hadoop NameNode 在${HADOOP_HOME}/etc/hadoop/hadoop-env.sh中设置NameNode启动的JVM参数&#xff0c;如下&#xff1a; export HADOOP_NAMENODE_OPTS"-Xdeb…

Ability Kit-程序框架服务(类似Android Activity)

文章目录 Ability Kit&#xff08;程序框架服务&#xff09;简介Stage模型开发概述Stage模型应用组件应用/组件级配置UIAbility组件概述概述声明配置 生命周期概述生命周期状态说明Create状态WindowStageCreate**和**WindowStageDestroy状态WindowStageWillDestroy状态Foregrou…

鸿蒙安装HAP时提示“code:9568344 error: install parse profile prop check error” 问题现象

在启动调试或运行应用/服务时&#xff0c;安装HAP出现错误&#xff0c;提示“error: install parse profile prop check error”错误信息。 解决措施 该问题可能是由于应用使用了应用特权&#xff0c;但应用的签名文件发生变化后未将新的签名指纹重新配置到设备的特权管控白名…

哈尔滨有双线服务器租用吗?

哈尔滨有双线服务器租用吗&#xff1f;双线服务器是一种针对哈尔滨特有的网络环境优化的服务器解决方案&#xff0c;它能够同时支持中国电信和中国联通或移动其中两家主要ISP&#xff08;互联网服务提供商&#xff09;的连接。 由于中国南方地区多采用电信网络&#xff0c;而北…

三天急速通关Java基础知识:Day1 基本语法

三天急速通关JAVA基础知识&#xff1a;Day1 基本语法 0 文章说明1 关键字 Keywords2 注释 Comments2.1 单行注释2.2 多行注释2.3 文档注释 3 数据类型 Data Types3.1 基本数据类型3.2 引用数据类型 4 变量与常量 Variables and Constant5 运算符 Operators6 字符串 String7 输入…

JVM 面试八股文

目录 1. 前言 2. JVM 简介 3. JVM 内存划分 3.1 为什么要进行内存划分 3.2 内存划分的核心区域 3.2.1 核心区域一: 程序计数器 3.2.2 核心区域二: 元数据区 3.2.3 核心区域三: 栈 3.2.4 核心区域四: 堆 4. JVM 类加载机制 4.1 类加载的步骤 4.1.1 步骤一: 加载 4…

《AI赋能中国制造2025:智能变革,制造未来》

引言&#xff1a;开启智能制造新时代 在全球制造业格局深度调整的当下&#xff0c;科技变革与产业转型的浪潮汹涌澎湃。2015 年&#xff0c;我国重磅推出《中国制造 2025》这一宏伟战略&#xff0c;它如同一座灯塔&#xff0c;为中国制造业驶向高端化、智能化、绿色化的彼岸指明…

Observability:最大化可观察性 AI 助手体验的 5 大提示(prompts)

作者&#xff1a;来自 Elastic Zoia_AUBRY 在过去三年担任客户工程师期间&#xff0c;我遇到了数百名客户&#xff0c;他们最常问的问题之一是&#xff1a;“我的数据在 Elastic 中&#xff1b;我该如何利用它获得最大优势&#xff1f;”。 如果这适用于你&#xff0c;那么本…

Mysql常见问题处理集锦

Mysql常见问题处理集锦 root用户密码忘记&#xff0c;重置的操作(windows上的操作)MySQL报错&#xff1a;ERROR 1118 (42000): Row size too large. 或者 Row size too large (&#xff1e; 8126).场景&#xff1a;报错原因解决办法 详解行大小限制示例&#xff1a;内容来源于网…

【前端】用OSS增强Hexo的搜索功能

文章目录 前言配置 _config.fluid.yml云端实时更新 local-search.xml解决 OSS.Bucket 的跨域问题 前言 原文地址&#xff1a;https://blog.dwj601.cn/FrontEnd/Hexo/hexo-enhance-local-search-with-oss/ 考虑到某著名云服务商提供的云服务器在两年的 99 计划后续费价格高达四…

ROS2 与机器人视觉入门教程(ROS2 OpenCV)

系列文章目录 前言 由于现有的ROS2与计算机视觉&#xff08;特别是机器人视觉&#xff09;教程较少&#xff0c;因此根据以往所学与积累的经验&#xff0c;对ROS2与机器人视觉相关理论与代码进行分析说明。 本文简要介绍了机器人视觉。首先介绍 ROS2 中图像发布者和订阅者的基…

02内存结构篇(D1_自动内存管理)

目录 一、内存管理 1. C/C程序员 2. Java程序员 二、运行时数据区 1. 程序计数器 2. Java虚拟机栈 3. 本地方法栈 4. Java堆 5. 方法区 运行时常量池 三、Hotspot运行时数据区 四、分配JVM内存空间 分配堆的大小 分配方法区的大小 分配线程空间的大小 一、内存管…

C#,入门教程(01)—— Visual Studio 2022 免费安装的详细图文与动画教程

通过本课程的学习&#xff0c;你可以掌握C#编程的重点&#xff0c;享受编程的乐趣。 在本课程之前&#xff0c;你无需具备任何C#的基础知识&#xff0c;只要能操作电脑即可。 不过&#xff0c;希望你的数学不是体育老师教的。好的程序是数理化的实现与模拟。没有较好的数学基础…

BGP边界网关协议(Border Gateway Protocol)路由引入、路由反射器

一、路由引入背景 BGP协议本身不发现路由&#xff0c;因此需要将其他协议路由&#xff08;如IGP路由等&#xff09;引入到BGP路由表中&#xff0c;从而将这些路由在AS之内和AS之间传播。 BGP协议支持通过以下两种方式引入路由&#xff1a; Import方式&#xff1a;按协议类型将…

【Vim Masterclass 笔记21】S09L39:Vim 设置与 vimrc 文件的用法示例(二)

文章目录 S09L39 Vim Settings and the Vimrc File - Part 21 Vim 的配色方案与 color 命令2 map 命令3 示例&#xff1a;用 map 命令快速生成 HTML 代码片段4 Vim 中的 Leader 键5 用 mkvimrc 命令自动生成配置文件 写在前面 本篇为 Vim 自定义配置的第二部分。当中的每个知识…

owasp SQL 注入-03 (原理)

1: 先看一下注入界面: 点submit 后&#xff0c;可以看到有语法报错&#xff0c;说明已经起作用了: 报如下的错误: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near at line 1 2:…

SpringMVC (1)

目录 1. 什么是Spring Web MVC 1.1 MVC的定义 1.2 什么是Spring MVC 1.3 Spring Boot 1.3.1 创建一个Spring Boot项目 1.3.2 Spring Boot和Spring MVC之间的关系 2. 学习Spring MVC 2.1 SpringBoot 启动类 2.2 建立连接 1. 什么是Spring Web MVC 1.1 MVC的定义 MVC 是…

LabVIEW 实现线路板 PCB 可靠性测试

在电子设备制造领域&#xff0c;线路板 PCB&#xff08;Printed Circuit Board&#xff09;的可靠性直接影响产品的整体性能和使用寿命。企业在生产新型智能手机主板时&#xff0c;需要对 PCB 进行严格的可靠性测试&#xff0c;以确保产品在复杂环境下能稳定运行。传统的测试方…

【大数据2025】Hadoop 万字讲解

文章目录 一、大数据通识大数据诞生背景与基本概念大数据技术定义与特征大数据生态架构概述数据存储数据计算与易用性框架分布式协调服务和任务调度组件数仓架构流处理架构 二、HDFSHDFS 原理总结一、系统架构二、存储机制三、数据写入流程四、心跳机制与集群管理 安全模式&…