STL: (Standard Template Library) 标准模板库
STL广义上讲分为三类,algorithm算法,container容器,iterator迭代器,容器和算法通过迭代器可以进行无缝地连接,容器里面存数据,算法进行排序或查找,迭代器是用来访问容器里的数据的。
STL的一个重要特点就是数据结构和算法的分离,即数据的存储和数据的访问进行了分离,如栈的栈顶指针为栈数据的常用访问,而栈的数据存储是通过栈的数据结构。
STL发展
长久以来,软件界一直希望建立一种可重复利用的东西,以及一种得以制造出”可重复运用的东西”的方法,从函数(functions),类别(classes),函数库(function libraries),类别库(class libraries)、各种组件,从模块化设计,到面向对象(object oriented ),为的就是复用性的提升。
复用性必须建立在某种标准之上。但是在许多环境下,就连软件开发最基本的数据结构(data structures) 和算法(algorithm)都未能有一套标准。大量程序员被迫从事大量重复的工作,竟然是为了完成前人已经完成而自己手上并未拥有的程序代码,这不仅是人力资源的浪费,也是挫折与痛苦的来源。
为了建立数据结构和算法的一套标准,并且降低他们之间的耦合关系,以提升各自的独立性、弹性、交互操作性(相互合作性,interoperability),诞生了STL。
STL(Standard Template Library,标准模板库),是惠普实验室开发的一系列软件的统称。现在主要出现在 c++中,但是在引入 c++之前该技术已经存在很长时间了。
容器和算法之间通过迭代器进行无缝连接。STL 几乎所有的代码都采用了模板类或者模板函数,这相比传统的由函数和类组成的库来说提供了更好的代码重用机会。
它的发展历程可以从以下几个方面来讨论:
- 早期版本:STL最初由Alexander Stepanov和Meng Lee于1994年开发,最初被称为SGI STL(Silicon Graphics Inc. STL)。它的目的是为了在C++中提供高效的数据结构和算法的实现,大大简化了C++程序的开发。早期版本的STL包含容器、迭代器、算法、函数对象等组件。
- 标准化:由于STL在C++社区中的广泛应用,它于1998年正式被纳入C++标准库中。这一标准化使得STL更加稳定和可靠,成为C++程序员必备的工具之一。
- 扩展和优化:随着C++标准的不断更新,STL也不断得到扩展和优化。例如,C++11标准中新增了多线程支持,同时STL也在容器、迭代器、算法等方面得到了进一步扩展和优化。此外,一些开源社区也提供了STL的优化版本,如boost库、Eastl等。
- 应用领域:STL在软件开发中有广泛的应用,包括游戏开发、图形处理、科学计算、数据挖掘等领域。尤其在高性能和高并发的系统开发中,STL的应用更加广泛。
总的来说,STL的发展历程是一个不断完善和拓展的过程,它为C++程序员提供了强大的工具,极大地提高了程序开发效率和性能。
STL的特点
- 可重用性(stl中几乎所有代码都是通过模板类,模板函数的方式实现)
- 高性能(map的键值,map采用红黑树的变体来实现,查找某个元素只需log2^n的时间复杂度,即十万条数据差不多只用比较十四次)
- 高移植性(项目A用STL写的模块可以直接移植到项目B)
- 跨平台(VS可以在XCode上直接编译)
STL六大组件
STL提供了六大组件,彼此之间可以组合套用,这六大组件分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器。
- 容器:各种数据结构,如vector、list、deque、set、map等,用来存放数据,从实现角度来看,STL容器是一种class template。
- 算法:各种常用的算法,如sort、find、copy、for_each。从实现的角度来看,STL算法是一种function tempalte.
- 迭代器:扮演了容器与算法之间的胶合剂,共有五种类型,从实现角度来看,迭代器是一种将operator* , operator-> , operator++,operator–等指针相关操作予以重载的class template. 所有STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。原生指针(native pointer)也是一种迭代器。
- 仿函数:行为类似函数,可作为算法的某种策略。从实现角度来看,仿函数是一种重载了operator()的class 或者class template
- 适配器:一种用来修饰容器或者仿函数或迭代器接口的东西。
- 空间配置器:负责空间的配置与管理。从实现角度看,配置器是一个实现了动态空间配置、空间管理、空间释放的class tempalte.
STL六大组件的交互关系,容器通过空间配置器取得数据存储空间,算法通过迭代器存储容器中的内容,仿函数可以协助算法完成不同的策略的变化,适配器可以修饰仿函数。
参考博文:
https://blog.csdn.net/soinlove36/article/details/119796794
https://blog.csdn.net/ltzoro/article/details/132102671
https://blog.csdn.net/hoppingg/article/details/130143286