STL第二讲

news2024/11/18 4:27:33

第二讲

视频标准库源码版本: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.coloradmin.cn/o/1407254.html

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

相关文章

C语言快速排序(非递归)图文详解

前言&#xff1a; 上一期分析了快速排序的三种写法&#xff0c;这三种写法有一个相同点&#xff0c;都是采用递归形式来实现的&#xff0c;那么有没有非递归的方法实现呢&#xff1f;答案是当然有&#xff0c;用非递归的方法实现快速排序&#xff0c;其实可以借助数据结构中的栈…

C++笔记(二)

函数的默认参数 如果我们自己传入数据&#xff0c;就用自己的数据&#xff0c;如果没有&#xff0c;就用默认值 语法&#xff1a; 返回值类型 函数名&#xff08;形参默认值&#xff09;{} int func&#xff08;int a&#xff0c;int b20&#xff0c;int c30&#xff09;{} …

HTTP与HTTPS的工作流程

HTTP与HTTPS的工作流程 http知识点回顾1、HTTP访问的过程2、HTTP常见状态码3、HTTP 协议一共五大特点 https的工作流程1、对称加密2、非对称加密3、https工作流程 http知识点回顾 1、HTTP访问的过程 &#xff08;1&#xff09;解析url&#xff0c;获取 url 中包含的域名&…

Unity3D Pico VR 手势识别物体交互 适配 MRTK3

当前Pico已经支持手势识别了&#xff0c;但是提供的PICO Unity Integration SDK 中是没有手势和物体交互的功能&#xff0c;Unity XR Interaction Toolkit提供的手势识别物体交互对 Quest适配的挺好的&#xff0c;Pico 当前只能用指尖点触还不能对物体进行抓握以及手势控制射线…

仅使用 Python 创建的 Web 应用程序(前端版本)第05章_共通代码

前面介绍了很多,但是让我们从本章开始实现 WTS。 在本章中,我们将实现所有页面的公共部分:SessionManager、MockDB、Model 和 Application。 SessionManger 与 Streamlit 会话交互。 在WTS中,我们的目标是使代码清晰,SessionManager负责读写st.session_state数据。 Mock…

数据结构:3_栈和队列

栈和队列 一.栈 1. 栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。**进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。**栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#x…

【QML-Qt Design Studio】

QML编程指南 ■ Qt Design Studio &#xff08;Qt Quick UI设计工具&#xff09;■ 安装Qt Design Studio■ ■ Qt Design Studio &#xff08;Qt Quick UI设计工具&#xff09; Qt Design Studio是一个用于创建酷炫、优美UI的工具。 简单概括其功能就是让UI设计转换为qml&…

uniapp+vue3+ts--编写微信小程序对接e签宝签署时跳转刷脸效果(人脸识别)中间页代码

uniappvue3ts–编写微信小程序对接e签宝签署时跳转刷脸效果&#xff08;人脸识别&#xff09;中间页代码 e签宝内嵌H5方式集成签署页的文档说明&#xff1a;https://open.esign.cn/doc/opendoc/case3/ahb0sg 签署时跳转刷脸效果示意图&#xff1a; 1. 在文件夹新建一个文件&a…

java基础:有序数组中插入数字使其依然有序案例分析

问题目标是将用户输入的整数插入到一个已排序的数组中&#xff0c;以保持数组的有序性。 如何实现&#xff1f; 思路分析&#xff1a; 初始化已排序的数组&#xff1a;通过使用int[] arr {1, 2, 3, 4, 5, 6};语句创建一个已经排好序的数组。定义变量&#xff1a;index用于记…

2024年制造业展望

制造业是国民经济的主体&#xff0c;其重要性不言而喻。就2023年而言&#xff0c;制造业在技术创新、数字化转型和可持续发展方面都取得了重要的进展。以下是对于2024年制造业的发展进行的分析与预测。 1 保持业务平衡仍将是一项挑战 在过去的四年里&#xff0c;制造业高管人…

