第四章:适配器、双端队列、栈和队列(逻辑梳理,底层实现)

2024-06-03 07:28

本文主要是介绍第四章:适配器、双端队列、栈和队列(逻辑梳理,底层实现),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、什么是适配器?

  • 容器适配器(Container Adaptor)是一种设计模式,用于将一个容器的接口适配成另一个容器的接口。
  • 在C++标准模板库(STL)中,容器适配器是一种预定义的容器,它们提供了对某些底层容器的封装,并对其接口进行了适配。
  • 比如,stack和queue的底层实现就是用了适配器而非容器,这样stack的函数实现就可以直接封装其他容器的函数,不用再从头开始实现底层代码。

二、双端队列deque(了解原理即可,无需深究,主要还是使用vector和list):

2.1什么是双端队列?

  • 双端队列deque是C++标准模板库(STL)中的一种序列容器。它提供了动态数组的功能,并且支持在两端(即前端和后端)进行高效的插入和删除操作。
  • deque相当于vector和list的缝合版,我们知道vector和list都在特定的方面有较强的能力,比如vector的随机访问,list的双端操作。而deque既可以随机访问又可以双端操作。但是他在这两方面又都不是很突出。属于都行也都不怎么行。

2.2deque的底层实现:

  • 将数据分成多个固定大小的块(blocks),然后通过一个指针数组(中控数组)来管理这些数组。
  • 数据块(数组)(Blocks):数据存储在多个固定大小的块中,每个块的大小通常是32或64个元素。这些块中的元素在内存中是连续的,但不同块之间不需要连续。
  • 指针数组(中控数组)(Map):指针数组中的每个指针指向一个数据块的起始位置。指针数组本身也是动态可扩展的,可以根据需要增加或减少。
  • deque维护两个指针,一个指向第一个有效元素的位置,另一个指向最后一个有效元素的下一个位置。

2.3deque头插实现的原理:

  • 首先检查当前的第一个数据块的前端是否有可用空间。如果有可用空间,则直接插入新元素。
  • 如果没有可用空间,则需要分配一个新的数据块,并将其添加到指针数组的前端。
  • 更新指针数组以包含新的数据块。
  • 头插一个数据到新开辟的块中,这个数据是被插入到块的末尾。比如一个块a有4个可用空间,头插会先插入a[3]而不是a[0]位置。

2.4deque尾插实现原理:

  • 基本和头插一样,但是开辟一个新的块,尾插一个元素进去,首先被插入的地方是块的头部不是尾部。

2.5deque中间插入,实现原理:

  • 通过指针数组快速定位到包含待插入位置的数据块。因为每一个块都是等大的,所以“位置/块大小=所在的块”。
  • 找到目标块所要插入的位置,位置%块大小=块中位置。
  • 根据插入位置,将元素插入到该数据块的合适位置。
  • 如果插入后导致当前数据块容量不足,需要进行数据块的分裂或合并操作。就是挪动数据,将部分元素挪动到新创建的块。
  • 根据需要更新指针数组和数据块的指针。

2.6中控数组(指针数组)是否需要扩容,如何扩容?

  • 通常情况下,指针数组会被设置成一个足够大的值以容纳大部分情况下的数据块数量。
  • 如果需要扩容时,先分配一个更大的内存空间。
  • 将原有的指针数组中的指针复制到新的内存空间中。
  • 释放原有的指针数组内存空间。
  • 更新指针数组的指针指向新的内存空间。

三、stack和queue:

3.1stack和queue在库中是如何实现的?

  • stack和queue在库中被认为是容器适配器(container adapter),而不是容器(container)。他们并不是独立的数据结构,而是将已有的容器封装起来,以实现特定的行为。
  • 在C++标准库中,stack通常是基于deque实现的,也可以选择基于vector实现。
  • 在C++标准库中,queue通常也是基于deque实现的,同样也可以基于vector实现。

3.2stack和queue的接口:

  • stack和queue的接口比较少。
  • stack的接口如下:

        

  • queue的接口如下:

        

3.3stack的模拟实现:

namespace demo1
{template<class T, class Container>//Container表示适配器,库中实现为缺省+dequeclass stack{public://注意将成员函数设置为公有bool empty(){return _con.empty();}size_t size(){return _con.size();}const T& top(){return _con.back();}void push(const T& x){_con.push_back(x);}void pop(){_con.pop_back();}private:Container _con;};
}

 3.4queue的模拟实现:

