声明:侯捷先生的STL源码剖析第二章个人感觉讲得蛮乱的,而且跟第三章有关,建议看完第三章再看第二章,网上有人上传了一篇读书笔记,觉得这个读书笔记的内容和编排还不错,我的这篇总结基本就延续了该读书笔记的框架,如果发现有雷同,请勿见怪,这篇文章只是我的个人记录,算不上原创,只是更多的想把概念描述清楚,所以如果您觉得有copy之嫌的话请绕道看您觉得的原链接.在第8部分给出了笔记的参考链接.   1.allocator 作用 STL的组件(容器)都需要配置空间以放置资料.这个就是allocator的作用…
源码之前,了无秘密. --侯杰 第二章:空间配置器 allocator SGI特殊的空间配置器,std::alloc SGI是以malloc()和free()完成内存的配置与释放. SGI设计了双层级配置器: 第一级配置器直接使用malloc()和free();  _malloc_alloc_template 第二级配置器则视情况采用不用的策略: _default_alloc_template 当配置区块超过128bytes时,视之为“足够大”,便调用第一级配置器: 当配置区块小于128byte…
1.关联式容器的概念 上一篇文章讲序列式容器,序列式容器的概念与关联式容器相对,不提供按序索引.它分为set和map两大类,这两大类各自有各自的衍生体multiset和multimap,的底层机制都是用红黑树实现,红黑树是一种基本平衡的二叉搜索树,红黑树的原理wiki上讲得很清楚,书中只是把算法实现在了底层而已,在SGI STL中RB-tree是作为底层数据结构供其他容器配接用,因此关联容器可以看做都是adaptor模式的应用. 关联式容器的概念类似于关联式数据库,为获得良好的搜索效率,一般用平…
1.准备知识 typename用法 用法1:等效于模板编程中的class 用法2:用于显式地告诉编译器接下来的名称是类型名,对于这个区分,下面的参考链接中说得好,如果编译器不知道 T::bar 是类型名的话 T::bar * p可能就被理解成了T::bar 乘以p,T::bar & p可能就被理解成为了 T::bar 和p做逻辑与操作. 事实上,在模板编程时,如果传入的模板参数为T(T里面有模板参数的非独立名字bar),那么在不显示指定的话,c++或假定T::bar为变量名以消除歧义. "…
STL源码剖析读书笔记之vector 1.vector概述 vector是一种序列式容器,我的理解是vector就像数组.但是数组有一个很大的问题就是当我们分配 一个一定大小的数组的时候,起初也许我们不会觉得数组容量太小不合需求,但是随着数据量的增加, 数组尺寸大小不再满足需求,此时我们需要手动的去扩展其大小.然而vector就帮我们完全实现了一个可 自适应增长的数组功能.那么这样看来vector其实也就是一种可自适应增长的动态数组的类的实现. 2.关于vector的定义 其实用过vector的…
两个连在一起的序列 [first, middle) 和 [middle, last) 都已经排序, 归并排序最核心的算法就是 将 [first, middle) 和 [middle, last) 在 O(N)时间内合并成一个有序数组. 但是合并的过程中一般需要  m + n 的额外辅助空间.其中, m . n 是数组的左右半边的长度. 现在假如, 1〉 辅助空间 bufSize < m + n 呢, 但是比 min(m, n) 大.也就是说能够容纳序列1 或者 序列 2. 2〉 bufSize…
1.什么是序列式容器?什么是关联式容器? 书上给出的解释是,序列式容器中的元素是可序的(可理解为可以按序索引,不管这个索引是像数组一样的随机索引,还是像链表一样的顺序索引),但是元素值在索引顺序的方向不一定是有序的.下面这幅图是SGI STL中的各种容器,图中内缩表示内含关系,类似于UML类图里面的组合关系.比如说heap内含一个vector,表示heap是借由vector实现的. 2.vector vector概述 vector的空间是动态分配的,对vector进行size()操作得到的结果是…
源码之前,了无秘密. --侯杰 经典的书,确实每看一遍都能重新收获一遍: 第一章:STL简介 STL的设计思维:对象的耦合性极低,复用性极高,符合开发封闭原则的程序库. STL的价值:1.带给我们一套极具实用价值的零部件,以及一个整合的组织. 2.带给我们一个高层次的以泛型思维为基础的.系统化的.条理分明的“软件组件分类学”. 在STL接口之下,任何组件都有最大的独立性,并以所谓迭代器胶合起来,或以配接器互相配接,或以所 谓仿函数动态选择某种策略. STL六大组件:1.容器(containers…
阅读基础: Foo *pf = new Foo; 执行了两个步骤: 1)::operator new 向系统申请内存. 2) 调用Foo::Foo()构造函数构造实例.  ==> 申请内存,构造实例. delete pf; delete; 执行了两个步骤: 1)调用Foo::~Foo()析构函数. 2). ::operator delete释放内存.         ==> 析构实例,释放内存. Stl Alloc实现: Stl为了高效利用内存,将这两部分分开,分成了四个操作( 构造::con…
老实说,这两章内容还蛮多的,但是其实在应用中一点点了解比较好.所以我决定这两张在以后使用过程中零零散散地总结,这个时候就说些基本概念好了.实际上,这两个STL组件都及其重要,我不详述一方面是自己偷懒,一方面也是觉得没必要讲那么细,要详细看书就好了.   记住几个关键字:效率 通用性   算法是什么?怎么应用算法? 这都要从迭代器讲起,可以看到,所以的算法的输入参数基本都是迭代器,不同的算法的输入参数是不同类型的迭代器,算法能泛化地实现在不同的容器上,迭代器功不可没. 算法必然有一定的应用背景,比…