当前位置: 首页 > news >正文

标准模板库STL——容器适配器-stack/queue/priority_queue

目录

容器适配器的理解

容器适配器的实现与使用

三类容器适配器

基本概述

示例代码


容器适配器的理解

容器适配器对底层容器进行封装,不具备自己的数据结构

容器适配器的方法全都由底层容器实现,不支持迭代器

容器适配器的实现与使用

// 容器适配器的实现与使用#include<iostream>
#include<vector>
#include<deque>
#include<list>
using namespace std;template<typename T, typename Container=deque<T>>
// typename Container=deque<T>表示默认底层容器为deque,也可由用户指定底层容器
class Stack
{
public:// 借助底层容器的方法void push(const T & val)  { con.push_back(val); } // push代理push_backvoid pop()                { con.pop_back(); }     // pop代理pop_backT top() const             { return con.back(); }  // top代理backsize_t size()             { return con.size(); }  // size代理sizebool empty() const        { return con.empty(); } // empty代理empty
private:Container con; // 底层容器
};int main()
{Stack<int> sta1;for(int i = 0; i < 20; i ++)sta1.push(rand()%100 + 1);cout << "使用默认底层容器deque实现栈Stack" << endl;cout << sta1.size() << "个随机整数如下:" << endl;while(! sta1.empty()){cout << sta1.top() << " ";sta1.pop();}cout << endl;cout << "--------------------------------------------" << endl;Stack<int, vector<int>> sta2;for(int i = 0; i < 20; i ++)sta2.push(rand()%100 + 1);cout << "指定底层容器为vector实现栈Stack" << endl;cout << sta2.size() << "个随机整数如下:" << endl;while(! sta2.empty()){cout << sta2.top() << " ";sta2.pop();}cout << endl;cout << "--------------------------------------------" << endl;Stack<int, list<int>> sta3;for(int i = 0; i < 20; i ++)sta3.push(rand()%100 + 1);cout << "指定底层容器为list实现栈Stack" << endl;cout << sta3.size() << "个随机整数如下:" << endl;while(! sta3.empty()){cout << sta3.top() << " ";sta3.pop();}cout << endl;return 0;
}/*
使用默认底层容器deque实现栈Stack
20个随机整数如下:
37 28 43 96 92 62 28 82 46 6 65 63 59 79 25 70 1 35 68 42  
--------------------------------------------
指定底层容器为vector实现栈Stack
20个随机整数如下:
95 36 100 68 13 70 39 72 27 48 96 19 17 22 83 93 54 3 5 92 
--------------------------------------------
指定底层容器为list实现栈Stack
20个随机整数如下:
79 30 42 24 60 38 58 63 45 48 69 54 12 42 65 74 34 23 12 4 
*/

三类容器适配器

// 1、栈stack

stack默认依赖deque

// 2、队列queue

queue默认依赖deque

// 3、优先队列priority_queue

priority_queue默认依赖vector

基本概述

// stack和queue都默认依赖deque的理由

1、初始时,vector内存使用效率低,deque内存使用效率高

2、对于queue来说,需要支持尾部入队和头部出队

依赖deque可将入队和出队的时间复杂度控制在O(1)

依赖vector入队O(1),但是出队O(n),会导致出队效率很低

3、当存储大量数据时,vector需要连续内存,内存利用率低

deque只需分段内存,内存利用率高

// priority_queue默认依赖vector的理由

priority_queue底层数据结构为大根堆(堆顶元素值最大)

vector内存连续可以更好地适应大根堆,理由如下:

如果堆节点的下标从0开始编号(堆顶节点的下标为0),

那么对于堆中某个下标为i的节点,其左子节点的下标为2i+1,其右子节点的下标为2i+2

这些规律建立在内存连续的基础之上

示例代码

