STL源码解析:STL 与 泛型编程

std与stl:

  • C++ Standard Library 标准库,对于不同的编译器,同版本的标准库几乎相同;
  • C++ Standard Template Library 标准模板库,主要包括容器,分配器,算法,迭代器,适配器和仿函数 六大部件。
  • 标准库与标准模板库的关系:标准模板库大约占标准库的百分之七八十。
面向对象编程与泛型编程
  • 泛型编程(Generic Programming)就是使用模板为主要工具来进行编程,与面向对象编程(Object Oriented Programming)是截然不同的编程思维。
  • 个人理解 — 面向对象编程的思维:将数据和操作放在一起,比如对于一个箱子的操作,将箱子的长高宽,所装物体等数据,以及计算体积,称重,等操作放在一起,构建一个类(class),然后可以由此类派生出 木箱子,铁箱子,圆柱状箱子 等各种各样的子类。类的继承决定了其可以很好的复用代码(同时降低修改代码的复杂度)。一个类如果想使用另一个类里面的方法,要么将其作为成员类,要么就继承他(还有友元)。原则上来说,如果用到继承,那么就表示 子类和父类 是同一种事物。
  • 个人理解 — 泛型编程的思维:泛型编程的目的是使得代码更加的通用,比如
Template<typename T> 
class vector {
public:
	typedef T   value_type;
	typedef value_tyep* iterator;
	// ...
}

有了模板,我们使用vector时,不管要容器里装什么数据,在声明时指明数据类型即可,如vector<float>。类似的,对于class, 结构体,函数,都可以使用模板来提高代码的通用性。在 STL 中模板起到了更为强大的作用。上面说到面向对象编程喜欢将数据和操作(算法)放在一起,而在STL 中 算法 与 容器(数据)是分开的,这样做使得通用的算法可以以迭代器为媒介,对所有的通用容器进行访问和操作。

STL 六大部件介绍

图1. STL 六大部件关系图(出处:侯捷老师授课视频)
图1. STL 六大部件关系图(出处:侯捷老师授课视频)

  • 图1 表示STL 六大部件(容器,分配器,算法,迭代器,适配器和仿函数 )的关系。容器(array, vecter, deque, list 等) 负责 装载数据;分配器负责给容器分配内存;算法负责提供对数据进行操作的接口,而迭代器负责让算法能够拿到容器中的数据从而进行操作。
    仿函数作为软积木与STL中的其他组件搭配使用从而产生灵活的变化。实质上仿函数是有结构体实现的,结构体中有对括号()的操作符重载,从而可以使得这个结构体模仿函数的一些使用方式。
    适配器,图中显示有容器适配器,迭代器适配器和仿函数适配器,顾名思义,适配器的作用是当操作目标不适用当前算法时,对操作目标进行一些操作使他变得适用。举例说明:
int ar[6] = {1,2,6,9,12,3};
vector<int, allocator<int>> vec(ar, ar+6) ;
cout << count_if(vec.begin(), vec.end(), 
		notl(bind2nd(less<int>(), 6)));

以上代码中, vector 为容器, allocator 为适配器,在这里为vector分配保存 int 的 内存空间,一般不需要使用者填写。begin()end() 为 迭代器, count_if 为 算法接口(计数);less<int>() 为 仿函数,传入值小于其参数时返回 true; bind2ndnotl 都是 仿函数适配器, bind2nd 意思是将 第二个参数绑定到第一个参数(仿函数),在这里就将 6 绑定到 less<int>()上, notl 是置反。以上组合起来就是,从vec.begin() 到 vec.end(),遍历 容器 vec, 如果元素 不小于 6, 则计数加1,最后返回计数的数值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值