1.什么是STL
STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的
组件库,而且是一个包罗数据结构与算法的软件框架
2.发展历史
1. 起源与早期探索(20世纪80年代初期):
- STL最早由美国计算机科学家Alexander Stepanov在20世纪80年代初期提出。当时他在惠普(Hewlett-Packard)公司的实验室工作,认为程序员需要一种通用的编程模式来更方便地实现各种数据结构和算法,于是开始着手设计一种新的C++库,这便是STL的雏形。
2. 初步形成与发展(1988 - 1994年):
- 1988年惠普公司开始了C++标准模板库的相关工作。在这一时期,STL的基本框架和核心组件逐渐形成,包括容器、算法和迭代器等。这些组件的设计旨在提供高效、通用的数据结构和算法实现,大大简化C++程序的开发。
- 早期的STL最初被称为SGI STL(Silicon Graphics Inc. STL),包含了容器、迭代器、算法、函数对象等组件。其设计理念和实现方式为后来STL的标准化奠定了基础。
3. 标准化(1998年):
- 由于STL在C++社区中的广泛应用和认可,1998年它正式被纳入C++标准库中,成为C++标准的一部分。这一事件标志着STL的成熟和稳定,使其成为C++程序员必备的工具之一。标准化后的STL在不同的编译器和平台上具有更好的可移植性和兼容性,进一步推动了其广泛应用。
4. 后续的扩展和优化:
- C++11标准及以后:随着C++标准的不断更新,STL也不断得到扩展和优化。例如,C++11标准中新增了多线程支持,STL中的一些容器和算法也进行了相应的改进和扩展,以适应新的编程需求。同时,在容器、迭代器、算法等方面也有了更多的功能增强和性能优化。
- 开源社区的贡献:一些开源社区也为STL的发展做出了重要贡献,提供了STL的优化版本和扩展。例如,Boost库中的一些组件与STL相互补充,为C++程序员提供了更多的选择和功能。
总的来说,STL的发展历程是一个不断完善和拓展的过程。它的出现和发展为C++程序员提供了强大的工具,极大地提高了程序开发的效率和性能,并且对软件开发的标准化和规范化产生了积极的影响。
3. STL****的版本
原始版本
Alexander Stepanov 、 Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使用。 HP 版本 -- 所有 STL 实现版本的始祖。
P. J. 版本
由 P. J. Plauger 开发,继承自 HP 版本,被 Windows Visual C++ 采用,不能公开或修改,缺陷:可读性比较低,符号命名比较怪异。
RW 版本
由 Rouge Wage 公司开发,继承自 HP 版本,被 C+ + Builder 采用,不能公开或修改,可读性一
般。
SGI 版本
由 Silicon Graphics Computer Systems , Inc 公司开发,继承自 HP 版 本。被 GCC(Linux) 采用,可
移植性好,可公开、修改甚至贩卖,从命名风格和编程 风格上看,阅读性非常高。 我们后面学习
STL 要阅读部分源代码,主要参考的就是这个版本
4.STL的六大组件
**STL的六大组件分别是:
- 容器(Containers):**用于存放数据的各种数据结构实现,比如 vector (动态数组)、 list (双向链表)、 deque (双端队列)、 set (集合)、 map (映射)等。从实现角度来看,STL 容器是一种类模板。容器可分为序列式容器和关联式容器。序列式容器中的每个元素均有固定的位置,取决于插入时机和地点,和元素值无关,例如 vector 、 deque 、 list ;关联式容器中元素的位置取决于特定的排序准则以及元素值,和插入次序无关,例如 set 、 multiset (允许重复值的集合)、 map 、 multimap (允许重复键值对的映射)。
2. 算法(Algorithms):提供了各种常用的算法操作,例如排序( sort )、查找( find )、拷贝( copy )、遍历( for_each )等。从实现的角度来看,STL 算法是一种函数模板,可以对容器中的元素进行各种操作和处理。
3. 迭代器(Iterators):连接容器和算法,是一种类似指针的对象,它提供了对容器中元素的访问方式。迭代器共有五种类型,包括输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器。不同类型的迭代器支持不同的操作,其功能和使用场景也有所不同。所有 STL 容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。原生指针在一定程度上也可看作是一种迭代器。
4. 仿函数(Function Objects):也称为函数对象,行为类似函数,可作为算法的某种策略。从实现角度来看,仿函数是一种重载了 operator() 的类或类模板。比如,在排序算法中,可以通过定义一个仿函数来指定自定义的比较规则。
5. 适配器(Adapters):这是一种用来修饰容器、仿函数或迭代器接口的组件,它可以改变原有组件的接口或行为,以满足特定的需求。例如, stack (栈)和 queue (队列)就是通过适配器将 vector 或 deque 等容器适配成特定的数据结构。迭代器适配器可以使迭代器的行为发生改变,比如反向迭代器。
**6. 空间配置器(Allocators):**负责空间的配置与管理,用于为容器等对象分配内存空间。它封装了内存分配和释放的操作,将算法与具体的内存模型解耦,提高了程序的可移植性。
如果想要深入了解,可以推荐阅读下面几本书: