C++标准模板库STL入门

最近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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <vector>

using namespace std;

int main()
{
vector<int> v; // 定义一个vector容器

v.push_back(1); // 向容器中添加3个元素
v.push_back(2);
v.push_back(3);

// 遍历向量的元素
vector<int>::iterator b = v.begin(); // 指向容器的第一个元素
vector<int>::iterator e = v.end(); // 指向容器尾元素的下一个位置

// C++11新标准的写法, auto关键字为类型推断,由编译器自动完成
// auto b = v.begin();
// auto e = v.end();

for (vector<int>::iterator iter = b; iter != e; ++iter)
{
cout << *iter << endl;
}

return 0;
}

算法

算法用来处理群集内的元素,可以出于不同目的搜寻、排序、修改、使用那些元素。所有容器的迭代器都提供一致的接口,通过迭代器的协助,算法程序可以用于任意容器。

STL 的一个特性是将数据和操作分离。数据由容器类别加以管理,操作则由可定制的算法定义。迭代器在两者之间充当“粘合剂”,以使算法可以和容器交互运作。

STL 的另一个特性即组件可以针对任意型别运作。“标准模板库”这一名称即表示“可接受任意型别”的模板,并且这些型别均可执行必要操作。

仿函数

STL中大量运用了仿函数。仿函数具有泛型编程强大的威力,是纯粹抽象概念的例证。

参考链接

  1. STL教程:C++ STL快速入门,by C语言中文网.
  2. STL是什么(STL简介),by C语言中文网.
  3. 标准模板库,by wikipedia.
  4. C++ STL初识及整理,by thinkChao.
  5. C++标准模板库(STL)迭代器的原理与实现,by wutao02.