最近C++编程中需要管理多个由同一个类实例化的对象,于是想到了C++的标准模板库STL,在此将STL的相关知识记录一下。
STL的来龙去脉
STL 历史可以追溯到 1972 年 C 语言在 UNIX 计算机上的首次使用。直到 1994 年,STL 才被正式纳入 C++ 标准中。
标准模板库(STL)是 C ++编程语言的软件库,影响了C ++标准库的许多部分。它提供了四个组件,分别称为算法,容器,仿函数和迭代器。
STL为 C ++提供了一组通用类,例如容器和关联数组,可以与任何内置类型和支持某些基本操作(例如复制和赋值)的任何用户定义类型一起使用。 STL算法独立于容器,从而大大降低了库的复杂性。
STL通过使用模板来实现其结果。这种方法提供的编译时多态性通常比传统的运行时多态性更有效。对现代 C ++编译器进行了调整,以最大程度地减少由于大量使用STL而引起的抽象损失。
STL是创建的第一个C ++通用算法和数据结构库,它牢记四个想法:通用编程,不损失效率的抽象性,冯·诺依曼计算模型和值语义。
STL 组件
STL 将“在数据上执行的操作”与“要执行操作的数据分开”,分别以如下概念指代:
- 容器:包含、放置数据的地方。
- 迭代器:在容器中指出一个位置、或成对使用以划定一个区域,用来限定操作所涉及到的数据范围。
- 算法:要执行的操作。
容器
容器即用来存储并管理某类对象的集合。例如鱼缸是用来盛放金鱼的容器。标准模板库中容器主要分为序列容器(sequence containers)与关系容器(associative containers)。
序列容器包括:
- vector
- list
- forward_list
- deque
- array
关联容器包括:
- set
- multiset
- map
- multimap
- unordered_set
- unordered_multiset
- unordered_map
- unordered_multimap
其他类型的容器包括:
- bitset
- valarray
迭代器
迭代器用于在一个对象群集的元素上进行遍历动作。对象群集可能是容器,也可能是容器的一部分。
迭代器的主要用途是为容器提供一组很小的公共接口。利用这个接口,某项操作可以行进至群集内的下一个元素。
每种容器都提供了各自的迭代器。迭代器了解该容器的内部结构,所以能够正确行进。迭代器的接口和一般指针类似。
迭代器的作用就是提供一个遍历容器内部所有元素的接口,因此迭代器的内部必须保存一个与容器相关联的指针,然后重载各种运算操作来方便遍历,其中最重要的就是∗运算符和->运算符,以及++,–等可能需要的运算符重载。
根据迭代器的操作方式的不同,迭代器分为五种:
- 输入迭代器
- 输出迭代器
- 前向迭代器
- 双向迭代器
- 随机访问迭代器
迭代器的示例代码如下:
1 | #include <iostream> |
算法
算法用来处理群集内的元素,可以出于不同目的搜寻、排序、修改、使用那些元素。所有容器的迭代器都提供一致的接口,通过迭代器的协助,算法程序可以用于任意容器。
STL 的一个特性是将数据和操作分离。数据由容器类别加以管理,操作则由可定制的算法定义。迭代器在两者之间充当“粘合剂”,以使算法可以和容器交互运作。
STL 的另一个特性即组件可以针对任意型别运作。“标准模板库”这一名称即表示“可接受任意型别”的模板,并且这些型别均可执行必要操作。
仿函数
STL中大量运用了仿函数。仿函数具有泛型编程强大的威力,是纯粹抽象概念的例证。
参考链接
- STL教程:C++ STL快速入门,by C语言中文网.
- STL是什么(STL简介),by C语言中文网.
- 标准模板库,by wikipedia.
- C++ STL初识及整理,by thinkChao.
- C++标准模板库(STL)迭代器的原理与实现,by wutao02.