
STL源码分析
文章平均质量分 57
Function_18
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
STL源码分析目录
SIG STL源码分析前言本专栏主要以STL源码剖析分析路线来分析SIGSTL3.0源码.整个模块准备对学习STL源码剖析之后做一个系统的总结, 这些都是我个人的理解, 如果分析有什么问题欢迎各位大佬们指出. 也很感谢作者以及网络中各个大佬的总结, 让我也能更容易更深刻的理解到STL强大和方便, 也让我对template感受深刻.以下是我自己对STL版块进行分析.总共分为六个版块 : 空...原创 2018-12-11 20:24:43 · 3523 阅读 · 0 评论 -
STL源码分析之RB-tree关联容器 上
前言本节将分析STL中难度很高的RB-tree, 如果对红黑树有所认识的那么分析起来的难度也就不是很大, 对红黑树没有太多了解的直接来分析的难度就非常的大了, 可以对红黑树有个了解红黑树之原理和算法详细介绍. 红黑树是很类似与AVL-tree的, 但是因为AVL-tree在插入,删除的操作做的实际操作很多, 综合而言计算机对内存的管理都采用平衡性相对AVL-tree较差一点的红黑树.RB-tr...原创 2018-12-06 18:52:59 · 861 阅读 · 0 评论 -
STL源码分析之slist有序容器 下
前言上节我们对slist的基本构成, 构造析构做了分析, 本节 我们就来分析关于slist的基本元素操作.slist分析基本属性信息slist是只有正向迭代, 所以只能直接获取头部的数据.template <class T, class Alloc = alloc>class slist{ ...private: slist& operator= (con...原创 2018-12-06 18:50:23 · 557 阅读 · 0 评论 -
STL源码分析之slist有序容器 上
前言不同于list是Forward Iterator类型的双向链表, slist是单向链表, 也是Bidirectional Iterator类型. slist主要耗费的空间小, 操作一些特定的操作更加的快, 同样类似与slist, 在执行插入和删除操作迭代器都不会像vector使迭代器失效. slist主要的问题在于它是单向的, 正向迭代器, 只有push_front, 没有push_back...原创 2018-12-05 22:51:49 · 506 阅读 · 0 评论 -
STL源码分析之priority_queue优先级队列
前言上一节分析heap其实就是为priority_queue做准备. priority_queue是一个优先级队列, 是带权值的. 支持插入和删除操作, 其只能从尾部插入,头部删除, 并且其顺序也并非是根据加入的顺序排列的. priority_queue因为也是队列的一种体现, 所以也就跟队列一样不能直接的遍历数组, 也就没有迭代器. priority_queue本身也不算是一个容器, 它是以v...原创 2018-12-05 22:44:38 · 828 阅读 · 0 评论 -
STL源码分析之heap大根堆
前言在分析本节之前你至少应该对堆排序有所了解, 大根堆, 小根堆等. 本节分析的heap就是堆排序, 严格意义上来讲heap并不是一个容器, 所以他没有实现自己的迭代器, 也就没有遍历操作, 它只是一种算法. 代码来自stl_heap.h.heap分析push插入元素插入函数是push_heap. heap只接受RandomAccessIterator类型的迭代器.注意, 在分析heap...原创 2018-12-05 22:39:24 · 875 阅读 · 0 评论 -
STL源码分析之stl_algo.h中的基本算法
前言上一节分析了stl_algo.h中的rotate函数实现, 本节我们继续分析该文件的中的其他基本算法, 这些算法功能实现看似很简单, 但是这些算法都能进行衍生, 用户自定义, 简单化了我们的部分编程, 直接使用无需再定义.基本算法for_each将[first, last) 范围的元素由传入仿函数(函数)进行处理, 最后返回仿函数(函数).template <class Inp...原创 2018-12-08 15:17:11 · 920 阅读 · 0 评论 -
STL源码分析之数值算法
前言本节所分析的算法是在stl_numeric.h中, 本节以源码 + 例子的形式一起分析这些实现的操作.数值算法分析accumulate要求传入两个InputIterator类型的迭代器和一个初始化值, 第二个版本还支持在传入一个仿函数或函数.// 版本一template <class InputIterator, class T>T accumulate(InputI...原创 2018-12-08 15:14:34 · 477 阅读 · 0 评论 -
STL源码分析之rotate算法
前言stl_algo.h文件中有很多的算法实现, 在这里STL分析中挑选几个函数进行分析, 其他的算法大家有兴趣可以自己看看, 本节分析stl_algo.h文件中的rotate算法. 该算法实现的功能是将[first, middle), [middle, last)两段区间的元素进行交换.rotate分析template <class ForwardIterator>inlin...原创 2018-12-08 15:11:11 · 694 阅读 · 0 评论 -
STL源码分析之copy算法
前言在前面分析顺序容器和关联容器时, 总会遇到copy这个函数, 当时并没有去分析这个函数, 毕竟都能知道他是什么功能, 本节就来揭开它面纱.copy分析copy函数源码在stl_algobase.h中, 该结构中还有很多其他的算法实现, 我只是从中挑选出了copy, 有兴趣可以自己看看里面的其他算法.copy同traits编程, 都对性能做了最优的优化, 能使用的memmove函数就使用...原创 2018-12-08 15:09:33 · 894 阅读 · 0 评论 -
STL源码分析之hash_multimap配接器
前言上节分析了hash_map知道它是不允许存在相同的键存在, 本节的hash_multimap就可以允许存在多个相同的键, 以hashtable为接口, 这里我就只分析与hash_map的不同点吧, 毕竟很多都是一样的了, 没有必要重复的分析相同的代码.insert最大的区别就在这里, hash_multimap 是以insert_equal为接口, 所以支持插入重复的键.#ifndef...原创 2018-12-08 15:08:07 · 513 阅读 · 0 评论 -
STL源码分析之hash_map配接器
前言hash_map是以hashtable为底层的配接器, 他与map的功能基本一样, 只是map是有序的将键值插入, 而hash_map则是无序的插入键值, 本节也简单对它做一个分析.hash_map分析类型定义#ifndef __STL_LIMITED_DEFAULT_TEMPLATEStemplate &lt;class Key, class T, class HashFcn = ...原创 2018-12-08 15:05:41 · 507 阅读 · 0 评论 -
STL源码分析RB-tree关联容器 下
前言上节我们分析了关于RB-tree的迭代器实现, 其中最重要的功能都会在rb-tree结构中调用. 本节我们就来分析RB-tree结构.再来复习一下红黑树的规则:每个节点的颜色是黑色或者红色根节点必须是黑色的每个叶节点(NULL)必须是黑色的如果节点是红色的, 则子节点必须是黑色的从节点到每个子孙节点的路径包括的黑色节点数目相同// 红黑定义typedef bool __r...原创 2018-12-06 18:55:17 · 502 阅读 · 0 评论 -
STL源码分析之set配接器
前言上面两节我们分析了RB-tree, 同时我们也知道了rb-tree的插入操作还分为可重复插入和不可重复插入(insert_unique). 本节分析set, 严格意义说set就是修改了底层容器接口的, 所以应该是配置器. set就是将RB-tree作为底层容器, 以insert_unique为核心的配接器.set操作下面是对set的构造和insert的简单操作, 这里重复插入one, 但...原创 2018-12-06 19:05:18 · 466 阅读 · 0 评论 -
template之类相关
前言前面两节主要分析了使用template的注意点以及非类型参数如何使用, 本节来探讨虚模板函数和模板拷贝构造函数.虚函数模板在我们使用模板从来都没有将虚函数与模板进行套用, 那么这两者能不能同时连用呢?这个直接来写代码验证才知道.class point{ public: template<class T> virtual T getX() { r...原创 2018-12-11 19:46:27 · 1130 阅读 · 0 评论 -
template之非类型模板参数
前言前一节分析了关于template的使用注意, 本节分析关于template非类型参数的使用, 非类型参数可能在有些人认为并没有太大作用, 但是既然C++规定有能这样使用就肯定有其意义, 这里就做一个浅析.非类型模板参数非类型参数, 可用在模板中自定义为整型类型, 指针或引用, 不能定义为浮点数等其他类型.非类型模板参数在编译期间就已经实例化, 所以其模板实参必须是常量表达式.temp...原创 2018-12-11 19:45:14 · 3887 阅读 · 0 评论 -
template之模板注意事项
前言在分析STL之前, 我们需要先对template做一个回忆, 可能我总结的内容你都会了, 也可能你没有了印象了, 但是我还是希望你先浏览一下template的用法. 毕竟STL全部都涉及到了模板, 而template是学习STL的基础.template使用template的使用大大提高了代码的复用性, 抽象性.类模板实例化时并不是每个成员函数都实例化了, 而是使用到了哪个成员函数, ...原创 2018-12-11 19:42:40 · 2319 阅读 · 1 评论 -
STL源码分析之配接器
前言本节分析STL组件之一的配接器, 配接器就像转接口一样, 将一个对class封装变成了另外一个功能的class, 这在前面分析容器的时候遇到过, 比如: map, set等, 都是修改底层接口形成另外一个功能的class.配接器可以应用于 : 仿函数, 迭代器, 容器.关于配接器应用于容器前面都分析过了, 接下来就分析部分应用于仿函数和迭代器的配接器吧.应用于迭代器STL实现了很多应...原创 2018-12-10 00:03:38 · 542 阅读 · 0 评论 -
STL源码之仿函数
前言本节将分析STL六部分之一的仿函数, 在前面分析容器以及算法的时候都有使用过仿函数, 在算法中我们还自定义过仿函数(函数对象), 就是使用struct或者class重载运算符, 就是行为类似于函数的对象.根据仿函数的操作数可分为 : 一元和二元仿函数.根据功能可分为 : 算术运算, 关系运算, 逻辑运算.仿函数与函数指针STL采用对象重载操作实现函数行为并没有直接定义函数...原创 2018-12-10 00:02:20 · 736 阅读 · 0 评论 -
STL源码分析之二分查找算法
前言前面我们分析了关于stl_algo.h中的基本算法, 本节也将继续分析该文件中的算法实现, 即二分查找.stl_algo.h提供了lower_bound和upper_bound两种查找, 前者是找出第一个满足条件的迭代器, 后者则是找出最后一个满足条件的迭代器, 两者结合就能知道该容器中重复的个数.二分查找分析lower_boundForwardIterator版本// 版本一...原创 2018-12-09 23:57:35 · 598 阅读 · 0 评论 -
STL源码分析之multimap配接器
前言前面我们分析了map, 知道map是不允许插入相同的键值的, 也不会保存第二次的数据, 而本节分析的multimap与map不同, 它允许多个重复的键值插入.mutimap操作int main(){ multimap&lt;string, int&gt; multi; // 这里重复插入了两个相同的键值 multi.insert(make_pair("one", 2));...原创 2018-12-06 20:16:45 · 439 阅读 · 0 评论 -
STL源码分析之multiset配接器
前言前面也分析过set, 并且set不能插入相同的键, 本节分析的multiset与set不同之处就是他允许插入相同的键.multiset操作int main(){ multiset<string> multi; // 允许重复插入键 multi.insert("zero"); multi.insert("zero"); multi.insert("one");...原创 2018-12-06 20:05:05 · 522 阅读 · 1 评论 -
STL源码分析之map配接器
前言上一节分析了pair结构, 正是为map分析做铺垫, map本身实现也不难, 其数据存储是pair, 存储结构是RB-tree, 即map也并不能说是关联容器, 而应该是配接器.map操作map的insert必须是以pair为存储结构, 当然也可以直接使用make_pair构造一个临时pair, 这个函数我们上节分析pair的时候讲过.int main(){ map<stri...原创 2018-12-06 19:08:51 · 451 阅读 · 0 评论 -
STL源码分析之pair结构体
前言前面在分析set, RB-tree都有在insert实现中出现pair, 下节分析map的时候更会经常出现pair, 所以打算在之前先对pair有个认识.pair是一个有两个变量的结构体, 即谁都可以直接调用它的变量, 毕竟struct默认权限都是public, 将两个变量用pair绑定在一起, 这就为map<T1, T2>提供的存储的基础.pair操作pair结构是在ma...原创 2018-12-06 19:07:12 · 991 阅读 · 0 评论 -
STL源码分析之hash_multiset配接器
前言上节分析了hash_set, 他与set有很多的相似之处, 键不能重复, 不能修改等, 本节分析的hash_multiset与multiset又有很多相似之处, 键值可以重复.hash_multiset分析同样也是以hashtable为底层的配接器.定义数据类型#ifndef __STL_LIMITED_DEFAULT_TEMPLATEStemplate <class Val...原创 2018-12-08 15:03:51 · 477 阅读 · 0 评论 -
STL源码分析之hash_set配接器
前言前面我们分析了hashtable, 后面的几节我们来分析其衍生出来的配接器, 本节分析的hash_set, 他与set最大的不同在与前者的元素是无序排列的, 后者是有序排列hash_set操作int main(){ __gnu_cxx::hash_set<const char *> h_set(1); h_set.insert("one"); h_set.insert...原创 2018-12-08 15:02:24 · 509 阅读 · 0 评论 -
STL源码分析之迭代器
前言迭代器是将算法和容器两个独立的泛型进行调和的一个接口. 使我们不需要关系中间的转化是怎么样的就都能直接使用迭代器进行数据访问. 而迭代器最重要的就是对operator *和operator->进行重载, 使它表现的像一个指针.类型迭代器根据移动特性和实施操作被分为5类input iterator(输入迭代器) : 迭代器所指的内容不能被修改, 只读且只能执行一次读操作.o...原创 2018-11-29 20:34:02 · 867 阅读 · 0 评论 -
STL源码分析之vector序列容器 下
前言前面两节我们分析了关于vector的push, pop, erase, 重载和vector的定义, 通过前面的分析都对vector的实现有所了解了, 这一节我们就来分析vector是怎么实现插入操作. 当数组的大小不足后insert又是怎么来处理的.插入实现insert为了接受不同的参数和参数个数, 所以定义了多个重载函数. 现在我们就一个个来进行分析.insert(iterator ...原创 2018-12-04 10:30:40 · 557 阅读 · 0 评论 -
STL源码分析之vector序列容器 中
前言上一节我们分析了vector的构造, 析构, back, front等基本操作, 这一节我们就来分析vector实现插入, 删除等直接对数组具体操作的实现.vector例子与上节一样, 我们将待会会用到的部分常用的操作先执行一次, 进行一次快速的回忆.int main(){ vector&amp;amp;amp;lt;int&amp;amp;amp;gt; v1; vector&amp;amp;amp;lt;int&amp;a原创 2018-12-04 10:28:52 · 636 阅读 · 0 评论 -
STL源码分析之vector序列容器 上
前言在STL编程中, 容器就是我们经常会用到的, 容器分为序列容器和关联式容器. 而这一篇我们就分析序列容器之一vector. 关于用过vector三的人肯定对其一点都不陌生, vector基本能够支持任何类型的对象, 同时是一个可以动态增长数组. 马上就来分析关于vector是怎么实现这些功能.vector的简单调用相信都对vector有一定的认识, 这里我就将本节会讲到关于vector源...原创 2018-12-04 10:25:34 · 1086 阅读 · 0 评论 -
STL源码分析之uninitialized系列函数
前言这里将内存处理工具放到这里来讲是因为必须对__type_traits类型定义有所了解, 对traits编程有所了解才行.(如果你还没有了解这些, 希望能去看一下前面4篇的文章). 而且容器实现的很多地方都会用到uninitialized_copy的函数, 虽然乍一看功能应该是执行复制操作, 但如果第一次看或者事先没有理解该函数怎么工作的可能会影响到部分人分析代码的效率, 所以在这里就提前对其...原创 2018-12-04 10:23:03 · 1195 阅读 · 0 评论 -
STL源码分析之__type_traits型别
前言上一篇探讨的是traits是为了将迭代器没能完善的原生指针, traits用特化和偏特化编程来完善. 这一篇准备探讨__type_traits, 为了将我们在空间配置器里面的提过的__true_type和false_type进行解答. 而type_traits型别对我们STL的效率又有什么影响, 有什么好处?__type_traits介绍前面介绍的Traits技术在STL中弥补了C++模...原创 2018-12-04 10:20:32 · 1422 阅读 · 0 评论 -
template之全特化和偏特化
前言关于讲过traits萃取器的时候探讨到偏特化的概念, 而在那一篇文章也没有具体解释偏特化是什么, 怎么实现, 所以可能在第一次看得时候会很莫名其妙. 所以我将偏特化放在其后讲解, 为不明白的朋友做一个浅析的讲解. 这里我先聊一下全特化再聊偏特化.全特化全特化的模板参数列表应该是为空, 函数和类都可以实现全特化.template&amp;lt;class T&amp;gt;void fun(T a)...原创 2018-12-04 10:13:05 · 2232 阅读 · 2 评论 -
STL源码分析之traits萃取剂
前言前面我们分析了迭代器的五类, 而迭代器所指向对象的型别被称为value type. 传入参数的类型可以通过编译器自行推断出来, 但是如果是函数的返回值的话, 就无法通过value type让编译器自行推断出来了. 而traits就解决了函数返回值类型. 同样原生指针不能内嵌型别声明,所以内嵌型别在这里不适用, 迭代器无法表示原生指针(int *, char *等称为原生指针). 这个问题就通...原创 2018-12-04 10:11:18 · 832 阅读 · 0 评论 -
STL源码分析之内存池
前言上一节只分析了第二级配置器是由多个链表来存放相同内存大小, 当没有空间的时候就向内存池索取就行了, 却没有具体分析内存池是怎么保存空间的, 是不是内存池真的有用不完的内存, 本节我们就具体来分析一下内存池static data template的初始化template &amp;lt;bool threads, int inst&amp;gt;char *__default_alloc_templa...原创 2018-11-29 14:37:06 · 1061 阅读 · 7 评论 -
STL源码分析之第二级配置器
前言第一级是直接调用malloc分配空间, 调用free释放空间, 第二级三就是建立一个内存池, 小于128字节的申请都直接在内存池申请, 不直接调用malloc和free. 本节分析第二级空间配置器, STL将第二级配置器设置为默认的配置器, 所以只要一次申请的空间不超过128字节就默认在内存池中申请空间, 超过才会调用第一级配置器.第二级配置器首先先来介绍3个常量.__ALIGN ...原创 2018-11-29 14:28:47 · 767 阅读 · 0 评论 -
STL源码分析之第一级配置器
前言上一节我们分析了空间配置器对new的配置, 而STL将空间配置器分为了两级, 第一级是直接调用malloc分配空间, 调用free释放空间, 第二级三就是建立一个内存池, 小于128字节的申请都直接在内存池申请, 不直接调用malloc和free.本节我们就先分析第一种空间配置器, 直接调用malloc, free, 而STL有是怎样的封装处理.一级配置器一级配置器的类. 它无temp...原创 2018-11-29 14:23:45 · 843 阅读 · 0 评论 -
template之模板中class与typename区别
前言在分析traits编程之前, 我们需要对模板参数类型tempname和class有一定的了解, 要明白他们在哪些方面不同, 哪些方面相同, 这样才能对体会到traits编程的核心. 如果你已经明白了两者, 那么你可以直接看下一篇了.相同之处一般对模板参数类型typename和class认为是一样的. 这两者在参数类型中确实是一样的. 你可以写成template&lt;class T&g...原创 2018-11-30 10:45:42 · 13633 阅读 · 1 评论 -
STL源码分析之list有序容器 上
前言前几节我们分析了vector的实现, vector的缺点也很明显, 在频率较高的插入和删除时效率就太低了, 本节我们就来分析在频率较高的插入和删除很也很好的效率的list.list是用链表进行实现的, 而链表对删除, 插入的时间复杂度为O(1), 效率相当高, 但是随机访问的时间复杂度为O(n). list将具体实现分成几个部分, 通过嵌套的方式进行调用, 所以list实现也很灵活. 而且...原创 2018-12-04 20:32:22 · 717 阅读 · 1 评论 -
STL源码分析之hashtable关联容器 下
前言上节分析了hashtable的迭代器, 其构造函数, 基本函数, 本节我们分析hashtable的插入, 删除等操作.hashtable分析重载template <class Value, class Key, class HashFcn, class ExtractKey, class EqualKey, class Alloc>class hashtable { ....原创 2018-12-08 15:00:56 · 482 阅读 · 0 评论