Skip to content

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 = 0
Extended vector size = 5
Accessing values using []:
value of vec[0] = 0
value of vec[1] = 10
value of vec[2] = 20
value of vec[3] = 30
value of vec[4] = 40
Accessing values using range-based for loop:
Value = 0
Value = 10
Value = 20
Value = 30
Value = 40
Accessing values using iterators:
Value via iterator = 0
Value via iterator = 10
Value via iterator = 20
Value via iterator = 30
Value via iterator = 40
Found 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 等网站上找到全面的文档。