/*
stack:push入栈 pop出栈 top栈顶元素 empty判断栈空 size元素数量
queue:push入队 pop出队 front队头元素 back队尾元素 empty判断队空 size元素数量
priority_queue:push入队 pop出队 top队顶元素 empty判断队空 size元素数量
*/#include<iostream>
#include<vector> // 向量容器
#include<deque>  // 双端队列
#include<list>   // 链表容器
#include<stack>  // 栈
#include<queue>  // 队列、优先队列
using namespace std;int main()
{stack<int> sta;for(int i = 0; i < 20; i ++)sta.push(rand()%100 + 1);cout << "栈stack" << endl;cout << sta.size() << "个随机整数如下:" << endl;while(! sta.empty()){cout << sta.top() << " ";sta.pop();}cout << endl;cout << "--------------------------------------------" << endl;queue<int> que;for(int i = 0; i < 20; i ++)que.push(rand()%100 + 1);cout << "队列queue" << endl;cout << que.size() << "个随机整数如下:" << endl;while(! que.empty()){cout << que.front() << " ";que.pop();}cout << endl;cout << "--------------------------------------------" << endl;priority_queue<int> pque;for(int i = 0; i < 20; i ++)pque.push(rand()%100 + 1);cout << "优先队列priority_queue" << endl;cout << pque.size() << "个随机整数如下:" << endl;while(! pque.empty()){cout << pque.top() << " ";pque.pop();}cout << endl;return 0;
}/*
栈stack
20个随机整数如下:
37 28 43 96 92 62 28 82 46 6 65 63 59 79 25 70 1 35 68 42  
--------------------------------------------
队列queue
20个随机整数如下:
92 5 3 54 93 83 22 17 19 96 48 27 72 39 70 13 68 100 36 95 
--------------------------------------------
优先队列priority_queue
20个随机整数如下:
79 74 69 65 63 60 58 54 48 45 42 42 38 34 30 24 23 12 12 4 
*/

相关文章:

标准模板库STL——容器适配器-stack/queue/priority_queue

目录 容器适配器的理解 容器适配器的实现与使用 三类容器适配器 基本概述 示例代码 容器适配器的理解 容器适配器对底层容器进行封装&#xff0c;不具备自己的数据结构 容器适配器的方法全都由底层容器实现&#xff0c;不支持迭代器 容器适配器的实现与使用 // 容器适配器…...

Golang实现完整聊天室(内附源码)

项目github地址&#xff1a; 由于我们项目的需要&#xff0c;我就研究了一下关于websocket的相关内容&#xff0c;去实现一个聊天室的功能。 经过几天的探索&#xff0c;现在使用Gin框架实现了一个完整的聊天室消息实时通知系统。有什么不完善的地方还请大佬指正。 用到的技术…...

WSL2 ubuntu子系统OpenCV调用本机摄像头的RTSP视频流做开发测试

文章目录 前言一、Ubuntu安装opencv库二、启动 Windows 本机的 RTSP 视频流下载解压 EasyDarwin查看本机摄像头设备开始推流 三、在ubuntu 终端编写代码创建目录及文件创建CMakeLists.txt文件启动 cmake 配置并构建 四、结果展示启动图形界面在图形界面打开终端找到 rtsp_demo运…...

20230814让惠普(HP)锐14 新AMD锐龙电脑不联网进WIN11进系统

20230814让惠普(HP)锐14 新AMD锐龙电脑不联网进WIN11进系统 2023/8/14 17:19 win11系统无法跳过联网 https://www.xpwin7.com/jiaocheng/28499.html Win11开机联网跳过不了怎么办&#xff1f;Win11开机联网跳过不了解决方法 Win11开机联网跳过不了怎么办&#xff1f;Win11开机…...

基于ScrollView的下拉刷新

