C++候捷stl-视频笔记2

news2024/11/19 19:22:19

深度搜索list

在这里插入图片描述
list是双向链表:底部实现是环状双向链表
list内部除了存data之外,还要存一个前向指针prev和一个后向指针next
list的iterator,当迭代器++的时候,是从一个节点走到下一个节点,是通过访问next指针实现的
在这里插入图片描述
主要有两部分:一部分是一堆typedef,另一部分是操作符的重载
在这里插入图片描述
前置(prefix)++iter和后置(postfix)iter++,后置重载时有int参数。
左下角,为了向int ++看齐,前置可以两次++,所以重载返回引用,后置不允许两次++,所以不返回引用
在这里插入图片描述
GC++2.9中iterator需要传三个模板参数<T, T&, T*>,而GC++4.9中仅需要传一个模板参数
在这里插入图片描述
4.9继承关系更复杂

迭代器的设计原则和Iterator Traits的作用与设计

在这里插入图片描述
iterator_category()是看++,–,能不能跳来跳去,随机访问;
iterator_difference_type:两个迭代器区间距离的表示类型;(unsigned int)
value_type:元素类型
另外两种reference和pointer没有在C++标准库中使用过,但要写出来
在这里插入图片描述
指针也被看作是一种退化的iterator,但指针不是一个类,无法在类中定义5种associated types,因此需要一个萃取机,作为中间层,加以判断
在这里插入图片描述
在这里插入图片描述
利用偏特化分离出类和指针
在这里插入图片描述

vector深度搜索

Vector是动态数组,它会进行扩充,但不是原地扩充,而是当数组空间用完时,它会在某个地方重新分配内存空间(原来的两倍大小),再把先前的内容搬过去
底层通常包含三个指针成员:start(第一个元素的指针,起始位置)、finish(最后一个元素的下一个位置的指针,存储元素结束范围)和 end_of_storage(内存空间的末尾的下一个位置的指针)
在这里插入图片描述
在这里插入图片描述
vector是连续的,用指针就能当作iterator。然后借助前面介绍的iterator_traits的偏特化(范围的偏特化,从接收T变成接收指针T ),会把associated types里面的 value_type直接指定为T,而不是基于类的迭代器的I::value_type
在这里插入图片描述
在这里插入图片描述
GC++4.9版本的vector的iterator不再是GC++2.9版本的指针T
,而是vector::iterator,里面的成员变量_M_current实际上就是_Tp*

array、forward list深度搜索

TR1标准array
在这里插入图片描述
array没有构造函数ctor,析构函数dtor。需要指定array的大小。
将本来的数组变为容器array是因为要提供迭代器,迭代器就要提供相应的5种类型,以便于连接算法与容器

forward list和双向链表list类似,只不过是单向

deque、queue和stack深度搜索

在这里插入图片描述
首先有一个map(暂且称为控制中心),里面存储指针,指针指向各个缓冲区buffer,缓冲区是数组,具体存储数据。缓冲区是连续的,但是不同的缓冲区之间不是连续的,所以称为分段连续
前后扩充时,map增加指针指向新的内存快。控制中心map是内存不够时是2倍增长
看起来好像连续,实际上是分段的,每个buffer有一定长度

迭代器中的cur,first,last,node四个元素,first和last分别是一个buffer的起始和结束,node是控制中心中哪个buffer的指针,cur指向的是具体的元素值。,每次++,–走到边界时,通过node回到控制中心,跳到下一个缓冲区

GC++2.9
在这里插入图片描述
class deque创建出来的对象本身大小有40B(32位机器上),至于deque里面存储的数据占用的空间大小,是动态分配获得的,和对象本身大小无关
iterator16b, map_point(T**,本身是一个指针)4b, map_size(控制中心这个vector的大小)4b
在这里插入图片描述
指定迭代器的类型是随机存取的类型,可以跳跃的,这就是deque对外表现的假象(虽然deque底层不连续,是分段连续的,但提供了++,+8的操作体现出连续的假象):提供随机访问迭代器,可以在常数时间内对其元素进行随机访问
在这里插入图片描述
在这里插入图片描述
中间插入时,判断哪端元素少,决定元素向前移动还是向后移动

reference front()
{
    return *start;
}
reference back()
{
    iterator tmp = finish; // 迭代器tmp赋值为finish,finish指向最后一个元素的下一个位置
    --tmp;// 迭代器--,往前移动一格
    return *tmp; // 此时返回的是最后一个元素
}
size_type size() const
{
    return finish - start; // -操作符重载,看两者之间多少个buffer,buffer*大小,然后在分别加上finish本身和start本身的元素;是尾巴迭代器-头迭代器;
    // 
}

