STL(standard template libaray ):标准模板库,是C++程序设计语言的标准程序库,是一个包罗算法与数据结构的软件框架。STL的目的是标准化组件,所以在STL中使用了泛型编程的思想,对我们常用的数据结构:顺序表、链表、树、哈希以及常用的查找、排序等算法使用模板进行了封装,而且从运行效率以及内存使用上都基本达到了最优。引入STL后,再也不需要我们重新造轮子,而且写出来的代码更加简洁,容易修改,可移植性高。万一STL所提供的容器或者算法不能满足我们的要求,我们也可以实现自己的容器或算法与STL中的其他组件进行交融。
STL六大组件:
容器(Container): 也称数据容器。由于对数据进行的操作不同,使用的场景各异,可能需要相应的数据结构来管理数据,常见的数据结构:array、list、tree、stack、queue、hash table、map、set等,因此STL中的容器便是对各种不同数据结构的封装。根据数据在容器中的排序特性,容器分为序列式容器和关联式容器序列式容器中的元素次序:即是按照其加入容器中的先后次序,不一定有序。
序列式容器
向量(vector) 连续存储的元素
列表(list) 由节点组成的双向链表,每个结点包含着一个元素
双端队列(deque) 连续存储的指向不同元素的指针所组成的数组
适配器容器
栈(stack) 后进先出的值的排列
队列(queue) 先进先出的值的排列
优先队列(priority_queue) 元素的次序是由作用于所存储的值对上的某种谓词决定的的一种队列
关联式容器
集合(set) 由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序
多重集合(multiset) 允许存在两个次序相等的元素的集合
映射(map) 由{键,值}对组成的集合,以某种作用于键对上的谓词排列
多重映射(multimap) 允许键对有相等的次序的映射
算法(Algorithm): STL中的算法是将常用的算法规范出来,算法只关心操作的步骤,与数据的结构没有任何的关系,而且STL在设计时就有一个目标,就是算法可复用,效率要尽可能的高。STL中收录了极具复用价值的70多个算法,包括:排序,查找,排列组合,数据移动,拷贝,删除,比较组合,运算等。(STL中的算法都作用在由【fist, last)指定的前闭后开的区间上)
迭代器(Iterator): 迭代器(itreator)是一种抽象的设计概念,是设计模式的一种,其定义如下:提供一种方法,使之能够依次寻访某个容器中所包含的所有元素,而又无需暴露该容器底层的结构。STL设计的中心思想在于:将数据容器和算法分离开,彼此独立设计,算法要操作容器中的元素时,通过迭代器去访问即可。因此,算法不需要去关心所操作数据底层的结构,只要能够按照迭代器去寻访到所需的数据即可,实现其通用性。(大多数的时候,把它理解为指针是没有问题的(指针是迭代器的一个特例,它也属于迭代器),但是,决不能完全这么做)
仿函数(Function object): 就是使一个类的使用看上去象一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了。
仿函数虽然小,但却极大的拓展了算法的功能,几乎所有的算法都有仿函数版本。例如,查找算法find_if就是对find算法的扩展,标准的查找是两个元素相等就找到了,但是什么是相等在不同情况下却需要不同的定义,如地址相等,地址和邮编都相等,虽然这些相等的定义在变,但算法本身却不需要改变,这都多亏了仿函数。仿函数(functor)又称之为函数对象(function object),其实就是重载了()操作符的struct,没有什么特别的地方。
为什么要使用仿函数呢?
1).仿函数比一般的函数灵活。
2).仿函数有类型识别,可以作为模板参数。
3).执行速度上仿函数比函数和指针要更快的。
适配器(Adaptor): 适配器是用来修改其他组件接口的STL组件,是带有一个参数的类模板(这个参数是操作的值的数据类型)。STL定义了3种形式的适配器:容器适配器,迭代器适配器,函数适配器。
容器适配器:包括栈(stack)、队列(queue)、优先(priority_queue)。使用容器适配器,stack就可以被实现为基本容器类型(vector,dequeue,list)的适配。可以把stack看作是某种特殊的vctor,deque或者list容器,只是其操作仍然受到stack本身属性的限制。queue和priority_queue与之类似。容器适配器的接口更为简单,只是受限比一般容器要多。
迭代器适配器:修改为某些基本容器定义的迭代器的接口的一种STL组件。反向迭代器和插入迭代器都属于迭代器适配器,迭代器适配器扩展了迭代器的功能。
函数适配器:通过转换或者修改其他函数对象使其功能得到扩展。这一类适配器有否定器(相当于"非"操作)、绑定器、函数指针适配器。函数对象适配器的作用就是使函数转化为函数对象,或是将多参数的函数对象转化为少参数的函数对象
空间配置器(allocator): STL的内存配置器在我们的实际应用中几乎不用涉及,但它却在STL的各种容器背后默默做了大量的工作,STL内存配置器为容器分配并管理内存。统一的内存管理使得STL库的可用性、可移植行、以及效率都有了很大的提升。
SGI-STL的空间配置器有2种,一种仅仅对c语言的malloc和free进行了简单的封装,而另一个设计到小块内存的管理等,运用了内存池技术等。在SGI-STL中默认的空间配置器是第二级的配置器。
六大组件之间的相互关系:
容器通过空间配置器取得数据存储空间;
算法利用迭代器向容器存取数据;
仿函数协助算法完成不同的策略;
适配器可以用来修改容器、迭代器或仿函数的接口;