STL具体分为哪几个部分?
- 首先我是基于GNUC2.9的STL源码学习的,他和4.9还是有挺多不同的,不过对于帮助我理解标准模板库还是2.9更好。
- STL标准模板库主要分为六个部分:最重要的三个是容器、算法、迭代器。另外三个是分配器、仿函数和适配器。
- 2.9的STL主要运用的是泛型编程的思想,它和我们的面向对象还是有些许不同的,面向对象最重要的思想是运行时多态,而泛型编程时编译时多态,另外面向对象通常会把数据和算法放在一个对象中,而在STL中将数据和算法分开,各自实现自己,通过迭代器链接。
- 容器:就是装数据的东西,容器有很多种,分别对应我们常用的数据结构,比如序列式容器里的数组、链表、栈、队列等和关联式容器里的红黑树、set和map以及哈希表
- 迭代器:简单的说迭代器就是一个指针,当然它本质上是一个类,不过重载了指针相关的符号,假装自己是个指针,这个和智能指针的实现原理差不多,迭代器的作用就是指向容器中的一个数据,当然它作为一个类肯定有别的状态或者说属性,比如说一个迭代器首先要定义的五个东西,迭代器的分类、迭代器之间的距离用什么单位、迭代器里数值的类型,还有一个point和reference,但是这两个在源码中没有用过我也不知道用来干嘛的,主要还是前三个定义,这是迭代器要回答算法的三个问题。
- 算法:算法就是通过迭代器访问容器里的数据,对他们进行操作,前面说了迭代器作用就是一个指针,算法通过这个指针得到数据,但除此之外,算法还需要知道一些关于迭代器的细节,就是刚刚说的那三个问题三个定义,迭代器的类型和数值的类型等等,知道这些东西算法可以选择性能更好或者说更匹配的实现方式。比如知道迭代器是一个随机访问的迭代器,排序算法就可以选择快速排序,而如果是一个链表不支持随机访问,就需要其他办法。算法如何问这三个问题是通过萃取机traits,具体怎么实现我就不赘述了。
- 剩下三个是分配器、仿函数和适配器,分配器就是为容器分配空间的东西,也是我们创建容器的时候需要的第二个模板参数,虽然我们通常不设置,使用默认的分配器,在4.9的版本中分配器就是简单的调用operator new和operator delete函数,没什么多的设计,但是2.9的分配器就使用了内存池的设计,当然我这里也不多说了。仿函数的话就是一个类对象重载了小括号,假装他自己是一个函数,使用起来和函数也差不多,不过和智能指针一样,它可以比函数有额外的状态或者说元素之类的,比如我可以设置在内部记录这个函数调用多少次等等,适配器其实就是改造器,把一个东西改造成另一个东西,常见的有算法适配器,容器适配器等等,比如stack和queue就是一个容器适配器,是改造了deque的,另外这两个东西也挺有意思,他们不仅可以通过deque实现也能通过链表等,不过我对于适配器的了解不是很深,用的也不多,所以可能有些东西我也不太懂。