#pragma oncenamespace demo2
{template<class T,class Container>class queue{public:bool empty(){return _con.empty();}size_t size(){return _con.size();}const T& front(){return _con.front();}const T& back(){return _con.back();}void push(const T& x){_con.push_back(x);}void pop(){_con.pop_front();}private:Container _con;};
}

这篇关于第四章:适配器、双端队列、栈和队列(逻辑梳理,底层实现)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1026337

相关文章

C#实现将XML数据自动化地写入Excel文件

《C#实现将XML数据自动化地写入Excel文件》在现代企业级应用中,数据处理与报表生成是核心环节,本文将深入探讨如何利用C#和一款优秀的库,将XML数据自动化地写入Excel文件,有需要的小伙伴可以... 目录理解XML数据结构与Excel的对应关系引入高效工具:使用Spire.XLS for .NETC

Nginx更新SSL证书的实现步骤

《Nginx更新SSL证书的实现步骤》本文主要介绍了Nginx更新SSL证书的实现步骤,包括下载新证书、备份旧证书、配置新证书、验证配置及遇到问题时的解决方法,感兴趣的了解一下... 目录1 下载最新的SSL证书文件2 备份旧的SSL证书文件3 配置新证书4 验证配置5 遇到的http://www.cppc

Nginx之https证书配置实现

《Nginx之https证书配置实现》本文主要介绍了Nginx之https证书配置的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起... 目录背景介绍为什么不能部署在 IIS 或 NAT 设备上?具体实现证书获取nginx配置扩展结果验证

SpringBoot整合 Quartz实现定时推送实战指南

《SpringBoot整合Quartz实现定时推送实战指南》文章介绍了SpringBoot中使用Quartz动态定时任务和任务持久化实现多条不确定结束时间并提前N分钟推送的方案,本文结合实例代码给大... 目录前言一、Quartz 是什么?1、核心定位:解决什么问题?2、Quartz 核心组件二、使用步骤1

使用Redis实现会话管理的示例代码

《使用Redis实现会话管理的示例代码》文章介绍了如何使用Redis实现会话管理,包括会话的创建、读取、更新和删除操作,通过设置会话超时时间并重置,可以确保会话在用户持续活动期间不会过期,此外,展示了... 目录1. 会话管理的基本概念2. 使用Redis实现会话管理2.1 引入依赖2.2 会话管理基本操作

mybatis-plus分表实现案例(附示例代码)

《mybatis-plus分表实现案例(附示例代码)》MyBatis-Plus是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生,:本文主要介绍my... 目录文档说明数据库水平分表思路1. 为什么要水平分表2. 核心设计要点3.基于数据库水平分表注意事项示例

C#高效实现在Word文档中自动化创建图表的可视化方案

《C#高效实现在Word文档中自动化创建图表的可视化方案》本文将深入探讨如何利用C#,结合一款功能强大的第三方库,实现在Word文档中自动化创建图表,为你的数据呈现和报告生成提供一套实用且高效的解决方... 目录Word文档图表自动化:为什么选择C#?从零开始:C#实现Word文档图表的基本步骤深度优化:C

nginx跨域访问配置的几种方法实现

《nginx跨域访问配置的几种方法实现》本文详细介绍了Nginx跨域配置方法,包括基本配置、只允许指定域名、携带Cookie的跨域、动态设置允许的Origin、支持不同路径的跨域控制、静态资源跨域以及... 目录一、基本跨域配置二、只允许指定域名跨域三、完整示例四、配置后重载 nginx五、注意事项六、支持

Qt实现对Word网页的读取功能

《Qt实现对Word网页的读取功能》文章介绍了几种在Qt中实现Word文档(.docx/.doc)读写功能的方法,包括基于QAxObject的COM接口调用、DOCX模板替换及跨平台解决方案,重点讨论... 目录1. 核心实现方式2. 基于QAxObject的COM接口调用(Windows专用)2.1 环境

MySQL查看表的历史SQL的几种实现方法

《MySQL查看表的历史SQL的几种实现方法》:本文主要介绍多种查看MySQL表历史SQL的方法,包括通用查询日志、慢查询日志、performance_schema、binlog、第三方工具等,并... 目录mysql 查看某张表的历史SQL1.查看MySQL通用查询日志(需提前开启)2.查看慢查询日志3.