C++ STL 教程


C++ STL 教程

STL,即 Standard Template Library,是一个强大的 C++ 库,提供了很多数据结构和算法。它包含了常用的容器类(如 vector、list、set、map),以及常用的算法(如排序、查找、遍历等)。

STL 主要分为三个部分:容器、算法和迭代器。

容器

容器是数据结构的封装,STL 提供了很多常用的容器类,包括:

  1. vector:动态数组,可以快速访问元素
  2. list:双向链表,可以在任何位置添加或删除元素
  3. deque:双端队列,可以在队列两端添加或删除元素
  4. set:集合,可以快速查找元素
  5. map:映射表,将键映射到值的容器

容器的使用方式相似,都需要通过模板定义类型,例如:

vector<int> v; // 声明一个整型向量
v.push_back(1); // 向量尾部添加元素
v.push_back(2);
v.push_back(3);

for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
    cout << *it << " ";
}
// 输出:1 2 3

上述代码创建了一个整型向量 v,并向其中添加了三个元素。接着通过迭代器遍历整个向量,并输出其中的元素。

算法

STL 提供了许多常用的算法,包括:

  1. 排序算法:sort、stable_sort、partial_sort 等
  2. 查找算法:find、count、binary_search 等
  3. 数值算法:accumulate、inner_product、partial_sum 等
  4. 复制和替换算法:copy、replace、swap 等

算法通常以函数的形式提供,例如:

int a[] = {1, 2, 3, 4, 5};
int b[] = {4, 5, 6, 7, 8};
vector<int> v(10);

sort(a, a+5); // 将数组 a 排序
merge(a, a+5, b, b+5, v.begin()); // 将 a 和 b 归并,并将结果存储在 v 中

for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
    cout << *it << " ";
}
// 输出:1 2 3 4 4 5 5 6 7 8

上述代码通过 sort 将数组 a 中的元素进行排序,然后通过 merge 将 a 和 b 归并,并将结果存储在向量 v 中。最后通过迭代器遍历整个向量,并输出其中的元素。

迭代器

迭代器是 STL 最重要的概念之一,它提供了一种访问容器元素的方式。迭代器有以下几种类型:

  1. 输入迭代器(Input Iterator):可读取序列中的元素
  2. 输出迭代器(Output Iterator):可写入序列中的元素
  3. 前向迭代器(Forward Iterator):可读写序列中的元素,可以实现自增运算符
  4. 双向迭代器(Bidirectional Iterator):与前向迭代器类似,但可以实现自减运算符
  5. 随机访问迭代器(Random Access Iterator):可在常数时间内跳转到序列中的任何位置,可以实现自增、自减和指针运算符

不同类型的迭代器支持不同的操作,例如输入迭代器只支持 ++ 和 * 运算符,而随机访问迭代器还支持 – 和指针运算符。因此,在使用迭代器时应该根据实际需求选择合适的迭代器类型。

vector<int> v(10);
vector<int>::iterator it = v.begin();

*it = 1; // 通过迭代器设置第一个元素的值
it++; // 将迭代器移动到第二个元素

for (int i = 0; i < 10; i++) {
    cout << v[i] << " ";
}
// 输出:1 0 0 0 0 0 0 0 0 0

上述代码创建了一个初始值为 0 的整型向量 v,并通过迭代器修改了第一个元素的值。接着通过迭代器遍历整个向量,并输出其中的元素。

总结

STL 是一个十分强大的 C++ 库,提供了许多常用的容器和算法,使得编写高效、简洁的代码变得十分容易。在实际应用中,应该根据具体需求来选择合适的容器和算法,并熟练掌握迭代器的使用方法。