c++容器类模板的相关源码分析
c++容器类模板的相关源码分析
zhangzhangkeji
这个作者很懒,什么都没留下…
展开
-
vs2019 STL库里 判断函数类型的模板 is_function_v 与 is_const_v
经简单代码测试后,得出 vs2019 的 c++ 编译器 和 其 STL 库的观点与设计:is_const_v 用来判断类型 T 内是否含有 const 修饰符,含有 const 则返回真。,可以被 is_function_v 用来筛选函数类型。给函数类型加上 const 修饰,感觉语义上无法理解,但编译并不报错。所以 STL 库对函数类型的筛选不是通过定义,是通过间接的排除法。原创 2024-05-11 19:07:22 · 202 阅读 · 0 评论 -
vs2019 里 C++ 20规范的 string 类的源码注释
(1)读源码,可以让我们更好的使用这个类,掌握这个类,知道咱们使用了库代码以后,程序大致具体是怎么执行的。而不用担心程序出不知名的意外的问题。也便于随后的代码调试。string 类实际是 库中 basic_string 模板的实例化后的类。string 也相当于容器,存储字符串的容器,跟别的容器 vector ,list 等差不多。关于容器的增删改查,这些成员函数,该有的都有。只是具体实现不大一样。原创 2024-05-10 20:45:25 · 289 阅读 · 0 评论 -
关于 vs2019 c++ 20规范,STL 库提供的标准分配器 alloctor 及其 traits 及涉及分配器交换的全局函数 _Pocs
对于两个 list 链表,使用的默认的分配器将都是 STL 中的类, allocator。意思是不支持对象交换。相当于 两个 list 对象交换时不必交换分配器,因为它们使用的是相同的分配器。(1) 我们写 c++ 代码,使用 STL 库中的模板,很少自己写对象的分配器。研究 STL 中的分配器也可以为咱们自己写分配器提供参考。咱们会遇到这样的场景,例如交换两个容器对象: list a ,b;其中使用了全局函数 _Pocs ,其进行俩 list 对象的分配器的交换。可见,跟咱们的预想是一致的。原创 2024-05-10 03:17:48 · 312 阅读 · 0 评论 -
关于vs2019 c++ STL 中容器的迭代器的 -> 运算符的使用,以 list 双向链表为例
对于 STL 中提供的迭代器,提供了类似于指针的功能。对迭代器也可以使用 -> 运算符来访问容器中元素对象里的成员。可见 ,pointer_to 只是解析了其形参的内存地址。对于全局函数 addressof 就不再展开了,见名知意,就是求形参的地址。(1)如下的结构体 A ,若有指针 p = new A();则可以使用 p->m , p->n 解引用运算符。这也符合我们对指针的理解。只要通过指针拿到了对象的首地址,就可以用偏移量来访问类对象中的各个数据成员和函数。原创 2024-05-08 04:39:47 · 270 阅读 · 0 评论 -
关于c++ 中 string s { ‘a‘ , ‘b‘ , ‘c‘ , ‘d‘ } 的方式的构造过程
(1)这样的构造方式不常见,但也确实 STL 库提供了这样的构造函数。(2)以反汇编分析这行代码。原创 2024-05-07 23:30:56 · 192 阅读 · 0 评论 -
关于 c++的模板库中的数组模板 is_array_v的测试
如图,对于变量名 b ,使用 b 代表使用 b 中的值, 使用 &b 代表使用变量 b 的地址。对于数组名 a 而言,使用名称 a 代表使用 数组的起始地址,使用 &a 也是使用 数组的 起始地址。在监视窗口,c++ 编译器也是如此处理的。但 图中代码上还是有不同的效果。这里涉及了 c/c++ 里类型的语法定义:类型 B 视为数组,存储了三个 char 指针。类型 C 视为指针类型,指向具有三个 char 元素的数组。但可见 c++ 编译器,依然如咱们学习的知识:把数组名处理成了数组起始地址。原创 2024-05-05 15:32:13 · 202 阅读 · 0 评论 -
vs2019 cpp20规范 tuple源码注释
tuple 也是一个容器。之前的STL容器,都是只能存储一种数据类型。而 tuple 模板采用递归继承法,却可以 把不同的类型的数据,继承下来。主要还是完成对数据的保存和读取,不对数据进行深的加工。原创 2023-09-14 01:00:51 · 24 阅读 · 0 评论 -
vs2019 cpp 20规范 智能指针和STL常用容器类模板的源码注释,十几篇
【代码】vs2019 cpp 20规范 智能指针和STL常用容器类模板的源码注释,十几篇。原创 2023-09-12 16:29:57 · 40 阅读 · 0 评论 -
vs2019 cpp STL之源码分析<unoredered_set>
这个注释是在<unordered_map> 后面写的。应该先参考<unordered_map>。附上来,只是做了简单对比。原创 2023-09-12 16:05:57 · 56 阅读 · 0 评论 -
cpp20规范 vs2019 STL库 unordered_map源码分析
经过源代码查找,_Hasher = hash,和 _Keyeq = equal_to里都没有 is_transparent 的定义。而哈希时int 整数应该是最常用的情况。绿箭头1 处的模板类,继承了绿箭头2 , 绿箭头2 又继承了红框模板。但红框模板有一个泛化版本和一个特化版本,选择哪一个呢?所以应该是继承了泛化版本,就是透明的哈希容器。虽然,还不知道透明是啥意思。只是这个模板里强制了一个类型引用。(1) unordered_map 模板有如下的模板调用和包含关系。原创 2023-09-05 14:04:14 · 163 阅读 · 0 评论 -
c++ vs2019 cpp20 规范,set源码分析
是差异性的调用了两个不同模板中的同名函数_Kfn(),所以仍然可以获得树节点中的键值。维持红黑树主要的功能都在父类_Tree里了,比如节点的添加,删除,查找。无论树节点的插入和删除,都涉及对节点位置的查找。而后节点的插入与删除,是节点级别,与树节点中存储的数据类型就没有关系了。箭头3 , _Tree 引用了_Traits::value_type类型,并据此创建了set的节点类型_Node。set接受模板参数后,把参数传递给父类 _Tree,父类 又把模板实参传递给_Tset_traits,这是1。原创 2023-09-04 15:25:09 · 389 阅读 · 0 评论 -
c++ vs2019 cpp20规范的STL库的map与multimap源码分析
标准平衡二叉树,要求左右子树的高度差不超过1。红黑树只要求左右子树的高度差不超过一倍即可。兼顾了树平衡与效率。避免了AVL树的频繁调整树平衡。二叉树里有很多递归,但map实现上多了父指针,就用不上递归了,需要的时候,可以直接回溯。自己画的vs2019 的STl的map的数据结构。从网上找图,暂时没找到。b站 的“可雷曼土”大师,讲红黑树的理论讲的很透彻,再结合看代码,才可以看懂。map就是一个红黑树。原创 2023-09-03 16:33:26 · 190 阅读 · 0 评论 -
vs2019 ,c++的STD库全局函数 _Pocma 与 _Swap_adl 的思考
根据 c++ 语法。这非常神奇,也验证了咱们一丝不苟的治学精神,和融会贯通的学习方法,和我们王建伟老师的伟大教学功绩。王老师教的好,才有咱们学的好。在函数_Move_assign 中,实参是对两个分配器的引用,咱们c++ 里,STL 提供了一个标准分配器,就是allocator模板类。(1)在阅读vs2019上的 STL库的 map 源码时,遇到了这个函数,之前,在别的源码中也经常出现这个函数。(3)allocator模板类的定义如下图,这里对模板类中一些不重要的函数修饰符去掉了,以突出重点,方便阅读。原创 2023-08-27 01:13:09 · 241 阅读 · 0 评论 -
c++,标准库std中全局函数 _Destroy_in_place(...)的分析
可见,当形参类型是指针时,该函数什么也没做。或者说指针类型是c++内置类型,c++编译器给指针类型规定的构造和析构函数中,就是没有任何代码,空函数体的。这个奇怪现象,有别于真正的数据类型。可见,传入形参为某种类型的引用,该函数会执行形参的析构函数,还可以有效解决数组的连续析构。可见,当该函数的形参是指针类型,没有析构和构造函数,该函数不执行具体的内容,什么也不做。(2)疑问是,若形参是指针类型,该函数怎么执行,指针类型是没有析构函数的。如此,就解开了对指针应用该函数的疑惑,相当于什么也没做。原创 2023-08-25 01:36:10 · 233 阅读 · 0 评论 -
c++ ,vs2019, cpp20规范之 forward_list 源码分析
通过阅读源码可知,该单向链表不像list双向链表那样有专门的前导节点。即list._Mypair._Myval2._head._next才指向第一个有效数据节点。而 forward_list ._Mypair._Myval2._head 已经指向了有效数据节点。原因就在于复杂巧妙的类型转换。这里的源代码里也显示了,c++类型转换的强大。这还是俺学习课本以来,第一次遇到如此强大的类型转换应用。特单独强调明确一下。对箭头所指的注释进行展开,如下。原创 2023-07-31 02:04:55 · 112 阅读 · 0 评论 -
list源码分析,基于c++ 和vs2019,cpp20标准
list源码分析,基于c++ 和vs2019,cpp20标准。结构确实如图,双向环形链表。原创 2023-07-27 20:59:33 · 209 阅读 · 0 评论 -
stack源码分析 c++ vs2019 cpp20
stack源码分析 c++ vs2019 cpp20。原创 2023-07-19 22:46:02 · 35 阅读 · 0 评论 -
queue源码分析 c++ vs2019 cpp20 ,包含priority_queue ,未分析,附带上了
queue源码分析,代码中还包含priority_queue ,未分析,附带上了。原创 2023-07-19 19:23:16 · 46 阅读 · 0 评论 -
deque源码分析和类move_iterator,c++的vs2019 ,cpp20语法
deque源码分析和类move_iterator,c++的vs2019 ,cpp20语法。原创 2023-07-19 14:36:18 · 35 阅读 · 0 评论 -
分析_Iterator_base12与_Container_base12
分析_Iterator_base12与_Container_base12。原创 2023-07-14 14:07:32 · 138 阅读 · 0 评论 -
分析_Container_proxy_ptr与_Container_proxy_ptr12
分析_Container_proxy_ptr与_Container_proxy_ptr12。原创 2023-07-14 14:05:29 · 59 阅读 · 0 评论 -
initializer_list分析
initializer_list分析。原创 2023-07-14 14:02:56 · 37 阅读 · 0 评论 -
_Compressed_pair源码分析c++
Compressed_pair源码分析c++原创 2023-07-14 13:57:48 · 59 阅读 · 0 评论 -
c++系统默认分配器 allocate 的源码分析
核心就是默认的 malloc 和 free 函数。原创 2023-07-04 22:59:41 · 36 阅读 · 0 评论 -
c++ 的array源码分析和reverse_iterator和_Array_const_iterator类
最近要学习array这个容器。对容器的相关源码进行了分析。虽然没有学习迭代器,但对array 使用的迭代器也进行了源码阅读。感觉逆序迭代器的底层还是依赖一个正向迭代器。等听了迭代器的课再说。原创 2023-07-04 00:15:35 · 66 阅读 · 0 评论 -
泛型类vector<T>源码分析
通过把调用链上的函数定义,全部注释过来,弄懂了vector 的设计思路。vector原头文件总共3000 行。去掉了vector ,源代码文件因为带有大量的注释,也达到了8000 行。原创 2023-07-14 00:14:19 · 40 阅读 · 0 评论