STL第二讲

第二讲

视频标准库源码版本:gnu c++ 2.9.1/4.9/Visual C++

OOP vs GP

GP是将datas与methods分开,OOP相反;

为什么list不能使用全局的sort
因为sort源代码:

 *(first + (last - first)/2)
// 此迭代器只能是随机访问迭代器
// list因为自身特性,其迭代器不支持随机访问

技术基础

1. 运算符重载

对于一个迭代器,基本都要重载*->后++前++,当然还包括其他

2. 模板

关于特化(全特化)

偏特化(Partial Specialization):

分配器allocator

一个观念:关于内存分配都会基于malloc(memory allocation), malloc再基于操作系统进行实现; 同理,回收基于delete

每次调用malloc,除了分配真正需要的内存,还有一些额外开销overhead(见内存管理课程)

VC6的allocator:位于头文件,查看源代码后,new和delete是基于malloc和delete,没有任何特殊设计,BC和GCC2.9一样。且直接使用allocator比较麻烦,更好的选择是使用迭代器。

GCC2.9真正只用的alloc:在stl_alloc.h

关于gcc4.9的allocator和__pool_alloc,见视频;

容器

一、顺序容器

list


详细的讲解看视频:深度探索list

  • g2.9和g4.9的优劣对比;为什么2.9的list大小是4,4.9是8;
  • list“前闭后开”的实现;

Iterator traits

迭代器要回答算法的五个问题:

image-20240105163000760

重点关注前三种;reference和pointer从未被使用过

iterator traits(萃取机):一个区分传入的是迭代器还是原生指针的中间层

vector

  1. vector的扩容:2倍扩容,很多编译器的具体实现都是如此
  2. finish:根据我们使用end的具体含义,可知finish指向的是尾后元素
  3. size的写法:调用成员函数end()-begin()而没有直接使用finish-start,但这样方便后续代码尽量少的改动(empty等的实现也是如此)
  4. 关于[]:具有连续存储的容器,都要提供下标运算符
关于vector的2倍扩容

使用vector要注意:扩容时大量使用构造和析构函数
其他方面看视频;

array

array是模拟C/C++语言本身的数组,但是可以更好地利用迭代器、泛型算法等

forward_list

单向链表,可以借鉴之前讲过的双向链表list

deque

只在尾部扩充:vector;双向扩充:deque

图中已经申请了三个buffer,向前/后扩充,就是要在map的五个buffer对应的指针的前/后的指针再次申请新的buffer。图中第一个buffer(左上)还未用完,用完需要图示中的map中的第一个指针再去申请buffer。向后扩充也是如此。

关于迭代器:

  1. first/last:每个buffer的前后边界;
  2. node的作用:为保持连续性,图中示例,元素99下一个元素是0(下个buffer)。即通过node来去map中寻找下个buffer
  3. cur:指向某个元素。图中是指向99
  4. start/finish:整个deque的头和尾元素
  5. 关于deque中iterator的大小及具体内容请看视频
deque如何模拟连续

与deque的迭代器相关,重要的点:重载了+=++[]等运算符

关于deque的map:是vector。在扩充时也是2倍扩充,但是复制旧元素到新的map的中间,保证可以双向扩充

queue和stack

queue和stack内部默认用deque实现。是通过改装其他容器来实现自身,所以称之为容器适配器

stack和deque不允许遍历,即不提供迭代器(否则可能会破坏两种容器适配器的特性:先进后出、先进先出)

可选择作为底层的容器:list、deque;stack可用vector,queue不能用vector(不支持pop(),如果你的queue不调用pop,那也可用vector);二者均不可选的:set、map

二、关联容器

视频中的键是key,值data,二者合称value

红黑树

map/multimap

特点:

  • 自动排序特性;
  • 迭代器遍历;
  • 不能通过迭代器修改key,但可以修改data
  • insert调用底层红黑树的:insert_unique()insert_equal()

map中的定义:key定义为const,map的两个模板类型定义为pair

[]插入方式是map独有的

hashtable

底层实现:

  1. 链地址法(seperate chaining)
  2. 当链表(篮子/桶bucket)太长(元素个数超过链表个数):rehashing,即增加链表个数(GNU是选取2倍篮子个数附近的质数)
  3. 重新计算每个元素的位置

