STL , 全称为standard template library, 翻译过来就是标准模板库。
STL是C++的一个software library。 STL为C++程序员提供了四个components:
(1)algorithms(算法)
(2)containers(容器)
(3)functional (仿函数)
(4)iterators
这四个components 可以说是C++ programmer 的编程利器。 从而支持generic programming(泛型编程)。
STL为我们提供了一些已经打包好(ready set of common classes)的常见的类集合, 这些常见的classes 包括containers(容器类)和associative arrays(关联数组类)。 这些所有的类集合可以被用于userdefined type(用户自定义类型, 这个user-defined type 支持copy 和 assignment等基本的操作)和一些内置的(built-In types)数据类型。
STL algorithms 是和containers 类独立存在的, 而不是直接针对于某些类的。 正是因为如此, 这个库(STL)的复杂度才大大降低了(reduces the complexity of the library)。
那么STL这么强大, 他是通过什么实现的呢?
答案是template(模板)。 还记得吗, 关于C++ 的一个重要的特性就是多态(polymorphsim)。 多态分文编译时多态( compile-time polymorphism)和运行时多态(run-time polymorphism)。 值得注意的是, 编译时的多态比运行时多态有的时候更加efficient。 模板(template)实现的就是compile-time polymorphism。现在的很多C++编译器都能够很好的最小化因为大量的使用STL编程所带来的抽象的代价。 (Modern C++ compilers are tuned to minimize any abstraction penalty arising from heavy use of the STL.)。
在Alexander Stepanov、Meng Lee和David R Musser在惠普实验室编写STL的时候, 有四个ideas in mind:
(1) generic programming(泛型编程)
(2) abstractness without loss of efficiency,(抽象而不失效率)
(3) the Von Neumann computation model(VN计算模型)
(4) value semantics.
STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。STL现在是标准C++的一部分,因此不用额外安装什么(参考百度百科)。 STL的模块定义在命名空间std中。 我们需要使用 using namespace std ;编译指导语句, 告知编译器我们使用标准C++ 库。
下面简要介绍下着四个重要的组件。
一. Containers(容器)
一个容器是存储着一系列(a collection of other objects )objects的, 我们将这些objects 称为container的元素(its elements). 容器主要通过implement成为 class templates,which allows a great flexibility in the types supported as elements.
Container Types(容器)主要分为三种:
(1) Sequence containers(线性容器): 即该容器中的元素存储是线性序列。 有三种: vector, list, deque。
(2) associative containers(关联式容器): 关联式容器可以直接依靠键来访问容器中的元素。顾名思义, 关联式, 就是键和值的关联。 不是线性结构, 共有四种关联式容器, 有四种: set, multiset, map, multimap。 这四个容器使用树的结构来存储数据。它们支持快速的元素搜索, 删除, 插入。 不过这几个容器随机访问很慢, 排序的效率也很低。
容器set 和multiset 可以存储一些的数据项。并提供了利用键来操作他们的功能。 键的特点就是唯一的。 我们可以用键来操作存储的这些数据。例如, 一个set 可能存储一些Student 类的对象。 他们以学生的学号为键(或者以学生的名字为key), 我们可一利用学号作为键来查找特定的学生。
set 和multiset的主要区别是, multiset (可以理解为multiple-key set)允许数据项重复(allows duplicate elements), 而set 不允许。
map 和 multimap(可以理解为multiple-key map) 可以存储成对的数据项,即{key,value}对。 一个称为键(key), 一个称为值(value)。 通过使用和value 相关的键, 可以操作容器内的值。这些值有时称为映射值。
map 和 multimap的主要区别就是map只允许给定的值只有一个键值, 而multimap则允许值拥有多个键。
(3)Container adaptors(容器适配器): 又称为衍生容器。 共有三种: stack(栈, LIFO), queue(队列, FIFO), priority queue(优先队列)。 栈,队列, 优先队列均是由线性容器(sequential containers)创建。 但是他们不支持迭代器。 我们不能用迭代器(iterators)对这类容器中的数据进行处理。 然而这类容器只支持两个函数: pop() 和push(), 实现数据的删除操作和插入操作。
为了更好的明白相关的容器类的结构, 参加如下图:
Linked List:
Stack:
Queue:
Deque:
相关容器的member function(成员函数), 当然不考虑上面的已经在上表格中的建构子和解构子:
vector类的重要成员函数:
list 类的重要成员函数:
map类的成员函数: