目录

前言

1. stack(栈)

1.1 基本概念

1.2 常用接口

1.3 应用示例:最小栈

1.4 模拟实现

2. queue(队列)

2.1 基本概念

2.2 常用接口

2.3 模拟实现

3. priority_queue(优先队列)

3.1 基本概念

3.2 常用接口

3.3 自定义比较方式

3.4 自定义类型使用

4. 容器适配器

4.1 什么是适配器

4.2 为什么选择deque作为默认底层容器

5. 实际应用

5.1 栈的应用

5.2 队列的应用

5.3 优先队列的应用

总结


前言

在C++标准模板库(STL)中,stack、queue和priority_queue是三种非常重要的容器适配器。它们建立在其他基础容器之上,提供了特定的数据访问方式。本文将详细介绍这三种容器适配器的特性、使用方法和底层实现原理。


1. stack(栈)

1.1 基本概念

stack是一种后进先出(LIFO)的数据结构,只允许在容器的一端进行插入和删除操作。它作为容器适配器实现,底层可以使用vector、deque或list等容器。


 

#include <stack>
std::stack<int> s;  // 默认使用deque作为底层容器

1.2 常用接口

- `push()`: 压栈
- `pop()`: 出栈
- `top()`: 访问栈顶元素
- `empty()`: 判断是否为空
- `size()`: 返回元素个数

1.3 应用示例:最小栈
 

class MinStack {
public:void push(int x) {_elem.push(x);if(_min.empty() || x <= _min.top())_min.push(x);}void pop() {if(_min.top() == _elem.top())_min.pop();_elem.pop();}int top() { return _elem.top(); }int getMin() { return _min.top(); }private:std::stack<int> _elem;std::stack<int> _min;
};

1.4 模拟实现

template<class T, class Con = std::deque<T>>
class stack {
public:void push(const T& x) { _c.push_back(x); }void pop() { _c.pop_back(); }T& top() { return _c.back(); }size_t size() const { return _c.size(); }bool empty() const { return _c.empty(); }
private:Con _c;
};


 

2. queue(队列)

2.1 基本概念

queue是一种先进先出(FIFO)的数据结构,允许在一端插入元素,在另一端删除元素。它同样作为容器适配器实现,底层可以使用deque或list。


 

#include <queue>
std::queue<int> q;  // 默认使用deque作为底层容器


 

2.2 常用接口

- `push()`: 入队
- `pop()`: 出队
- `front()`: 访问队头元素
- `back()`: 访问队尾元素
- `empty()`: 判断是否为空
- `size()`: 返回元素个数

2.3 模拟实现


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

 

3. priority_queue(优先队列)

3.1 基本概念

priority_queue是一种特殊的队列,它的第一个元素总是最大的(默认大顶堆)。底层通常使用vector实现,并通过堆算法维护结构。


 

#include <queue>
std::priority_queue<int> pq;  // 默认大顶堆


 

3.2 常用接口

- `push()`: 插入元素
- `pop()`: 删除堆顶元素
- `top()`: 访问堆顶元素
- `empty()`: 判断是否为空
- `size()`: 返回元素个数

3.3 自定义比较方式


 

// 小顶堆
std::priority_queue<int, std::vector<int>, std::greater<int>> min_pq;


 

3.4 自定义类型使用

class Date {
public:// ... 构造函数等 ...bool operator<(const Date& d) const { /* 比较逻辑 */ }bool operator>(const Date& d) const { /* 比较逻辑 */ }
};// 使用
std::priority_queue<Date> pq;  // 大顶堆
std::priority_queue<Date, std::vector<Date>, std::greater<Date>> min_pq;


 

4. 容器适配器

4.1 什么是适配器

适配器是一种设计模式,它将一个类的接口转换成客户希望的另一个接口。STL中的stack、queue和priority_queue都是容器适配器,它们基于其他容器(如deque、vector)实现特定功能。

4.2 为什么选择deque作为默认底层容器

1. stack和queue不需要遍历,只需要在固定端操作
2. deque在元素增长时比vector高效(不需要搬移大量数据)
3. 相比list,deque空间利用率更高

5. 实际应用

5.1 栈的应用

- 逆波兰表达式求值
- 括号匹配
- 函数调用栈

5.2 队列的应用

- 广度优先搜索(BFS)
- 任务调度
- 消息队列

5.3 优先队列的应用

