C++ STL 教程
现代 C++:标准模板库 (STL)
Section titled “现代 C++:标准模板库 (STL)”假设你已经掌握了 C++ 模板(Templates)的基础知识,现在让我们深入学习 C++ 标准模板库(Standard Template Library,简称 STL)。STL 是现代 C++ 开发的基石,提供了一组强大的模板类和函数。它提供了常用算法和数据结构(如向量(动态数组)、链表、队列、映射等)的现成实现,从而节省了开发时间并促进了代码重用。
STL 构建在三个基本支柱之上:
| 组件 | 描述 |
|---|---|
| 容器(Containers) | 存储其他对象(元素)集合的对象。例如 std::vector、std::list、std::map、std::set。它们自动管理内存。 |
| 算法(Algorithms) | 对元素范围(通常在容器内)执行操作的函数。例如 std::sort、std::find、std::copy、std::accumulate。它们旨在通过迭代器高效地与不同容器类型协同工作。 |
| 迭代器(Iterators) | 行为类似于通用指针的对象,用于遍历容器(或其他序列)中的元素。它们提供了一个统一的接口,供算法访问容器元素,从而将算法与具体的容器实现解耦。 |
这三个组件无缝地协同工作。例如,你可以使用 STL 算法(如 std::sort)通过向量提供的迭代器指定要排序的范围,来对 STL 容器(如 std::vector)中的元素进行排序。
让我们看看 std::vector,它是一个自动管理大小的动态数组(dynamic array):
#include <iostream>#include <vector>#include <string> // Often useful, though not strictly needed for this example
int main() { // 创建一个用于存储整数的向量 std::vector<int> vec;
// 显示 vec 的初始大小 std::cout << "Initial vector size = " << vec.size() << std::endl;
// 使用 push_back 向向量添加 5 个值 // push_back 在末尾添加元素 for (int i = 0; i < 5; ++i) { vec.push_back(i * 10); // 添加 0, 10, 20, 30, 40 }
// 显示 vec 扩展后的大小 std::cout << "Extended vector size = " << vec.size() << std::endl;
// 使用下标运算符 [] 访问值(类似于数组) std::cout << "Accessing values using []:" << std::endl; for (size_t i = 0; i < vec.size(); ++i) { // 对索引使用 size_t 类型 std::cout << "value of vec[" << i << "] = " << vec[i] << std::endl; }
// 使用基于范围的 for 循环访问值(现代 C++) std::cout << "Accessing values using range-based for loop:" << std::endl; for (int val : vec) { std::cout << "Value = " << val << std::endl; }
// 使用迭代器访问值(显式) std::cout << "Accessing values using iterators:" << std::endl; // 使用 'auto' 进行类型推断(现代 C++) for (auto it = vec.begin(); it != vec.end(); ++it) { std::cout << "Value via iterator = " << *it << std::endl; }
// 使用 STL 算法(示例:find) auto it_find = std::find(vec.begin(), vec.end(), 30); if (it_find != vec.end()) { std::cout << "Found value 30 at index: " << std::distance(vec.begin(), it_find) << std::endl; } else { std::cout << "Value 30 not found." << std::endl; }
return 0;}编译(例如,g++ your_file.cpp -o program -std=c++11)并执行上述代码后,将产生类似以下的输出:
Initial vector size = 0Extended vector size = 5Accessing values using []:value of vec[0] = 0value of vec[1] = 10value of vec[2] = 20value of vec[3] = 30value of vec[4] = 40Accessing values using range-based for loop:Value = 0Value = 10Value = 20Value = 30Value = 40Accessing values using iterators:Value via iterator = 0Value via iterator = 10Value via iterator = 20Value via iterator = 30Value via iterator = 40Found value 30 at index: 3示例中的要点:
- 需要
#include <vector>来使用std::vector。 vec.push_back(value)在末尾添加一个元素,如果需要则调整大小。vec.size()返回当前元素的数量。- 可以使用
[]像数组一样访问元素(注意边界)。 - 基于范围的 for 循环(
for (int val : vec))提供了一种简洁的方式来迭代元素。 vec.begin()返回指向第一个元素的迭代器。vec.end()返回指向最后一个元素之后的迭代器。auto简化了迭代器声明(auto it = vec.begin();)。- STL 算法(如
std::find)在迭代器范围上操作。
STL 提供了更多的容器(std::list、std::map、std::set、std::unordered_map 等)和算法,它们构成了高效且可维护的 C++ 代码的基础。深入探索这些内容对于高级 C++ 编程至关重要。你可以在 cppreference.com 等网站上找到全面的文档。