STL源码剖析

STL源码剖析

继续回顾

第二讲 认识c++标准库

1 oop vs GP

OOP:类中将data和methods放在一起

GP:data和methods分开

GP的优势如下:闭门造车

在这里插入图片描述

算法的本质

字符串默认的比大小就是首字母谁的位置靠后,绿色的strlonger是比较的方式。
在这里插入图片描述

2 源码之前需了解的基础

不是所有操作符都可以重载,例如::等

操作符重载可以写在类里,也可以写成全局函数

3 分配器 allocators

功能:动态空间配置、内存管理、内存释放

分配器的效率影响容器的效率

在xmemory头文件下

其中alloctor() 就是建立一个临时对象

调用allocate就是分配内存,实际是调用operator new(),而operator new()其实就是调用malloc()

调用deallocate就是释放内存,实际就是调用operator delete(),然后又在调用free

在这里插入图片描述

4 容器 结构性分类

在这里插入图片描述

5 深度探索list

  • 由于list是双向链表,list每存储一个数据其实是用到了一个类指针_list_node,其中有两个指向前后的两个指针,和一个T类型的数据。
  • 另外,除array、vector这些简单的容器的iterator可以++、–直接指向下一个数据,其他容器中的iterator基本都是类才可以设定这样的操作,因为list每个节点的内存都不是连续的,必须用到智能指针(itrator),也就是类指针去模拟正常指针的用法,故要大量用到操作符重载

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kHCPbK2M-1655994391869)(C:\Users\Kyros\AppData\Roaming\Typora\typora-user-images\image-20220208161111836.png)]

一个容器的迭代器名字是类似_list_intrator。其中基本都有5个typedef,会有一大组的操作符重载

在这里插入图片描述

()的是前置++,(int)的是后置++,其中后置的还需要调用前置的。其中next是存储下一个节点prev地址,当++操作后,迭代器就移到了下一个节点

  • 链表里的pushback,pushfront都是调用insert. popback、pop_front、remove都是调用erase。
  • splice是链表接合操作,提供了很多公共接口,可以把某个值接过去,也可以把一段、另一个list接过去。底层都是调用的transfer,只是各个节点之间指针的操作变化。
  • list不接受STL的排序算法,因为只支持随机迭代器,list只是双向迭代器

在这里插入图片描述

6 iterator所遵循的原则

iterator必须提供5种 associated types, 其中的(3),(4)从来没被用到过

iterator_category是看出这个迭代器的性质,是可以++ --还是可以跳着+,跳着-

value_type是指迭代器指的数据的类型

difference_type是两个迭代器之间的距离

算法和迭代器交互的方法是:算法提出问题,需要迭代器的什么属性,然后迭代器提供,便于算法进行操作数据

在这里插入图片描述

接上面的问题:当iterator不是类的时候,提供一个中间层去选择,即iterator_traits(迭代器萃取机)区分是类迭代器还是非类迭代器,用的接收变量的偏特化性质区分是哪个类

在这里插入图片描述
在这里插入图片描述

7 深度探索vector

其内部为:

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xw5VF3Yg-1655994391871)(C:\Users\Kyros\AppData\Roaming\Typora\typora-user-images\image-20220218154118078.png)]

新的len=2*old_size

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5FNK9zDB-1655994391872)(C:\Users\Kyros\AppData\Roaming\Typora\typora-user-images\image-20220218154642369.png)]

由于vector是连续空间,故它的迭代器不是类,就是一个指针

看传入iterator_traits是什么,T*的话则iterator就是一个普通的指针(iterator=T *),传入 I 的话则iterator是一个类的指针,智能指针

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kzSAkQxM-1655994391872)(C:\Users\Kyros\AppData\Roaming\Typora\typora-user-images\image-20220218160022487.png)]
复盘到vector,明日继续!!!gogo加油

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值