C++笔记10•容器适配器:stackqueue priority_queue•

news2024/9/21 0:44:39

从C++中看stack&queue&priority_queue

1.stack的介绍

官方stack实现: 本质是一个数组
1. stack 是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。
2. stack 是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部( 即栈顶 ) 被压入和弹出。
3. stack 的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下
操作:
empty :判空操作
back :获取尾部元素操作
push_back :尾部插入元素操作
pop_back :尾部删除元素操作
4. 标准容器 vector deque list 均符合这些需求,默认情况下,如果没有为 stack 指定特定的底层容器, 默认情况下使用deque

2. queue的介绍

官方queue实现:本质是一个链表
1. 队列是一种容器适配器,专门用于在 FIFO 上下文 ( 先进先出 ) 中操作,其中从容器一端插入元素,另一端提取元素。
2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类, queue 提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。
3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操作:
empty :检测队列是否为空
size :返回队列中有效元素的个数
front :返回队头元素的引用
back :返回队尾元素的引用
push_back :在队列尾部入队列
pop_front :在队列头部出队列
4. 标准容器类 deque list 满足了这些要求。默认情况下,如果没有为 queue 实例化指定容器类,则使用标准容器deque

3. priority_queue的介绍

官方实现priority_queue :本质是一个数组,因为被按照特定顺序排列,也又叫做 “堆”。
1. 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。(默认建大堆,降序排列)
2. 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素 ( 优先队列中位于顶部的元素)
3. 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类 queue 提供一组特 定的成员函数来访问其元素。元素从特定容器的“ 尾部 弹出,其称为优先队列的顶部。
4. 底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。容器应该可以通过随机访问迭 代器访问,并支持以下操作:
empty() :检测容器是否为空
size() :返回容器中有效元素个数
front() :返回容器中第一个元素的引用
push_back() :在容器尾部插入元素
pop_back() :删除容器尾部元素
5. 标准容器类 vector deque 满足这些需求。默认情况下,如果没有为特定的 priority_queue 类实例化指 定容器类,则使用vector
6. 需要支持随机访问迭代器,以便始终在内部保持堆结构。容器适配器通过在需要时自动调用算法函数 make_heap、 push_heap pop_heap 来自动完成此操作。
※注意:
优先级队列默认使用 vector 作为其底层存储数据的容器,在 vector 上又使用了堆算法将 vector 中元素构造成 堆的结构,因此 priority_queue 就是堆,所有需要用到堆的位置,都可以考虑使用 priority_queue 默认情况下 priority_queue 是大堆(会对数组元素进行降序排列)
在上方的官方实现当中有:class Container=deque<T>     class Container=vector<T>
在 C++ 中,一个 Containe 类会使用标准模板库(STL)中的容器类,如deque,来管理元素,来使stack和queue做容器适配器发挥它们的功能。
补充:
上述场景中stack和queue是通过用deque(class Container=deque<T>)当作容器适配器来实现stack和queue的功能;
priority_queue通过用vector( class Container=vector<T>)当作容器适配器来实现priority_queue的功能。
代码示例用class Container=deque<T>实现一个stack
#pragma once

namespace xcn
{
	template<class T, class Container = deque<T>>
	class stack
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}

		void pop()
		{
			_con.pop_back();
		}

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

		size_t size()
		{
			return _con.size();
		}

		bool empty()
		{
			return _con.empty();
		}
	private:
		Container _con;
	};

	void test_stack()
	{
		stack<int> s;//如果不写 默认使用deque<int>进行适配

		//stack<int, vector<int>> s;
		//stack<int, list<int>> s;
		//stack<int, string> s; 

		s.push(1);
		s.push(2);
		s.push(3);

		while (!s.empty())
		{
			cout << s.top() << " ";
			s.pop();
		}
		cout << endl;
	}
}

4.deque的介绍

官方实现deque:兼容 vector和list的功能
deque( 双端队列 ) :是一种双开口的 " 连续 " 空间的数据结构 ,双开口的含义是:可以在头尾两端进行插入和 删除操作,且时间复杂度为O(1) ,与 vector 比较,头插效率高,不需要搬移元素;与 list 比较,空间利用率比较高。
deque 并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际 deque 类似于一个动态的二维 数组 ,其底层结构如下图所示:
+-------+   +-------+   +-------+   +-------+
| Block |-->| Block |-->| Block |-->| Block |
+-------+   +-------+   +-------+   +-------+
   ^           ^           ^           ^
   |           |           |           |
   |           |           |           |