- 任务优先级调度
- Dijkstra算法
- 哈夫曼编码


总结

stack、queue和priority_queue是C++ STL中三种重要的容器适配器,它们基于其他容器实现,提供了特定的数据访问方式。理解它们的特性和底层实现原理,对于编写高效、清晰的代码非常重要。在实际开发中,根据具体需求选择合适的容器,可以大大提高程序的性能和可维护性。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 操作 Redis 客户端

引言 前面几篇文章都在介绍 Redis 原生命令行客户端&#xff0c;在实际应用开发中&#xff0c;开发人员更希望使用针对特定编程语言的专用客户端&#xff0c;通过编程的方式操作 Redis 数据库。因此&#xff0c;Redis 支持多种编程语言。本文将介绍 如何使用 C 语言来操作 Red…

批量提问程序开发方案:基于Python的百度文小言接口实现

批量提问程序开发方案&#xff1a;基于Python的百度文小言接口实现 1. 项目概述 1.1 项目背景 在现代信息检索和自动化办公场景中&#xff0c;批量提问功能已成为提高工作效率的重要工具。本项目旨在开发一个基于Python的批量提问程序&#xff0c;专门针对百度文小言平台&am…

Apollo中三种相机外参的可视化分析

Apollo中三种相机外参的可视化分析一、什么是相机外参&#xff1f;为什么需要可视化&#xff1f;二、不同外参来源对比三、详细操作步骤1. 环境准备2. 获取 NuScenes外参数据3. 外参到空间位置的转换及可视化四、可视化对比1. NuScenes数据集外参2. Apollo BEV模型外参3. Apoll…

虚拟化KVM常用命令汇总

KVM&#xff08;Kernel-based Virtual Machine&#xff09;是一种开源的硬件虚拟化解决方案&#xff0c;它是 Linux 内核的一部分&#xff0c;允许在支持虚拟化技术的硬件&#xff08;如 Intel VT-x 或 AMD-V&#xff09;上运行虚拟机。KVM 将 Linux 内核转变为一个裸机虚拟机监…

6s081环境配置以及使用vscode连接本地wsl2

6s081环境配置以及使用vscode连接wsl2 本人环境&#xff1a;windows11、wsl2ubuntu20.04 课程&#xff1a;6s081的2020版本的:https://pdos.csail.mit.edu/6.S081/2020/schedule.html 一、wsl2ubuntu20.04配置6s081环境 注&#xff1a;关于如何在window中安装wsl&#xff0c;这…

C++实现线程池(3)缓存线程池

三. CachedThreadPool 的实现3.1 需求:动态调整线程数量&#xff1a;与 FixedThreadPool 不同&#xff0c;CachedThreadPool 的线程数量是动态调整的。当有新任务提交时&#xff0c;如果线程池中有空闲的线程&#xff0c;则会立即使用空闲线程执行任务&#xff1b;如果线程池中…

WMS+自动化立库:无人仓的现在进行时

传统仓库正面临严峻挑战&#xff1a;效率瓶颈日益凸显&#xff0c;人力成本持续攀升&#xff0c;空间利用率逼近极限&#xff0c;而订单响应速度却难以满足市场需求。如何破局&#xff1f;WMS&#xff08;仓库管理系统&#xff09;与自动化立体库&#xff08;AS/RS&#xff09;…

多模态大模型研究每日简报【2025-08-05】