基于ScrollView的下拉刷新 组件使用 组件 import React, {useState} from react; import {ScrollView, RefreshControl, Platform} from react-native;const RefreshComponent ({children, onRefresh, onScroll}) > {const [refreshing, setRefreshing] useState(false);…...

强训第31天

选择 传输层叫段 网络层叫包 链路层叫帧 A 2^16-2 C D C 70都没收到&#xff0c;确认号代表你该从这个号开始发给我了&#xff0c;所以发70而不是71 B D C 248&123120 OSI 物理层 数据链路层 网络层 传输层 会话层 表示层 应用层 C 记一下304读取浏览器缓存 502错误网关 编…...

什么是Java中的策略模式?

Java中的策略模式是一种行为设计模式&#xff0c;它允许您在不改变客户端代码的情况下&#xff0c;在运行时动态地切换行为。这是一种非常有用的模式&#xff0c;因为它允许您在运行时根据需要更改算法或行为。 策略模式通常涉及到一个或多个策略类&#xff0c;每个策略类都实…...

【Visual Studio Code】--- Win11 安装 VS Code 超详细

Win11 安装 VS Code 超详细 概述一、下载 Vscode二、安装 Vscode 概述 一个好的文章能够帮助开发者完成更便捷、更快速的开发。书山有路勤为径&#xff0c;学海无涯苦作舟。我是秋知叶i、期望每一个阅读了我的文章的开发者都能够有所成长。 一、下载 Vscode Vscode官网 二、…...

每天一道leetcode:797. 所有可能的路径(图论中等深度优先遍历)

今日份题目&#xff1a; 给你一个有 n 个节点的 有向无环图&#xff08;DAG&#xff09;&#xff0c;请你找出所有从节点 0 到节点 n-1 的路径并输出&#xff08;不要求按特定顺序&#xff09; graph[i] 是一个从节点 i 可以访问的所有节点的列表&#xff08;即从节点 i 到节…...

创建预留成本中心与指定工厂不一致

创建预留成本中心与指定工厂不一致 这种情况SAP会警告提示&#xff0c;可以强制通过。 如果公司不允许跨公司领料&#xff0c;可以将消息号 M7517的类型从W改为为E tcode&#xff1a;OMCQ SPRO->物料管理->库存管理和实际库存->定义系统消息的属性->系统信息设置...

SCF金融公链新加坡启动会 创新驱动未来

新加坡迎来一场引人瞩目的金融科技盛会&#xff0c;SCF金融公链启动会于2023年8月13日盛大举行。这一受瞩目的活动将为金融科技领域注入新的活力&#xff0c;并为广大投资者、合作伙伴以及关注区块链发展的人士提供一个难得的交流平台。 在SCF金融公链启动会上&#xff0c; Wil…...

希尔排序【Java算法】

文章目录 1. 概念2. 思路3. 代码实现 1. 概念 希尔排序也是一种插入排序&#xff0c;它是简单插入排序经过改进之后的一个更高效的版本&#xff0c;也称为缩小增量排序。希尔排序在数组中采用跳跃式分组的策略&#xff0c;通过某个增量将数组元素划分为若干组&#xff0c;然后分…...

互联网发展历程:从布线到无线,AC/AP的崭新时代

互联网的发展&#xff0c;一直在追求更便捷、更灵活的连接方式。在网络的早期&#xff0c;布线问题常常让人头疼。一项革命性的技术应运而生&#xff0c;那就是“无线AC/AP”。 布线问题的烦恼&#xff1a;繁琐的布线 早期网络的布线工作常常耗费时间和精力&#xff0c;尤其在大…...

Vue3 Axios网络请求简单应用

cd 到项目 安装Axios&#xff1a;cnpm install --save axios post传递参数 需要安装querystring 用于转换参数格式&#xff1a;cnpm install --save querystring 运行示例&#xff1a; 后台接口&#xff1a; GetTestData.java package com.csdnts.api;import java.io.IOExce…...

day-18 代码随想录算法训练营(19)二叉树 part05

513.找树左下角的值 思路一&#xff1a;层序遍历&#xff0c;每一层判断是不是最后一层&#xff0c;是的话直接返回第一个; 如何判断是不是最后一层呢&#xff0c;首先队列头部&#xff0c;其次记录左右子节点都没有的节点数是不是等于que.size()&#xff1b;或…...

【数据结构OJ题】移除链表元素

原题链接&#xff1a;https://leetcode.cn/problems/remove-linked-list-elements/description/ 1. 题目描述 2. 思路分析 我们可以定义一个结构体指针变量cur&#xff0c;让cur一开始指向头结点&#xff0c;同时定义一个结构体指针prev&#xff0c;令prev初始化为空指针NULL…...

centos 安装 virtualbox

参考 https://phoenixnap.com/kb/how-to-install-virtualbox-centos-7 遇到 Gpg Keys Failue 这样解决 将 rpm 包下载到本地 –disablerepovirtualbox sudo yum --disablerepovirtualbox localinstall VirtualBox-7.0-7.0.10_158379_el7-1.x86_64 failure: repodata/repomd…...

Java8之Optional类的基本使用

文章目录 一、简介二、常见的Optional用法&#xff1a;1、创建Optional对象&#xff1a;1.1 使用of()方法&#xff1a;1.2 使用ofNullable()方法&#xff1a;1.3 使用empty()方法&#xff1a; 2、判断Optional是否包含值&#xff1a;2.1 使用isPresent()方法&#xff1a; 3、获…...

LinuxPTP时间同步

参考文献&#xff1a; http://linuxptp.sourceforge.net/ 0、硬件支持 查看网卡是否支持软硬件时间戳&#xff1a; sudo ethtool -T eno1 Time stamping parameters for eno1: Time stamping parameters for eno1: Capabilities: hardware-transmit (SOF_TIMESTAMPIN…...

【Django】Task1安装python环境及运行项目

【Django】Task1安装python环境及运行项目 写在最前 8月份Datawhale组队学习&#xff0c;在这个群除我佬的时代&#xff0c;写一下blog记录学习过程。 参考资源&#xff1a; 学习项目github&#xff1a;https://github.com/Joe-2002/sweettalk-django4.2 队长博客&#xff1a…...

2026这6款宝藏降AIGC软件大起底,一键把AIGC率降至安全线!

步入 2026 年&#xff0c;学术圈的风向早已不是过去那个只看查重率的时代了。如今&#xff0c;AI 检测系统像长了眼睛一样&#xff0c;精准捕捉每一段文字中的 AI 痕迹。高校的审核标准也愈发严苛&#xff0c;论文不仅要“看起来像人写的”&#xff0c;更要“读起来像人写的”。…...

别再买成品模块了!手把手教你用LM2596S-ADJ自制一个可调稳压电源(附PCB布线避坑指南)

从零打造高精度可调电源&#xff1a;LM2596S-ADJ实战设计与避坑全攻略 当你需要为创客项目或实验设备搭建一个灵活可靠的电源系统时&#xff0c;成品模块虽然方便&#xff0c;却失去了DIY的乐趣和深度定制的可能。本文将带你深入LM2596S-ADJ芯片的核心设计&#xff0c;从元器件…...

深入理解 Java 反射机制(Reflection)

一句话先给答案反射 在程序运行时&#xff0c;动态获取类的信息并动态操作对象的能力。正常编程&#xff1a;类 → 对象 → 调用方法 反射&#xff1a;未知类 → 运行时拿到类结构 → 创建对象 / 调用方法 / 访问属性一、为什么需要反射&#xff1f;&#xff08;先解决动机&am…...

AI科技热点日报 | 2026年5月22日

文章目录AI科技热点日报 | 2026年5月22日1、大模型技术突破OpenAI高管离职&#xff1a;安全主管Aleksander Madry转向AI经济研究Google发布Gemini Omni&#xff1a;多模态视频生成与编辑新突破ChatGPT集成Microsoft PowerPoint&#xff1a;AI生成演示文稿功能上线2、AI投融资动…...

Mythos模型:通用AI在漏洞挖掘与 exploit 生成中的范式跃迁

1. 这不是一次普通升级&#xff1a;Mythos 的能力跃迁到底意味着什么“Claude Mythos Preview”——这个名字在2026年4月的AI圈里炸开时&#xff0c;我正调试一个用Opus 4.6做代码审计的自动化流水线。看到基准测试数据的第一反应不是兴奋&#xff0c;而是下意识关掉了终端窗口…...

无需复杂代理快速为你的项目接入GPT4与Claude等多模型

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 无需复杂代理快速为你的项目接入GPT4与Claude等多模型 基础教程类&#xff0c;面向希望在一个项目中灵活调用不同厂商大模型的开发…...

OpenSSH CVE-2024-6387 漏洞原理与实战修复指南

1. 这不是普通补丁&#xff1a;CVE-2024-6387 是 OpenSSH 里埋了二十年的“定时炸弹”你有没有遇到过这种情况&#xff1a;凌晨三点&#xff0c;监控告警疯狂闪烁&#xff0c;SSH 登录失败率突然飙升到98%&#xff0c;但服务器负载、内存、磁盘一切正常&#xff1b;运维同事反复…...

如何轻松实现U校园智能刷课?这个Python工具让你5分钟搞定

如何轻松实现U校园智能刷课&#xff1f;这个Python工具让你5分钟搞定 【免费下载链接】AutoUnipus U校园脚本,支持全自动答题,百分百正确 2024最新版 项目地址: https://gitcode.com/gh_mirrors/au/AutoUnipus 还在为U校园网课的手动答题烦恼吗&#xff1f;AutoUnipus这…...

深入解析Linux内核sk_buff内存布局与核心操作原理

1. 项目概述&#xff1a;从数据包到sk_buff的旅程在网络编程和内核开发领域&#xff0c;sk_buff&#xff08;socket buffer&#xff09;是一个绕不开的核心数据结构。它就像网络数据包在内核世界里的“标准集装箱”&#xff0c;负责承载从网卡接收到应用层发送的每一份数据。无…...

想选靠谱的呼入语音机器人?这三个核心维度别忽略

电商大促期间客服热线占线不断&#xff0c;客户等待几分钟后愤然挂断&#xff1b;夜间咨询无人值守&#xff0c;潜在商机白白流失&#xff1b;传统语音机器人只会机械重复 “请按 1”&#xff0c;遇到稍微复杂的问题就答非所问…… 这些场景几乎是每个企业客服部门的日常痛点。…...