+---------------------------------------------+
|        指针数组(Map)                        |
+---------------------------------------------+
 
  • 每个“Block”表示一个内存块,存储deque的一部分元素。其中每个“Block”用迭代器来维护它的空间:cur、first、last、node。
  • “Map”是一个指向这些内存块的指针数组。

deque就是可以替代vector和list,但也不是完全替代,也有它的缺陷:

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

5.deque补充说明

(1)vector和list的区别:
vector是一个可动态增长的 数组
优点:可以进行随机访问,很好的支持排序、二分查找、堆算法等等。
缺点:头部或者中间的插入删除效率低(头插头删效率低),并且空间不够了以后增容的代价较大,需要拷贝数据。
list是一个带头双向循环的 链表
优点:任意位置插入删除数据效率高,时间复杂度:0(1)
缺点:不支持随机访问
总结: vector和list是两个相辅相成,互补的容器。
有没有一种数据结构可以解决vector和list的缺点呢?
解决方法:deque容器(见上方)
但是也不是说deque容器完全替代了vector和list容器,deque容器也有缺陷:
  • 大量的频繁的遍历,效率低。
  • 迭代器的遍历相对复杂,效率受到影响。

补充:

容器适配器(stack/queue/ priority_queue)都不支持迭代器遍历,因为他们通常都包含一些特殊性质,如果支持迭代器随便遍历,那他们无法很好的保持他的性质。比如:先进先出,后进先出,这些特有性质。

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

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

相关文章

【C/C++】typedef用法

typedef用法讲解&#xff0c;时隔半年&#xff0c;再看typedef。 &#x1f381;typedef可以简化结构体关键字 #include<iostream> using namespace std;struct Person {char name[64];int age; };void test01() {struct Person p { "张三",18 };//不用type…

【设计模式-代理】

定义 代理模式是一种结构型设计模式&#xff0c;它提供了对象的替代者或占位符&#xff0c;用来控制对这个对象的访问。通过代理模式&#xff0c;一个类可以代表另一个类来执行某些操作。这种模式常用于增强对象的功能或控制对对象的访问。 特点 控制访问&#xff1a;代理模…

day01 1.c++对c的扩充

#include <iostream>using namespace std;int main() {string s1;cout << "请输入一个字符串&#xff1a;";getline(cin,s1);int count10,count20,count30,count40;int len s1.length();for(int i0;i<len;i){if((s1[i]>a&&s1[i]<z) ||…

BeanPostProcessor和Ordered

1. 概述 BeanPostProcessor 和 Ordered 接口用于在Spring容器初始化Bean的过程中进行自定义处理&#xff0c;并控制处理顺序 2. BeanPostProcessor BeanPostProcessor 接口允许你在Spring容器初始化Bean的前后对Bean进行自定义处理。它有两个方法&#xff1a; postProcessB…

zabbix对接Grafana

1.grafana安装 Download Grafana | Grafana Labs sudo yum install -y https://dl.grafana.com/oss/release/grafana-11.1.4-1.x86_64.rpm 2.zabbix插件安装 Grafana 默认并没有 zabbix 数据源的支持&#xff0c;只有安装了zabbix插件&#xff0c;才可以在grafana中添加zabbi…

峟思固定测斜仪的工作原理与应用

固定测斜仪作为一种精密的测量仪器&#xff0c;在地质工程、土木工程、矿山安全等领域中发挥着至关重要的作用。它通过测量土体或岩体内部的水平位移&#xff0c;为工程安全监测提供了可靠的数据支持。本文将详细介绍固定测斜仪的工作原理、结构组成以及其在实际应用中的表现。…

一文读懂 DDD领域驱动设计

DDD&#xff08;Domain-Driven Design&#xff0c;领域驱动设计&#xff09;是一种软件开发方法&#xff0c;它强调软件系统设计应该以问题领域为中心&#xff0c;而不是技术实现为主导。DDD通过一系列手段如统一语言、业务抽象、领域划分和领域建模等来控制软件复杂度&#xf…

快手小店自动回复机器人脚本

快手小店自动回复机器人是一种利用人工智能AI技术&#xff0c;能够根据用户的会话咨询内容自动回复的工具。这种机器人可以帮助快手小店主快速、高效地回复客户消息&#xff0c;提升店铺的客户服务质量和销售效率。 甜羊浏览器是一款基于Chromium内核开发的国产浏览器&#xff…

