第十五章、标准模板库
在介绍标准模板库之前我们先来介绍一下泛型算法.
泛型算法是一种编程范式,核心思想是编写与类型无关的通用代码,让算法和数据结构等能够适用于不同的数据类型。
函数模板和类模板是泛型算法的基础。
泛型算法的核心思想 是一次编写,多次使用。在计算机领域数据结构和算法基本固定,只是操作的数据类型不同,因此可以把这些算法写成函数模板或类模板封装在一个库中。这样就可以使用这些泛型算法对任意类型进行操作而无需重写这些算法。
1. 标准模板库
C++ 语言将泛型算法封装成标准库供开发者直接使用,这个库就是标准模板库(Standard Template Library,STL)
标准模板库(STL) 是 C++ 标准库的核心组成部分,它是一套通用的数据结构和算法的框架。这套数据结构和算法已经高度优化,基本可以代替任何手搓的数据结构和算法。
标准模板库都包含在 std 名字空间中。
标准模板库核心组成(常用):
- 容器(Container)
- 算法(Algorithms)
- 迭代器(Iterators)
1. 容器(Containers)
容器是用来存储数据的结构,标准模块库中的常用容器分类如下:
- 序列容器(按顺序存储):vector(动态数组)、array(定长数组)、list(双向链表)、deque(双端队列)。
- 关联容器(自动排序,通常是红黑树实现): set(集合)、map(键值对映射)。
- 无序关联容器(C++11起,哈希表实现,查找极快):unordered_set、unordered_map。
2. 算法(Algorithms)
算法是用来对数据进行处理的一些函数集合。其中包含约 100 个通用函数,如排序(sort)、查找(find)、拷贝(copy)、累加(accumulate)等。
这些函数不直接操作容器,而是通过迭代器来操作容器,因此一套算法可以适用于多种容器。
3. 迭代器(Iterators)
迭代器 是一套连接 容器 和 算法 的 "指针"(实质是重载了 * 号运算符的对象)。
迭代器抽象了指针的行为,用来遍历和操作容器中的数据元素。
示例
使用 vector 存储整型数据,然后使用 sort 函数模版对 vector 内的数据进行排序,然后输出排序后的结果
// filename: stl_demo.cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(int argc, char * argv[]) {
// 创建一个用于存放整数的动态数组 numbers
vector<int> numbers = {11, 3, 7, 5};
numbers.push_back(9); // 追加一个整数
// 使用 迭代器遍历 numbers 中的所有整数
for (auto it = numbers.begin(); it != numbers.end(); it++)
cout << " " << *it;
cout << endl;
// 使用 sort 函数模板对 numbers进行排序
sort(numbers.begin(), numbers.end());
// 再次打印 numbers 中的所有整数
for (auto it = numbers.begin(); it != numbers.end(); it++)
cout << " " << *it;
cout << endl;
return 0;
}
编译和运行结果如下:
weimz@mzstudio:~$ g++ -o stl_demo stl_demo.cpp
weimz@mzstudio:~$ ./stl_demo
11 3 7 5 9
3 5 7 9 11