
STL源码剖析
文章平均质量分 93
斯塔克家的真维斯
这个作者很懒,什么都没留下…
展开
-
【STL源码剖析】总结笔记(12):仿函数(Functors)与适配器(Adapter)
00 写在前面仿函数(functors)和适配器(adapter)就到了整个STL的最后部分。虽然这两部分内容不是很多,可以放在一起说。但作为STL六大部件中的两大部件,这两者还是有很多设计的精华在里面,值得我们学习。这也是【STL源码剖析】总结笔记的最后一篇。01 仿函数(Functors)仿函数的由来仿函数,顾名思义,就是类似函数的一种东西。在讨论仿函数之前,我们来看看它是如何产生的。在前面我们见识了很多算法,算法大都提供一个默认版本,但如果用户想根据不同的应用场景对算法进行变换,也是原创 2022-02-13 19:00:06 · 551 阅读 · 0 评论 -
【STL源码剖析】总结笔记(11):算法(algorithm)初识
00 写在前面算法,本质上就是解决问题的方法。我们经常见面的数据结构和算法系列,其实数据结构就是我们所说的STL中的容器,而算法就是解决各类问题的方法。在STL中说算法,更侧重的是算法的实现剖析而不是用法,这也是和课堂中的算法最重要的区别。在本系列的开始时,我们就有谈到过算法,我们说算法需要处理容器中的数据,迭代器就是算法和数据之间的桥梁。【STL源码剖析】总结笔记(1):开篇1可以看出迭代器(iterator)在算法中扮演着重要的角色。迭代器中的iterator category对算法影响深原创 2022-01-28 17:10:10 · 1209 阅读 · 0 评论 -
【STL源码剖析】总结笔记(10):哈希表(hashtable)探究
00 写在前面平衡二叉搜索树中的RB-tree作为一种效率表现和复杂度很平衡的结构,一直被用作STL set和map的底层支持。【STL源码剖析】总结笔记(8):红黑树(RB-tree)探究【STL源码剖析】总结笔记(9):set/multiset与map/multimap而还有一种结构,哈希表(以下称hashtable),在数据具有足够的随机性时,也能够保持在插入删除等操作上的“常数平均时间”表现。也是unordered结构的基础。hashtable更多的是经验设计01 概述hasht原创 2021-11-30 19:55:51 · 948 阅读 · 0 评论 -
【STL源码剖析】总结笔记(9):set/multiset与map/multimap
00 写在前面【STL源码剖析】总结笔记(8):红黑树(RB-tree)探究这篇的内容在红黑树的基础上就显得简单很多了。set和map需要了解其结构,在实际使用STL过程中最好可以做到轻松使用。因为是红黑树作为底层,所以要注意元素是会自动排序的。01 set/multisetsetset的底层是依靠红黑树来支撑的,所以会根据元素的key自动排序。对于set来说,key就是value,而且set不允许两个元素有相同的key。同理,我们也不可以修改set的元素值,这一点可以从后面set的iter原创 2021-11-30 19:52:54 · 757 阅读 · 0 评论 -
【STL源码剖析】总结笔记(8):红黑树(RB-tree)探究
00 写在前面前面已经把序列式容器(sequence)看的差不多了,接下来我们来看看关联式容器(associative)。就像我们在第一篇中说的一样,关联式容器分为set和map两大类,以及他们对应的衍生体multiset和multimap,还有也可以被看作关联式容器的unordered类(也就是原来非标准的hashtable)【STL源码剖析】总结笔记(2):容器(containers)概览01 关联式容器关联式容器中每个元素都有一个key和一个value,当元素被插入到关联式容器中时,会根据原创 2021-11-22 19:08:20 · 316 阅读 · 0 评论 -
【STL源码剖析】总结笔记(7):巧妙的deque
00 写在前面【STL源码剖析】总结笔记(6):iterator的设计与神奇的traits在掌握了迭代器的基本设计原理之后,我们就可以来看剩下的序列式容器的实现了。这时我们可以把注意力更多地集中在每一个容器本身的设计上。01 概述deque是一种双向开口的连续线性空间,也就是可以在头尾两端进行插入和删除操作。我们知道vector是单向开口的连续线性空间,在空间不足的时候需要另寻更大的空间并进行移植。为什么说deque巧妙呢,因为deque没有容量的概念,可以动态地增加空间。但是这种连续其实只是原创 2021-11-09 20:47:20 · 515 阅读 · 0 评论 -
【STL源码剖析】总结笔记(6):iterator的设计与神奇的traits
【STL源码剖析】总结笔记(6):iterator的设计与神奇的traits00 写在前面上次我们从list入手,说明了list的iterator在实现过程中的巧妙之处。link而这也是iterator在设计时的关键所在。01 iterator和traitsiterator是一种行为类似指针的对象,我们在了解list中iterator的实现过程中就会发现,想要设计list的iterator,就需要对list的实现结构非常熟悉。所以就把list iterator的开发工作交给了list的设计者,这原创 2021-11-03 19:14:02 · 249 阅读 · 0 评论 -
【STL源码剖析】总结笔记(5):认识迭代器的好帮手--list
00 写在前面说完vector,也了解了分配器(alloctor),接下来我们说说比较具有代表性的容器list。【STL源码剖析】总结笔记(3):vector初识【STL源码剖析】总结笔记(4):幕后功臣–分配器(allocator)为什么说具有代表性呢,因为list的空间不再连续,对空间的使用也更加精准。学习list也是帮助我们打开迭代器大门的第一步。01 概述list和vector是我们平时最常使用的容器。list就是链表,而且根据前置知识我们知道list是一个双向链表。list的节原创 2021-10-31 18:13:47 · 231 阅读 · 0 评论 -
【STL源码剖析】总结笔记(4):幕后功臣--分配器(allocator)
00 写在前面【STL代码剖析】总结笔记(3):vector初识在前面对于vector的分析中,我们遇到了allocatortemplate<class T,class Alloc=alloc>分配器是贯穿所有容器的存在,即使我们在使用各个容器时并不会用到它,但在背后的空间配置都是分配器的功劳。这次让我们读懂allocator的原理,帮助我们更好地理解STL。01 malloc()所有的分配在最终都会走到malloc()在c++的层面上也就是operator new(),原创 2021-10-28 19:02:15 · 489 阅读 · 0 评论 -
【STL源码剖析】总结笔记(3):vector初识
00 写在前面vector是我们在学习c++过程中最早接触也是比较常用的容器之一,从vector入手可以更加容易地理解STL的组织架构。这里我们侧重于vector的内部结构,而vector提供的接口操作不是我们的重点,使用方法可以参考cppreference。01 概述array我们经常使用,但它是静态空间,不能做到动态分配内存。大小在一开始就已经固定了。vector和array很相似,区别在于vector是动态空间,它的内部机制会自行扩充空间以容纳新元素。也不需要像array一样在使用大空间前申原创 2021-10-26 19:58:15 · 546 阅读 · 0 评论 -
【STL源码剖析】总结笔记(2):容器(containers)概览
00 写在前面容器(containers)是STL的重要组成部分之一,也是非常值得我们深入研究的部分。各种vector、map、set的使用极大地提高了我们解决问题的效率。每个容器内部都有着其独特的实现方式以及一些需要我们了解的要点,这些会是文章中的侧重点。01 容器的结构与分类概述容器大致分为序列式容器(Sequence),关联式容器(Associative)和无序容器(Unordered),无序容器也可以归为关联式容器内。分类序列式容器(Sequence)array:数组,是原创 2021-10-22 17:47:38 · 367 阅读 · 0 评论 -
【STL源码剖析】总结笔记(1):开篇
00 写在前面STL作为C++标准库中的重要组成部分,在学习C++过程中非常重要。这个可以复用的组件库更像是一个包罗万象的“框架”。侯捷老师对于STL的了解之深也使我受益匪浅。而《STL源码剖析》这本书也是集精华于一体,深度探索了对于STL的各个部分。配合老师的视频食用极佳。从这篇开始,我想根据视频和书籍的主要内容做一些整理以及一些理解部分的记录。因为视频部分和书籍部分不完全重合,又是各有精华,所以十分值得去整合在一起理解学习。学习STL需要读者有一定的C++基础能力,且有一些使用STL的经验,这原创 2021-10-21 21:17:21 · 712 阅读 · 0 评论