一、什么是 STLSTL 是 C 标准库的核心组成部分它封装了常见的数据结构动态数组、链表、映射、集合等和算法排序、查找、叠加等并且全部通过模板实现与类型无关。你只需要关注“什么数据结构”和“什么算法”而不是“什么类型”。二、STL 的版本STL 经历了多个版本的演变HP 版本Alexander Stepanov 在惠普实验室完成的原始版本所有实现的始祖开源P.J. 版本被 Windows Visual C 采用不能公开修改可读性低RW 版本被 C Builder 采用不能公开修改SGI 版本被 GCC/Linux 采用开源、可移植性好、可读性高是学习源码的主要参考三、STL 的六大组件STL 由六大组件构成它们相互配合构成了一个完整的生态1. 容器Container容器用于存储数据分为序列式容器vector、list、deque、array和关联式容器set、map、multiset、multimap。C11 还增加了无序关联容器unordered_set、unordered_map。示例 1vector 和 list 的基本使用#include iostream#include vector#include listint main() {// vector动态数组强项是随机访问std::vectorint vec {1, 2, 3, 4, 5};vec.push_back(6); // 尾部插入std::cout vec[2] vec[2] \n; // O(1) 随机访问// list双向链表强项是任意位置插入删除std::listint lst {10, 20, 30};lst.push_front(0); // 头部插入也是 O(1)lst.push_back(40); // 尾部插入 O(1)std::cout list front: lst.front() \n;return 0;}2. 算法Algorithm算法处理容器中的数据如排序、查找、统计等。STL 提供了超过 100 种算法全部以模板函数形式存在。示例 2常见 STL 算法#include iostream#include vector#include algorithm#include numericint main() {std::vectorint v {5, 2, 8, 1, 9, 3};// sort排序默认升序std::sort(v.begin(), v.end());// 查找 8auto it std::find(v.begin(), v.end(), 8);if (it ! v.end())std::cout Found: *it \n;// accumulate求和int sum std::accumulate(v.begin(), v.end(), 0);std::cout Sum: sum \n;// 输出排序后的数组for (int x : v) std::cout x ;std::cout \n;return 0;}3. 迭代器Iterator迭代器是容器和算法之间的纽带——它抽象了“指针”的概念让算法可以通用地处理任意容器。在之前学习 C 入门时提到的 auto 关键字最常见的使用场景就是简化迭代器类型的声明。示例 3三种常见迭代器用法#include iostream#include vector#include setint main() {std::vectorint v {10, 20, 30, 40};// 写法 1显式声明迭代器类型太长for (std::vectorint::iterator it v.begin(); it ! v.end(); it)std::cout *it ;std::cout \n;// 写法 2使用 auto 简化推荐for (auto it v.begin(); it ! v.end(); it)std::cout *it ;std::cout \n;// 写法 3范围 for最简洁for (int x : v) std::cout x ;std::cout \n;// set 是自平衡二叉检索树自动排序std::setint s {3, 1, 4, 1, 5, 9};for (auto it s.begin(); it ! s.end(); it)std::cout *it ; // 输出: 1 3 4 5 9std::cout \n;return 0;}4. 仿函数Functor仿函数是重载了 operator() 的类对象可以像函数一样被调用。它常被用于自定义排序规则或算法的行为。示例 4仿函数自定义排序规则#include iostream#include vector#include algorithm// 仿函数降序排序struct Descending {bool operator()(int a, int b) const {return a b;}};int main() {std::vectorint v {5, 2, 8, 1, 9};// 使用仿函数指定排序规则std::sort(v.begin(), v.end(), Descending());for (int x : v) std::cout x ; // 9 8 5 2 1std::cout \n;// 也可以直接使用 STL 提供的仿函数std::sort(v.begin(), v.end(), std::greaterint());return 0;}5. 适配器Adapter适配器用于修改容器或仿函数的接口。stack 和 queue 就是常见的容器适配器——它们的底层由 deque 实现但对外提供了不同的接口。示例 5容器适配器 stack 与 queue#include iostream#include stack#include queueint main() {// stack后进先出底层默认用 dequestd::stackint st;st.push(1); st.push(2); st.push(3);while (!st.empty()) {std::cout st.top() ; // 3 2 1st.pop();}std::cout \n;// queue先进先出std::queueint q;q.push(1); q.push(2); q.push(3);while (!q.empty()) {std::cout q.front() ; // 1 2 3q.pop();}std::cout \n;// priority_queue优先级队列默认大顶堆std::priority_queueint pq;pq.push(3); pq.push(1); pq.push(4);std::cout top pq.top() \n; // 4return 0;}6. 空间配置器Allocator空间配置器负责容器的内存分配与释放。它抽象了“对象构造/析构”与“内存分配/释放”让容器的实现与内存管理解耦。默认使用 allocatorT底层调用 operator new 和 operator delete。总结STL 是 C 语言中最伟大的作品之一它将常见的数据结构和算法封装成通用、高效、类型无关的库。接下来的几篇博客我们将逐一深入学习 vector、list、string 等常见容器的底层原理和实际使用技巧。