STL源码剖析
如题
Jiu_R
coder
展开
-
STL源码剖析6大组件目录
空间配置器:容器:listvectordequeset,map,multiset,multimapunordered_set/map/multiset/multimap算法:迭代器:仿函数:适配器:无论下列哪种适配器,总体思路就是通过调用adapter class的构造函数的方式,将待改造的东西保存在adapter class的数据成员,然后当真正使用的时候,将数据成员加以改造使用;① 容器适配器:stack,queuestack,queue内部有一个数据成员默认..原创 2021-03-10 20:07:36 · 92 阅读 · 0 评论 -
type_traits
跟iterator_traits同理,包含一些对于某种类型的默认构造函数,拷贝构造函数,析构函数等等是否重要的typedef,算法会不断的根据该类型的特性(即哪些重要不能省略,而哪些不重要可以不做)选择最佳的执行策略;若自己写了一个新class,要想使用算法处理这种类型对象时获得最佳性能,可以自己手写一个这种类型的特化版本,但C++11提供了很多萃取机,如下图所示,可以得到任意类型的各种信息,就无需手写特化版本了,目的都是为了更好的处理该类型;type_traits的实现:如上图的很多萃取机,都是对.原创 2021-03-10 19:02:09 · 116 阅读 · 0 评论 -
迭代器适配器
reverse_iterator:如下图,end()和rbegin()两个迭代器内部的指针起始是一样的,区别在于方向不同,导致取的值不同;因此通过调用reverse_iterator的构造函数,将正向迭代器保存到cunrrent中,当真正调用*,++等等成员函数时,对保存的current加以改造使用方式:vector<int> v;...v.rbegin(); //就会得到v.end()的逆行迭代器,对rbegin()进行操作时,实际底层是在v.end()(即current)的.原创 2021-03-10 16:00:32 · 123 阅读 · 0 评论 -
仿函数适配器
访函数可适配的条件:继承自unary_function或binary_function,这样这个访函数就有了关于参数和返回值的typedef,当通过仿函数adapter对该仿函数进行改造时,就能正确的回答adapter所需的typedef;同时仿函数适配器也要根据自己接受的参数数量继承unary_function或binary_function,用于支持多层的改造;仿函数adapter://bind2nd只是将待改造的仿函数less<int>()和40保存到binder2nd的数据成员.原创 2021-03-10 11:05:33 · 199 阅读 · 0 评论 -
iterator_category
结论:通过不断检查传入参数的具体类型,去尽可能调用最符合的特化版本,去执行最快性能最高的路线;STL的迭代器C++为STL容器提供了5中类型的迭代器:之所以设计为继承的关系,例如随机访问迭代器也是一种双向迭代器,并且增加了+,-,+=,-=等操作来实现随机访问这种特性,这也符合C++中public继承代表的"is a"的观念;很多算法都和Iterator_traits结合起来使用,如下图,distance用于求两个迭代器之间的距离,实际操作由__distance完成,根据传入的迭代器类..原创 2021-03-09 22:25:25 · 501 阅读 · 0 评论 -
hashtable
每个元素的key经过hashfuntion映射为一个下标,%桶子个数得到hashcode即应放的位置,当发生哈希碰撞时,① 线性/二次探测 ② 开链法;hashfunction:SGI STL为数值相关的元素类型(例如char,int,long,char*等)提供了篇特化版本的hashfunciton,实际就是直接返回其ASCII,但没有为其它string,folat等等类型提供hashfunciton,因此需要自己手动提供;总之hashfunction的目的就是将元素值算出一个尽可能乱的hash..原创 2021-03-09 20:20:01 · 73 阅读 · 0 评论 -
RB_tree
是一种平衡二叉搜索树:① 平衡:为了防止树的某一侧太偏 ② 搜索:通过begin()迭代器不断++,就可以遍历整棵二叉树,相当于中序遍历,自然也可以指定排序规则,这样就按照排序规则遍历整棵树RB_tree提供迭代器,但RB_tree本身提供的迭代器并不限制做修改动作,而以rb_tree为底层结构的容器通过某些技巧限制了修改key的动作:map,multimap:为了防止修改key值,但可以修改value值,因此在声明value_type类型时typedef pair<const Key, T&.原创 2021-03-09 18:46:46 · 105 阅读 · 0 评论 -
stack,queue
容器adaptor:几乎所有功能都是转调用底层的deque实现的;当然不一定非要是deque,只要选择的容器可以提供stack和deque所需的接口函数即可stack和queue可使用list,deque作底层容器;queue不能使用vector,因为vector不提供pop_front,实际queue只要不使用pop,也可以用vector作底层容器,因为对于这些模板class来说,只有调用到对应的成员函数,编译器才会检查该调用是否合法;stack和deque均不允许遍历,因此不提供迭代器:因.原创 2021-03-09 16:53:10 · 52 阅读 · 0 评论 -
deque
deque特点:① 分段连续 ② 双向均可增删deque的结构:一个中控器vector,是一个指针数组,每个指针指向一块buffer,从中间往两边用,用于实现双端增删的效果;deque有四个数据成员:①两个迭代器(即begin和end返回的迭代器,分别指向首元素和尾后位置)②一个指向中控器的指针map(用vector实现的)中控器的大小:最少8块buffer,且从中往两边用中控器的扩容:跟vector一样,2倍扩容; 且根据左侧满还是右侧满,说明对应方向的插入需求更大,则扩容之后对应这边会多.原创 2021-03-09 16:36:00 · 99 阅读 · 0 评论 -
vector
vector有三个指针数据成员:start,finish,end_of_storage,分别控制vector的头,size,capacity的位置;扩容机制:①insert_aux扩容 ②将插入点之前的元素拷贝过去,添加新元素,再将插入点之后的元素拷贝过去 ③析构旧vector的所有元素并释放内存当调用push_back,inset等添加元素时,若当前vector已无备用空间,就通过insert_aux扩容:1.计算所需大小 :旧vector大小为0,就需要1个元素大小的空间;否则,就需要旧vect.原创 2021-03-09 11:08:18 · 169 阅读 · 0 评论 -
list
list的结构是一个双向循环链表,且在尾节点后添加了一个虚拟节点,是为了更好的表示 [ ) 的迭代器范围,且方便对容器进行各种操作;但list只有一个数据成员:指向虚拟节点的迭代器节点结构:数据 + 两个指针(分别指向前驱和后继)迭代器结构:内含一个指向节点的指针;为了符合list的结构,重载了++,–,*,->;提供了5种算法所需类型的typedef,和iterator_traits结合起来使用...原创 2021-03-09 10:30:05 · 56 阅读 · 0 评论 -
萃取机:iterator_traits
traits有很多种:type traits,iterator traits,char traits,alloctor traits,array traits,下面以iterator_traits举例:STL的每种容器的迭代器都包含5个typedef,以便算法使用,下面以value_type举例。当一个算法需要知道 I 的value_type时:template<typanema I,...>void algorithm { //例如I是list_iterator class,而list原创 2021-03-09 09:58:19 · 184 阅读 · 0 评论