【IEEE会议征稿】2024年第九届智能计算与信号处理国际学术会议(ICSP 2024)

2024年第九届智能计算与信号处理国际学术会议&#xff08;ICSP 2024&#xff09; 2024年第八届智能计算与信号处理国际学术会议&#xff08;ICSP 2024&#xff09;将在西安举行&#xff0c; 会期是2024年4月19-21日&#xff0c; 为期三天, 会议由西安科技大学主办。 欢迎参会&…

Django开发_17_表单类

一、介绍 为了简化前端form表单代码 二、步骤 &#xff08;一&#xff09;创建form.py 创建一个表单类 from django import formsclass RegisterForm(forms.Form):reg_name forms.CharField(max_length10, label用户名)reg_pwd forms.CharField(max_length20, label密码…

【Pandora Next Notebook】

系列文章目录 一是为了说一说这个项目&#xff0c;第二点是为了介绍一下如何使用大善人Cloudflare的功能来配合v0.5.0的新功能。它就是全代理ChatXXX账号注册流程。 文章目录 系列文章目录前言一、[GPT_BOT](https://chat.oaifree.com/)这次借着v0.5.0发布了一个好玩的功能&…

配网故障定位装置:实现高效故障排查的利器

在现代社会&#xff0c;电力系统的稳定运行对于国家经济和民生至关重要。然而&#xff0c;随着电力系统的不断发展&#xff0c;配网故障问题日益严重&#xff0c;给电力系统带来了巨大的安全隐患。为了解决这一问题&#xff0c;恒峰智慧科技研发了一种基于成熟的行波测距技术的…

Vue+OpenLayers7:html原生网页如何使用OpenLayers7地图

返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7 前言 尽管现在大部分网页都是使用Vue或者React开发了,但是还是有不少开发者使用的是网页原生html进行开发,或者是老项目维护的需要,所以为了照顾使用html原生网页的同学们,本章简单讲解一下如何使用原始html网页情况下…

1. Matplotlib的Figure基础概念

1. Matplotlib的Figure基础概念 一 **角色和作用**二 **类比&#xff1a;**三 **基本使用示例** Matplotlib是一个用于绘制二维图形的Python库&#xff0c;广泛应用于数据可视化领域。其灵活性和强大的功能使得用户能够轻松创建各种类型的图表&#xff0c;包括折线图、散点图、…

el-select选择之后值不显示在文本框的问题解决

问题场景如下图&#xff1a; 在el-collapse-item中使用子组件&#xff0c;子组件里是el-form-item代码。el-select在for循环中&#xff0c;可以有多个。 查了一下博客&#xff0c;有的说这种场景需要给el-select添加change事件&#xff0c;加上 this.$forceUpdate() 强制刷新即…

Spring Boot 中的外部化配置

Spring Boot 中的外部化配置 一、配置文件基础1.配置文件格式&#xff08;1&#xff09;YAML 基本语法规则&#xff08;2&#xff09;YAML 支持三种数据结构 2.application 文件3.application.properties 配置文件4.application.yml 配置文件5.Environment6.组织多文件7.多环境…

创新医疗服务:宠物在线问诊系统的搭建与应用

随着科技的不断进步&#xff0c;创新的医疗服务方式也日渐成为宠物主人关心爱宠健康的首选。本文将深入介绍如何搭建一套创新的宠物在线问诊系统&#xff0c;并展示其应用的技术代码。 1. 系统架构与技术选择 在开始搭建之前&#xff0c;我们需要设计系统的架构并选择合适的…

码农维权——案例分析之违法解除劳动合同(六)

目录 一、背景 二、案例分析&#xff1a;违法解除劳动合同 A、公司的主张 B、公司的主要证据&#xff08;公司单方面提交的&#xff0c;法院不一定认可采纳&#xff09; C、员工的质证/证据 D、判决结果 E、判决依据 三、写在最后 一、背景 当前互联网行业普遍以”变相…