训练数据相关 EditGarment: An Instruction-Based Garment Editing Dataset Constructed with Automated MLLM Synthesis and Semantic-Aware Evaluation (https://arxiv.org/abs/2508.03497)&#xff1a;提出了一种自动化的流程&#xff0c;用于构建服装编辑数据集EditGarmen…

4、docker数据卷管理命令 | docker volume

1、命令总览命令作用出现频率备注★ docker volume create新建卷高-d 指定驱动&#xff0c;-o 指定驱动选项★ docker volume ls列出卷高--filter danglingtrue 查孤儿卷★ docker volume inspect查看卷详情高输出 JSON&#xff0c;可加 --format★ docker volume rm删除卷高只…

计数组合学7.14(对偶 RSK 算法)

7.14 对偶 RSK 算法 存在 RSK 算法的一种变体&#xff0c;其与乘积 ∏i,j(1xiyj)\prod_{i,j}(1 x_{i}y_{j})∏i,j​(1xi​yj​) 的关系类似于 RSK 算法本身与 ∏i,j(1−xiyj)−1\prod_{i,j}(1 - x_{i}y_{j})^{-1}∏i,j​(1−xi​yj​)−1 的关系。我们称此变体为对偶 RSK 算法…

C语言中的进程、线程与进程间通信详解

目录 引言 基本概念 1. 进程&#xff08;Process&#xff09; 2. 线程&#xff08;Thread&#xff09; 线程编程实战 1. 常见线程库 2. 合理设置线程数 3. pthread 创建线程 线程同步机制 1. 互斥锁 pthread_mutex_t 2. 条件变量 pthread_cond_t 3. 读写锁 pthread…

[假面骑士] 555浅谈

假面骑士555(faiz)是我最先接触的一部平成系列的假面骑士&#xff0c;同时也是我个人最喜欢的一部假面骑士。一、大纲简介震惊&#xff0c;人类最新的进化形态——奥菲一诺&#xff0c;横空出世&#xff01;日本的顶级财团&#xff0c;Smart Brain&#xff0c;的前任社长&#…

Vue Router 路由的创建和基本使用(超详细)

一、路由的基本概念 你是否好奇单页应用&#xff08;SPA&#xff09;是如何在不刷新页面的情况下实现页面切换的&#xff1f;这就离不开路由的功劳。 路由&#xff1a;本质是一组 key-value 的对应关系&#xff0c;在前端领域中&#xff0c;key 通常是路径&#xff0c;value …

深入理解设计模式:策略模式的艺术与实践

在软件开发中&#xff0c;我们经常会遇到需要根据不同情况选择不同算法或行为的场景。传统的做法可能是使用大量的条件语句&#xff08;if-else或switch-case&#xff09;&#xff0c;但随着需求的增加和变化&#xff0c;这种硬编码的方式会导致代码难以维护和扩展。策略模式&a…

概率/期望 DP llya and Escalator

题目链接&#xff1a;Problem - D - Codeforces 看了这篇文章来的&#xff1a;【算法学习笔记】概率与期望DP - RioTian - 博客园 这篇博客写得挺好的&#xff0c;讲了一些常见方法&#xff0c;概率 / 期望的题多练练就上手了。 题目大意&#xff1a; n 个人排队上电梯&…

大陆电子MBDS开发平台转到其他国产控制器平台产生的问题记录

u8_StComLowSpdGearSwt变量为例&#xff0c;之前用的时候只有输入&#xff0c;没什么实际意义&#xff0c;导致新环境下编译报错&#xff0c;缺少声明&#xff0c;解决办法&#xff1a;注释掉输入模块。今天解决的另一个比较大的问题&#xff0c;不同模型函数公用函数模块生成代…

机器学习模型调优实战指南

文章目录模型选择与调优&#xff1a;从理论到实战1. 引言2. 模型评估&#xff1a;为选择提供依据2.1 偏差-方差权衡2.2 数据集划分与分层抽样2.3 交叉验证&#xff08;Cross-Validation&#xff09;2.4 信息准则&#xff08;AIC / BIC&#xff09;3. 超参数调优&#xff1a;让模…

【教程】Unity CI/CD流程

测试机&#xff1a;红帽 Linux8 源码仓库&#xff1a;Gitee - MrRiver/Unity Example   系统环境准备 1&#xff09;yum 源 sudo curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo sudo sed -i s/\$releasever/8/g /etc/yum.repos…

文献阅读 | Briefings in Bioinformatics | Hiplot:全面且易于使用的生物医学可视化分析平台

文献介绍文献题目&#xff1a; Hiplot&#xff1a;一个综合且易于使用的 Web 服务&#xff0c;用于增强出版物准备的生物医学数据可视化 研究团队&#xff1a; Openbiox/Hiplot 社区 发表时间&#xff1a; 2022-07-05 发表期刊&#xff1a; Briefings in Bioinformatics 影响因…

【数字图像处理系列笔记】Ch04:灰度变换与空间域图像增强(2)

目录 一、空域滤波基础 一、空域滤波的基本概念 二、空域滤波的数学原理 三、空域滤波器的分类与典型示例 &#xff08;一&#xff09;线性滤波器&#xff08;Linear Filter&#xff09; &#xff08;二&#xff09;非线性滤波器&#xff08;Non-linear Filter&#xff0…