C++ STL 探究
我是一片小树叶
树叶虽小,我心很大
展开
-
Effective STL:1、容器
没错,STL 中有迭代器、算法和函数对象,但是对于大多数 C++ 程序员来说,最值得注意的还是容器。容器比数组功能更强大、更灵活。它们可以动态增长(和缩减),可以自己管理内存,可以记住自己包含了多少对象。它们限定了自己所支持的操作的复杂性。诸如此类的优点还有很多。不难理解它们为何如此受欢迎,因为相对于其竞争者,无论是来自其他库中的容器还是你自己编写的容器,其优越性是显而易见的。STL容器不是简单...原创 2019-10-24 16:21:27 · 230 阅读 · 0 评论 -
Effective STL:2、vector 和 string
所有的 STL 容器都是有用的,但对于大多数 C++ 程序员,你会发现使用 vector 和 string 的时候回更多一些。这是可以想见的。设计 vector 和 string 的目的就是为了代替在大多数应用中使用的数组,而数组的用途是如此广泛,以至于它被包含在从 COBOL 到 Java 的所有成功的商业编程语言中。本章的条款涵盖了 vector 和 string 的多个方面。首先会讨论...原创 2019-10-24 22:25:25 · 187 阅读 · 0 评论 -
Effective STL:3、关联容器
就像电影《绿野寻踪》中的多色马一样,关联容器是一些不同颜色的动物。不错,它们和序列容器有很多相同的特性,但是在很多方面也有本质的不同。比如,它们会自动排序;它们按照等价而不是相等的标准来对待自己的内容;set 和 map 不允许有重复的项目;map 和 multimap 通常忽略它们所含的每个对象中的一半。不错,关联容器是容器,但如果你能允许我把 vector 比作堪萨斯州的话,那么我们肯定不会...原创 2019-10-26 22:26:16 · 178 阅读 · 0 评论 -
Effective STL:4、迭代器
乍看起来,STL 迭代器的概念似乎已经非常简单了,然而再仔细看一看,你就会注意到,STL 标准容器实际上提供了 4 种不同的迭代器类型:iterator、const_iterator、reverse_iterator 和 const_reverse_iterator。再进一步你会注意到,对于特定的形式的 insert 和 erase 函数,4 种类型中只有一种迭代器可以被容器接受。问题来了:为什...原创 2019-10-27 11:28:33 · 215 阅读 · 0 评论 -
Effective STL:5、算法
这在第 1 章开始的时候提到过,在 STL 中最受欢迎的就要数容器了。这点很容易理解 —— 容器无疑是 STL 最重要的成就之一,它极大地简化了众多 C++ 程序员的日常编程工作。同样地,STL 算法也有此殊荣,因为它同样能够显著地减轻程序员的负担。事实上,STL 中只有 8 个容器类,却包含超过 100 个算法,所以,毫无疑问,STL 算法为程序员提供了更为锐利的工具。但其庞大的数量同时也成为...原创 2019-10-28 13:21:41 · 205 阅读 · 0 评论 -
Effective STL:6、函数子、函数子类、函数及其他
无论你是否喜欢,函数和类似于函数的对象遍布在 STL 的每个角落。关联容器利用它们为其元素进行排序;find_if这样的 STL 算法使用它们来控制算法的行为;如果没有函数子,那么 for_each 和 transform 这样的功能组件就形同虚设;而像 not1 和 bind2nd 这样的配接器则可以动态地生成函数子。是的,在 STL 的每一个地方,你都可以看到函数子和函数子类的踪影,即便...原创 2019-10-28 20:25:13 · 201 阅读 · 0 评论 -
Effective STL:7、在程序中使用 STL
按照习惯,我们可以认为 STL 是由容器、迭代器、算法及函数对象组成的,但要在程序中正确而有效地使用 STL 却并非这么简单。在利用 STL 进行编程的时候,你需要知道什么时候该使用循环,什么时候该使用算法,什么时候该使用容器的成员函数。你需要知道什么时候该使用 equal_range 来代替 lower_bound,什么时候该使用 lower_bound 来代替 find,而又在什么时候该使用...原创 2019-10-29 17:23:02 · 214 阅读 · 0 评论 -
STL 源码剖析:1、STL 概论与版本简介
STL,虽然是一套程序库(library),却不只是一般印象中的程序库,而是一个有着划时代意义,背后拥有先进技术与深厚理论的产品。说它是产品也可以,说它是规格也可以,说是软件组件技术发展史上的一个大突破点,它也当之无愧。1.1 STL 概论复用性必须建立在某种标准之上 —— 不论是语言层次的标准,或数据交换的标准,或通讯协议的标准。1.1.1 STL 的历史1.1.2 STL 与 ...原创 2019-10-31 22:27:01 · 296 阅读 · 0 评论 -
STL 源码剖析:2、空间配置器
以 STL 的运用角度而言,空间配置器是最不需要介绍的东西,它总是隐藏在一切组件(更具体地说是指容器,container)的背后,默默工作,默默付出,但若以STL的实现角度而言,第一个需要介绍的就是空间配置器,因为整个 STL 的操作对象(所有的数值)都存放在容器之内,而容器一定需要配置空间以置放资料。不先掌握空间配置器的原理,难免在阅读其它STL组件的实现时处处遇到挡路石。为什么不说 all...原创 2019-10-31 22:37:59 · 184 阅读 · 0 评论 -
STL 源码剖析:3、迭代器概念与 traits 编程技法
迭代器(iterator)是一种抽象的设计概念,现实程序语言中并没有直接对应于这个概念的实物。《Design Patterns》一书提供有 23 个设计模式的完整描述,其中 iterator 模式定义如下:提供一种方法,使之能够依序巡防某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表达式。3.1 迭代器设计思维 —— STL关键所在不论是泛型思维或 STL 的实际运用,迭...原创 2019-10-31 22:53:08 · 301 阅读 · 0 评论 -
STL 源码剖析:4、序列式容器
4.1 容器的概观与分类常用的数据结构不外乎 array (数组)、list (链表)、tree (树)、stack (堆栈)、queue (队列) . hash table (散列表)、set (集合)、map (映射表) 等等。根据 “数据在容器中的排列” 特性,这些数据结构分为序列式 (sequence) 和关联式 (associative) 两种。4.1.1 序列式容器所谓序列式...原创 2019-11-01 19:11:19 · 188 阅读 · 0 评论 -
STL 源码剖析:5、关联式容器
标准的STL关联式容器分为 set 和 map 两大类,以及这两大类的衍生体 multiset 和 multimap。这些容器的底层机制均以 RB-tree 完成。RB-tree 也是一个独立容器,但并不开放给外界使用。此外,SGI STL 还提供了一个不在标准规格之列的关联式容器:hash table,以及以此 hash table为底层机制而完成的 hash_set、hash_ map、h...原创 2019-11-01 22:59:47 · 193 阅读 · 1 评论 -
STL 源码剖析:6、算法
6.1 算法概观以有限的步骤,解决逻辑或数学上的问题。6.1.1 算法分析与复杂度表示6.1.2 STL 算法总览6.1.3 质变算法会改变操作对象的值。6.1.4 非质变算法不改变操作对象的值。6.1.5 STL 算法的一般形式所有的泛型算法的前两个参数都是一堆迭代器,通常称为 first 和 last。6.2 算法的泛化过程关键在于,只要把操作对象的型别加以抽象...原创 2019-11-03 11:15:41 · 217 阅读 · 0 评论 -
STL 源码剖析:7、仿函数
历经前数章的 memory pool、iterator-traits、type_traits、deque、RB-tree、hash table、QuickSort、IntroSort … 的复杂洗礼与无情轰炸,你的脑袋快吃不消了吧。这一张是轻松小菜,让我们在此稍事停顿,修生养息。7.1 仿函数概观就实现观点而言,仿函数其实上就是一个 “行为类似函数” 的对象。为了能够 “行为类似对象”...原创 2019-11-03 17:58:17 · 213 阅读 · 0 评论 -
STL 源码剖析:8、配接器
配接器在 STL 组件的灵活组合运用功能上,扮演着轴承、转换器的角色。Adapter 这个概念,事实上是一种设计模式。《Design Patterns》一书提到 23 个最普及的设计模式,其中对 adapter 样式的定义如下:将一个 class 的接口转换为另一个 class 的接口,使原本因接口不兼容而不能合作的 classes,可以一起运作。8.1 配接器之概观与分类STL 所提...原创 2019-11-03 21:15:34 · 196 阅读 · 0 评论