// 两个迭代器之间的距离:指的是多少个元素在两个迭代器之间
difference_type operator-(const _Self& __x) const {
    return difference_type(buffer_size()) * (node - x.node - 1) + //-1减去起点的buffer
      (cur - first) /*末尾(当前)buffer的元素量*/ + (x.last - x.cur)/*起始buffer的元素量*/ ;
}

deque模拟连续

self& operator++() {
    ++cur;
    if (cur == last) { // 到达一个buffer的边界
       // node是控制中心的节点
      set_node(node + 1); // 跳转到下一个buffer的起点
      cur = first;
    }
    return *this; 
}
self operator++(int)  {
    self tmp = *this;
    ++*this;
    return tmp;
}
self& operator--() {
    if (cur == first) {
      set_node(node - 1);
      cur = last;
    }
    --cur;
    return *this;
}
self operator--(int) {
    self tmp = *this;
    --*this;
    return tmp;
}

// 从一个buffer跳转到另一个buffer
void set_node(map_pointer new_node) {
    node = new_node;
    first = *new_node; // 指向新buffer的start
    last = first + difference_type(buffer_size()); //指向新buffer的last
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
deque里面有四个成员变量:控制中心,控制中心大小,指向所有元素的头,指向所有元素尾
当控制中心vector空间满时,自动两倍扩充空间。把旧的元素拷贝进新vector的中间部分

queue默认内部有一个deque作为底层容器。不直接提供存储元素的能力,而是通过封装底层容器来实现队列的行为(先进先出(FIFO))

stack同理,实现先进后出(LIFO)

stack和queue可以选择list或者deque作为底层结构,都不允许遍历,不提供iterator,否则会干扰先进先出/先进后出规则

queue不可选择vector,stack可选择vector

stack和queue都不能选择set或map做底层结构

RB tree深度搜索

红黑树是一种自平衡的二叉搜索树,保持树的平衡
在这里插入图片描述
在这里插入图片描述
Key:表示红黑树节点的键(key)的类型。这是用来比较和排序节点的关键信息
Value:表示红黑树节点存储的值(value,这里value表示key和data的整体)的类型。每个节点包含一个键和一个值(data)
KeyOfValue:一个函数对象,用于从节点值中提取键。在红黑树中,节点的键是用来进行比较和排序的。通过 KeyOfValue,可以从节点的值中提取键,以确保正确的比较和排序
Compare:一个比较函数对象,用于定义节点之间的顺序关系。它用来比较节点的键值,从而实现红黑树的有序性。
allocate:一个分配器类型,用于管理红黑树节点的内存分配和释放
在这里插入图片描述
在这里插入图片描述
GC++4.9的实现,handle/body,可以参考effective c++条款31的知识点

set、multiset深度搜索

以rb_tree为底层,因此有元素自动排序特性,提供遍历操作iterators。提供了++操作

无法使用iterators改变元素值,因为key有严谨排列规则,底部是RB_tree的const iterator
在这里插入图片描述

map、multimap深度搜索

和set类似。但虽然无法使用iterators改变元素的key,但可以改变元素的data。因此map/multimap内部自动将user指定的key type设定为const,以便静止user对元素key赋值
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
map中的[] 操作符里面先调用lower_bound进行查找,然后再insert元素。比之间insert要慢

hashtable深度搜索

在这里插入图片描述
假设一个物体可能的变化有 2 32 2^{32} 232,理想情况则需要sizeof(T)* 2 32 2^{32} 232的空间存放

空间不足时,用编号%空间大小,放在余数的位置。两个元素折射的编号可能发生碰撞
在这里插入图片描述
如果发生碰撞,则变成一个链表。
但这样可能导致一个链表很长,搜寻很慢
因此当链表太长时,需要打散(如果元素的个数比篮子的个数多时,把篮子增大(选取2倍大附近的素数,已经写死)。元素落在的位置要重新计算)

Bucket篮子就是一个vector
在这里插入图片描述
Value:表示哈希表中存储的值的类型
Key:表示哈希表中存储的键的类型
HashFun:表示哈希函数的类型,定了计算键的哈希值的方法,它是一个函数对象(函数或函数指针),用于将键转换为哈希值
ExtractKey:表示从键值对中提取键的方法的类型,是一个函数对象,用于从键值对中提取键,它定义了哈希表如何获取键值对中的键。
EqualKey:表示键的相等比较方法的类型,是一个函数对象,用于判断两个键是否相等,它定义了哈希表中键的相等性比较。
在这里插入图片描述
在这里插入图片描述
数值本身当成编号
在这里插入图片描述
没有数学,不统一,目的是为了设计出一个够乱,即够散列的数字

unordered容器概念

在这里插入图片描述
使用时不保证元素的顺序,而是通过哈希表提供快速的查找性能。每个元素被映射到哈希表的一个桶中,这使得查找操作的时间复杂度较低

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

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

相关文章

arcgis api for javascript点击获取要素错乱的问题

今天帮同事看了一个前端地图点击的问题&#xff1a;点击时总会获取到周边的图元&#xff0c;即使我点击线的周围&#xff0c;也是能获取到的&#xff0c;除非离得特别远。 地图组件用的是arcgis api, 图层类是grahicslayer,要素类型是线。这是添加图元的代码&#xff1a; grap…

AIGC商业案例实操课,发觉其创造和商业的无限可能,Ai技术在行业应用新的商机

课程下载&#xff1a;https://download.csdn.net/download/m0_66047725/89307523 更多资源下载&#xff1a;关注我。 课程内容 1 AI为什么火 。写在课程前面的寄语 。AIGC标志性事件:太空歌剧院 。AI人工智能为什么这么火 &#xff0c;AI人工智能发展历程 。聊天AI会取…

Vxe UI vxe-upload 上传组件,显示进度条的方法

vxe-upload 上传组件 查看官网 https://vxeui.com 显示进度条很简单&#xff0c;需要后台支持进度就可以了&#xff0c;后台实现逻辑具体可以百度&#xff0c;这里只介绍前端逻辑。 上传附件 相关参数说明&#xff0c;具体可以看文档&#xff1a; multiple 是否允许多选 li…

短剧系统源码:构建互动娱乐的新平台

随着数字媒体的兴起&#xff0c;短剧成为了一种新兴的娱乐形式&#xff0c;它以紧凑的叙事和快速的节奏迎合了现代观众的观看习惯。短剧系统源码的开发&#xff0c;为短剧内容的创作、传播和消费提供了一个全面的技术解决方案。本文将探讨短剧系统源码的关键组成部分及其功能。…

基于python flask+pyecharts实现的中药数据可视化大屏,实现基于Apriori算法的药品功效关系的关联规则

背景 在中医药学中&#xff0c;物品与功效之间的关联关系研究是一个非常重要的课题。传统中医药学中&#xff0c;很多药物都具有多种功效&#xff0c;而且不同药物对同一种疾病可能具有不同的疗效。因此&#xff0c;挖掘物品与功效之间的关联关系&#xff0c;可以帮助我们更加…

【第十二节】C++控制台版本贪吃蛇小游戏

目录 一、游戏简介 1.1 游戏概述 1.2 实现功能 1.3 开发环境 二、实现设计 2.1 C类的设计 2.2 项目结构 2.3 代码设计 三、程序运行截图 3.1 游戏界面 3.2 自定义地图 3.3 常规游戏界面 一、游戏简介 1.1 游戏概述 本游戏是一款基于C语言开发的控制台版本贪吃蛇游…

centos7 openssh9.7p 制作rpm包

centos7 openssh9.7p 制作rpm包 下载源码包&#xff1a;通过git开源打包源码准备编译打包环境编译打包上传rpm包到需要更新的服务器,并更新 下载源码包&#xff1a; 一般只用ssh源码就可以了 cd /root wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.7p…

一文了解企业版电子书:从认识到制作

现如今&#xff0c;电子书已经成为企业传播知识、展示品牌、吸引客户的重要工具了。那么&#xff0c;企业版电子书到底是什么&#xff1f;又该如何才能制作出有效的企业版电子书呢&#xff1f;接下来&#xff0c;跟着LookLook同学一起来看看如何从认识到制作一本企业版电子书。…

【计算机网络】——物理层(图文并茂)

物理层 一.物理层概述1.物理层要实现的功能2.物理层接口特征1.机械特性2.电气特性3.功能特性4.过程特性 二.物理层下面的传输媒体1.传输媒体的分类2.导向型传输媒体1.同轴电缆2.双绞线3.光纤 3.非导向型传输媒体1.无线电波2.微波3.红外线4.激光5.可见光 三.传输方式1.串行传输与…

select多个客户端连接,传输数据时只能顺序传输产生原因

1. 场景描述 即A先连接,B后连接&#xff0c;只能先A后B依次输入数据&#xff0c;服务端依次读取数据 这是因为进行循环遍历lfd之后的描述符时&#xff0c;没有判断文件描述符i是否在newset集合中 //cfd发生变化 for(int ilfd1;i<maxfd;i){printf("i num %d\t"…

推理和行动协同(Reason and Act,ReAct)和代码生成

文心一言 当我们将“推理和行动协同&#xff08;Reason and Act&#xff0c;ReAct&#xff09;”的概念应用于代码生成时&#xff0c;我们可以理解为一种指导原则或方法论&#xff0c;它强调了在代码生成过程中进行深思熟虑的决策&#xff08;Reason&#xff09;和有效执行&am…

单实例11.2.0.3迁移到RAC11.2.0.4_使用RMAN 异机恢复

保命法则&#xff1a;先备份再操作&#xff0c;磁盘空间紧张无法备份就让满足&#xff0c;给自己留退路。 场景说明&#xff1a; 1.本文档的环境为同平台、不同版本&#xff08;操作系统版本可以不同&#xff0c;数据库小版本不同&#xff09;&#xff0c;源机器和目标机器部…

黑马微服务实用篇知识梳理

1、微服务治理 1.1服务注册与发现Eureka和Nacos a、nacos和eureka&#xff0c;二者都支持服务注册与发现&#xff0c;但nacos还包括了动态配置管理、服务健康监测、动态路由等功能&#xff0c;是更全面的服务管理平台 b、eureka需要独立部署为服务并运行&#xff0c;需要自行搭…

python根据版本下载外部库的.whl文件、python下载离线whl文件、python查找whl历史版本

文章目录 一、python下载外部库的.whl文件 当遇到pip源中没有对应的包&#xff0c;或者网络波动时&#xff0c;可能出现需要离线安装的方法。这里记录一下下载安装whl文件的操作。 一、python下载外部库的.whl文件 1、在浏览器输入https://pypi.org/进入PYPI官网 2、在弹出的…

CentOS7配置国内清华源并安装docker-ce以及配置docker加速

说明 由于国内访问国外的网站包括docker网站&#xff0c;由于种种的原因经常打不开&#xff0c;或无法访问&#xff0c;所以替换成国内的软件源和国内镜像就是非常必要的了&#xff0c;这里整理了我安装配置的基本的步骤。 国内的软件源有很多&#xff0c;这里选择清华源作为…

【PHP项目实战训练】——laravel框架的实战项目中可以做模板的增删查改功能(2)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

three.js官方案例(animation / keyframes)webgl_animation_keyframes.html学习

目录 ​编辑 1 PMREMenerator 1.1 构造函数 1.2 fromScene方法 2 AnimationMixer 3 animal1.html全部 4 animal1.js全部 1 PMREMenerator 此类生成预过滤的 Mipmapped 辐射环境贴图 &#xff08;PMREM&#xff09; 来自 cubeMap 环境纹理。这允许不同的级别 的模糊&…

lynis安全漏洞扫描工具

Lynis是一款Unix系统的安全审计以及加固工具&#xff0c;能够进行深层次的安全扫描&#xff0c;其目的是检测潜在的时间并对未来的系统加固提供建议。这款软件会扫描一般系统信息&#xff0c;脆弱软件包以及潜在的错误配置。 安装 方式1 git下载使用git clone https://github…

mac电脑用谷歌浏览器对安卓手机H5页面进行inspect

1、mac上在谷歌浏览器上输入 chrome://inspect 并打开该页面。 2、连接安卓手机到Mac电脑&#xff1a;使用USB数据线将安卓手机连接到Mac电脑。 3、手机上打开要的h5页面 Webview下面选择要的页面&#xff0c;点击inspect&#xff0c;就能像谷歌浏览器页面打开下面的页面&#…

61. UE5 RPG 实现敌人近战攻击技能和转向攻击

在前面&#xff0c;我们实现了敌人的AI系统&#xff0c;敌人可以根据自身的职业进行匹配对应的攻击方式。比如近战战士会靠近目标后进行攻击然后躲避目标的攻击接着进行攻击。我们实现了敌人的AI行为&#xff0c;但是现在还没有实现需要释放的技能&#xff0c;接下来&#xff0…