关于hashtable源码:

  1. 模板参数HashFcn:计算哈希值;ExtractKey:取出key(红黑树中也有类似结构);EqualKey:比较大小的函数对象
  2. hashtable的data大小:private部分 (1+1+1+4+0+12 = 19,再经过内存对齐,20Bytes);
  3. 关于node:每个篮子中的节点struct
  4. 迭代器:cur指向某一个篮子中的节点;ht: 指向hashtable本身(要确保寻找遍历时能找到下一个篮子)

关于视频中hashtable测试

  • hash<const char*>:为对象元素生成hash值(配合视频内容和《C++Primer》P624第16.5节模板特例化)
  • 提供给EqualKey函数对象必须返回bool值(也是为什么提供eqstr的原因)
  • 求余运算最后都归结为一个函数bkt_num_key

视频中说标准库没有hash<std::string>,但是《C++Primer》P396提到可以对内置类型、string、智能指针直接调用hash

hash set/hash multiset/hash map/ hash multimap

c++11后的叫法:hash_xxx —> unordered_xxx

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jedis(一)与Redis的关系

一、Jedis介绍&#xff1a; 1、背景&#xff1a; Jedis是基于Java语言的Redis的客户端&#xff0c;Jedis Java Redis。Redis不仅可以使用命令来操作&#xff0c;现在基本上主流的语言都有API支持&#xff0c;比如Java、C#、C、PHP、Node.js、Go等。在官方网站里有一些Java的…

多维时序 | Matlab实现GWO-TCN-Multihead-Attention灰狼算法优化时间卷积网络结合多头注意力机制多变量时间序列预测

多维时序 | Matlab实现GWO-TCN-Multihead-Attention灰狼算法优化时间卷积网络结合多头注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现GWO-TCN-Multihead-Attention灰狼算法优化时间卷积网络结合多头注意力机制多变量时间序列预测效果一览基本介绍程序设计参考资料 效…

如何自己制作一个属于自己的小程序?

在这个数字化时代&#xff0c;小程序已经成为了我们生活中不可或缺的一部分。它们方便快捷&#xff0c;无需下载安装&#xff0c;扫一扫就能使用。如果你想拥有一个属于自己的小程序&#xff0c;不论是为了个人兴趣&#xff0c;还是商业用途&#xff0c;都可以通过编程或者使用…

VisualODX——ODX数据自动转换工具 加快开发进度

在创建ODX数据库的过程中&#xff0c;我们需要录入大量的数据以及应对多种数据格式。这不仅费时费力&#xff0c;而且还需很高的人力成本&#xff0c;且其错误率也非常高&#xff0c;从而导致开发速度缓慢、效率低下。基于多年的汽车行业诊断经验&#xff0c;我们开发了VisualO…

SpringBoot+Vue充电桩管理系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1. 分页获取预约数据代码2.保存预约信息代码3.修改订单状态代码 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SpringBootVue框架开发的充电桩管理系统。首先&…

【面试突击】微信亿级朋友圈的社交系统设计

微信亿级朋友圈的社交系统设计 先来说一下业务需求吧&#xff1a; 每个用户可以发朋友圈&#xff0c;可以点赞&#xff0c;评论可以设置权限&#xff0c;不看某些人朋友圈、不让某些人看你的朋友圈可以刷朋友圈中其他人的动态 对于这样的系统设计&#xff0c;主要从业务来考虑…

行测-判断:3.定义判断

行测-判断&#xff1a;3.定义判断 每道题先给出一个概念的定义&#xff0c;然后分别列出四种情况&#xff0c;要求报考者严格依据定义选出一个最符合或者最不符合该定义的答案。 A 1. 读得准 1.1 关键词&#xff08;主体&#xff0c;客体&#xff09; A B C&#xff0c;C选项…

2024年护眼台灯选购指南▏好视力、书客、欧普值得购买吗?

最近&#xff0c;护眼台灯备受关注&#xff0c;许多博主纷纷推崇。考虑到孩子即将放寒假&#xff0c;市场上的产品琳琅满目&#xff0c;因此我决定认真研究一番&#xff0c;辨别其中的劣质和精品。我选择了市场口碑较好的三款产品&#xff0c;进行了深入评估&#xff0c;主要从…

Tuya MiniApp 设计指南

