一、STL库的概念
STL:是C++标准库的重要追组成部分,不仅是一个可以复用的组件库,而且还是一个包含了数据结构和算法的软件框架。
二、STL的版本
- 原始版本
Alexander Stepanov、 Meng Lee 在惠普实验室完成的原始版本, 是一个开源版本,允许任何人任意运用、拷贝、修改、传播、商业化的使用这些代码,无需付费。仅仅要求向原始版本一样做开源使用,HP版本 -- 所有STL实现版本的始祖版本。 - P.J版本
由P.J.Plauger开发,继承自HP版本,被Windows VisualC++采用,不能公开或者修改,缺点是可读性比较低,并且符号命名比较怪异。 - RW版本
由Rouge Wage公司开发,也是继承自HP版本, 被C++ Builder采用,不能公开和修改,可读性也不太高。 - SGL版本
- 由Silicon Graphics Computer Systems , inc公司开发, 继承自HP版本,被Linux系统的g++/gcc采用,可移植性高,公开并且可以修改甚至贩卖, 从命名风格和编程风格上看,可读性比较高。
三、STL的六大组件
stl的六大组件分别是:仿函数,算法,迭代器,空间配置器(本质是内存池),容器以及配接器。
具体如下所示:
- 容器(containers):各种数据结构,如 vector,list,deque,set,map等。从实现的角度来看,容器是一种 class template。
- 算法(algorithms):各种常用算法,提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作,比如 sort,search,copy,erase。从实现的角度来看,STL算法是一种 function template。
- 迭代器(iterators):迭代器用于遍历对象集合的元素,扮演容器与算法之间的胶合剂,是所谓的
泛型指针
,共有5种类型,以及其他衍生变化。从实现角度来看,迭代器是一种将 operator*,operator->,operator++,operator--等指针操作予以重载的 class template。所有的STL容器附带有自己专属的迭代器,因为只有容器设计者才知道如何遍历自己的元素。 - 仿函数(functors):行为类似函数,可作为算法的某种策略。从实现角度来看,仿函数是一种重载了 operator() 的 class 或者 class template。
- 配接器(Adaptor):一种用来修饰容器或者仿函数或迭代器接口的东西。例如 STL 提供的queue 和 stack,就是一种空间配接器,因为它们的底部完全借助于 deque。
- 空间配置器(allocator):负责空间的配置与管理。从实现的角度来看,配置器是一个实现了动态配置空间、空间管理、空间释放的 class template。
四、STL的重要性
一般在面试和笔试中很容易遇到关于STL的相关问题。
在工作中,我们也会经常用到C++的STL库,STL是C++中的优秀作品,正是因为有了STL库我们对于有些数据结构就不用重新造轮子,帮助我们快速的进行开发。
五、STL库的一些缺点
1.STL库的更新速度较慢,上一版靠谱的是C++98,C++03做了一些修订,C++11出现后已经隔了13年才进一步进行更新。
2.STL一直到现在都没有支持线程安全,并发环境下需要我们自己进行加锁,且锁的力度比较大。
3.STl极度追求效率,导致内部过于复杂,比如类型萃取和迭代器萃取。
4.STL使用会有代码膨胀的问题,可能会因为模板的语法问题导致生成多份代码。