源码之前,了无秘密。 --侯杰
经典的书,确实每看一遍都能重新收获一遍:
第一章:STL简介
STL的设计思维:对象的耦合性极低,复用性极高,符合开发封闭原则的程序库。
STL的价值:1.带给我们一套极具实用价值的零部件,以及一个整合的组织。
2.带给我们一个高层次的以泛型思维为基础的、系统化的、条理分明的“软件组件分类学”。
在STL接口之下,任何组件都有最大的独立性,并以所谓迭代器胶合起来,或以配接器互相配接,或以所
谓仿函数动态选择某种策略。
STL六大组件:1.容器(containers):各种数据结构,如vector,list,deque,set,map用来存放数据。
2.算法(algorithms):各种常用算法,如sort,search,copy,erase,etc。从实现的角度看
STL算法是一种function template
3.迭代器(iterators):扮演容器与算法之间的胶合剂,是“泛型指针”。一种将operator*,
operator->,operator++,operator--等予以重载的class template。
4.仿函数(functors):行为类似函数,可作为算法的某种策略。一种重载了operator()的class
或class template.一般函数指针可视为狭义的仿函数
5.配接器(adapters):一种是用来修饰容器、仿函数、迭代器接口的东西。比如:queue
和stack是一个容器配接器,所有操作由底层deque供应。
6.配置器:负责空间配置与管理。实现了动态空间配置、空间管理、空间释放的
class template
STL六大组件的交互关系:Container通过Allocator取得数据存储空间;Algorithms通过Iterator存取
Container内容,Functor可以协助Algorithm完成不同的策略变化(比如qsor的最后一个参数),Adapter
可以修饰或套接Functor。
图形如下:
GNU:GNU is Not Unix 是不是递归了,呵呵--
STL版本,最早的是HP版本,本书介绍的是SGI STL版本
美妙的源代码:
template<class Interactor, class T> Interactor find(Interactor first, Interactor last, const T& value) { while(first != last && *first != value) { ++first; } return first; } #if defined(_STL_NEED_BOOL) typedef int bool; # define true 1 # define false 0 #endif
采用前闭后开区间表示法[)。迭代器last所指的是“最后一个元素的下一个位置”
仿函数代码实现:
1 template<class T> 2 struct plus { 3 T operator() (const T& x, const T& y) const { 4 return x+y; 5 } 6 }; 7 int main() { 8 //以下产生仿函数对象 9 plus<int> plusobj; 10 //以下使用仿函数,就像使用一般函数一样 11 cout << plusobj(3,5) << endl; //8 12 //以下直接产生仿函数的临时对象(第一对小括号),并调用之(第二对括号) 13 cout << plus<int>()(4,6) <<endl; //10