OpenAI API: How to count tokens before API request

题意&#xff1a;“OpenAI API&#xff1a;如何在 API 请求之前计算令牌数量” 问题背景&#xff1a; I would like to count the tokens of my OpenAI API request in R before sending it (version gpt-3.5-turbo). Since the OpenAI API has rate limits, this seems impor…

记录一次target引发的事故:一直提示数据库连接超时

你们好&#xff0c;我是金金金。 场景 启动项目&#xff0c;一直报数据库连接超时&#xff1a; The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. The error may exist in com/xuecheng/sy…

【分立元件】以太网变压器中心抽头有什么作用?

在以太网设备中,通过 PHY 接 RJ45 时,中间都会加一个网络变压器。 但查看不同产品的设计,有的变压器中心抽头接电源,有的又接电容到地。而且接电源时,电源值又可以不一样,3.3V,2.5V,1.8V都有。这个变压器的中心抽头作用到底是什么呢? 中心抽头作用 1. 通过提…

云渲染解决:笔记本渲染很伤电脑吗?如何保护你的电脑?

笔记本电脑是设计师、视频剪辑师和3D艺术家的重要工具&#xff0c;提供随时随地的创作能力。但渲染工作可能对笔记本造成损害。本文将分析渲染对笔记本的影响&#xff0c;并提供减少损伤的策略&#xff0c;帮助用户保持设备在创作中的高效与安全。 一、笔记本电脑渲染的影响 电…

【html+css 绚丽Loading】 000020 三才流转盘

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽Loading&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495…

xss-labs通关攻略 11-15关

第十一关&#xff1a;less-11 步骤一&#xff1a;利用burp抓包 步骤二&#xff1a;添加referer:click me!" type"button" οnmοuseοver"alert(/xss/)进行放包 第十二关&#xff1a;less-12 步骤一&#xff1a;利用burp抓包 步骤二&#xff1a;修改User A…

快团团幸运大转盘是是什么?团长如何使用?

幸运大转盘是什么&#xff1f; 1、团员可以在团内转转盘进行抽奖 2、团员获得的奖励有优惠券&#xff08;无门槛、满减&#xff09;&#xff0c;实物礼品两种形式 3、团员可通过在团内下单&#xff0c;来增加转转盘的次数 4、团长可自行设定奖品、中奖概率&#xff08;中奖…

Linux单用户模式和救援模式

Linux单用户模式和救援模式 单用户模式Initramfs模式进入救援模式 修改被救援Linux的配置挂载boot和/切根 单用户模式 Linux系统的单用户模式有些类似Windows系统的安全模式&#xff0c;只启动最少的程序用于系统修复。在单用户模式中&#xff08;运行级别为1&#xff09;&…

集团数字化转型方案(十八)

为了实现集团的数字化转型&#xff0c;我们将通过引入人工智能、大数据分析、云计算和物联网等先进技术&#xff0c;全面升级现有业务系统与流程&#xff0c;优化企业资源规划&#xff08;ERP&#xff09;&#xff0c;提升业务自动化水平和数据驱动决策能力&#xff1b;建设集成…

一个可以免费上传制作电子版招生简章的网站

当今社会&#xff0c;网络的普及使得越来越多的学校和企业选择通过电子版招生简章来扩大影响力&#xff0c;降低宣传成本。有没有一个免费、便捷且功能强大的平台&#xff0c;能让您轻松上传制作招生简章呢&#xff1f;答案是肯定的&#xff01; 1.要制作电子杂志,首先需要选择…

Mybatis Plus乐观锁实现

1 引言 乐观锁的主要作用在于提高系统的并发性能和减少锁冲突&#xff0c;同时保证数据的一致性。‌其原理简单来说就是&#xff0c;在修改数据的时候&#xff0c;判断数据是否被其他人改过&#xff0c;如果已被其他人改过&#xff0c;则修改失败。 2 代码 在SpringBoot 3.x…

掏耳勺买什么样的好?五大超值不踩雷可视挖耳勺推荐种草!

可视挖耳勺是热度特别高的个人清洁工具&#xff0c;不仅能够更加清晰地观察自己耳内的状况&#xff0c;从而更加安全、有效地清洁耳朵&#xff0c;可以发挥多种多样的作用&#xff0c;但是市面上也隐藏了很多劣质不专业产品&#xff0c;使用这类产品容易出现成像效果模糊、机身…