一. 简介 小程序以其轻量、便捷的特性&#xff0c;在移动端 App 中被越来越广泛地使用。Tuya 作为物联网生态的头部 App 企业之一&#xff0c;开放 Tuya MiniApp 开发能力&#xff0c;以帮助开发者更好地服务用户。 对于开发者&#xff0c;Tuya MiniApp 以全新的开放模式&…

【Linux】文件周边001之系统文件IO

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.C语言文件IO 1.1…

二维码登录实现流程

二维码登录实现 如何实现登录&#xff1f; 二维码登录本质上也是一种登录认证方式。既然是登录认证&#xff0c;要做的也就两件事情&#xff01; 告诉系统我是谁向系统证明我是谁 比如账号密码登录&#xff0c;账号就是告诉系统我是谁&#xff0c; 密码就是向系统证明我是谁…

2023年第十六届中国系统架构师大会(SACC2023):核心内容与学习收获(附大会核心PPT下载)

大会以“数字转型 架构演进”为主题&#xff0c;聚焦系统架构在数字化转型中的演进和应用。 与往届相比&#xff0c;本届大会最大的变化是从原来的大会演讲模式变革为专题研讨会模式。专题研讨会主题内容紧扣行业落地实践痛点与难点&#xff0c;多角度聚焦行业的架构演进之路。…

RabbitMQ进阶篇【理解➕应用】

&#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于RabbitMQ的相关操作吧 目录 &#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 一.什么是交换机 1.概念释义 2.例…

揭秘亚信安慧AntDB15年平稳运行的升级改造经验

亚信安慧AntDB是一款备受认可的国产化数据库系统&#xff0c;它在国内市场中积累了丰富的升级改造经验。光是大的版本升级就已经实现了8次&#xff0c;让AntDB持续保持了15年的平稳运行。本文将深入探索AntDB的升级改造之路&#xff0c;揭示背后的细节。 AntDB作为一款自主研发…

k8s图形化管理工具rancher

Rancher和K8s的关系&#xff0c;Rancher和K8s区别对比。简单来说&#xff0c;K8s&#xff08;Kubernetes&#xff09;为企业提供了一种一致的方式来管理任何计算基础架构&#xff0c;Rancher则是用于管理位于任何位置的Kubernetes集群的完整平台。如果用户是自己手动部署K8s集群…

java web mvc-08-Grails 入门介绍

拓展阅读 Spring Web MVC-00-重学 mvc mvc-01-Model-View-Controller 概览 web mvc-03-JFinal web mvc-04-Apache Wicket web mvc-05-JSF JavaServer Faces web mvc-06-play framework intro web mvc-07-Vaadin web mvc-08-Grails 开源 The jdbc pool for java.(java …

2024年,AIGC赛道专利文献和软著大全

一、周红伟-深度学习国际发明专利 深度学习国际发明专利 基于深度学习的图像检索方法及装置&#xff0c;专利公开公告号&#xff1a;CN107368614A。专利类型&#xff1a;发明公布。发明人&#xff1a;周红伟;李凯;任伟;李庆;郭奇杰;周杨;刘川郁 二、机器学习算法发表文献 Simul…

多窗口大小和Ticker分组的Pandas滚动平均值

最近一个学弟在在进行数据分析时&#xff0c;经常需要计算不同时间窗口的滚动平均线。当数据是多维度的&#xff0c;比如包含多个股票或商品的每日价格时&#xff0c;我们可能需要为每个维度计算滚动平均线。然而&#xff0c;如果我们使用传统的groupby和apply方法&#xff0c;…

Pycharm运行提示(运行‘Python测试(00.py内)‘(u)

为什么有时候我在pycharm中运行代码会出现图片中的问题&#xff1f; 我们该如何改过来&#xff1f; 很简单 点击文件-设置 点击Python集成工具&#xff0c;在默认测试运行程序里修改为Unittest即可 再次运行代码就会显示正常的运行 你的pycharm可能是英文 如何英文变中文&…

第二证券:A股将迎“更加有力有效措施”

2024年开年以来&#xff0c;A股商场接连弱势格局&#xff0c;上证指数接连将2900点、2800点整数关口击穿。就在出资者缺少决心之际&#xff0c;商场总算迎来方针暖意。1月22日举行的国务院常务会议提出&#xff0c;要采纳愈加有力有用办法&#xff0c;促进本钱商场平稳健康开展…