847 字
2 分钟
【CPP】STL
2026-04-02

概述#

STL(Standard Template Library)是 C++ 标准库中基于模板的容器、迭代器、算法、仿函数、适配器、空间配置器的集合。

  • 高复用:同一套组件适配多种类型。
  • 高性能:如 vector 连续内存、sort 优化实现。
  • 可移植:符合标准的编译器均提供。

六大组件#

组件作用
容器存储数据
迭代器泛化指针,统一访问接口
算法操作区间内元素
仿函数可调用对象,定制算法行为
适配器改造容器/迭代器/仿函数接口
空间配置器内存分配与对象构造析构(对使用者多透明)

迭代器#

广义指针:可解引用、可前进,使算法与容器解耦。

每个容器定义 iterator / const_iterator,以及 C++11 起的 cbegin() 等。

五类迭代器(由弱到强)#

类别能力典型容器
输入 (Input)读、单遍istream_iterator
输出 (Output)写、单遍ostream_iterator
前向 (Forward)读/写、多遍forward_list
双向 (Bidirectional)前进 + 后退list, set, map
随机访问 (Random Access)+ - []、常数距离vector, deque

算法对迭代器有最低要求(如 sort 需随机访问)。

序列式容器#

vector#

  • 动态数组,连续内存。
  • 典型实现:_start_finish_end_of_storage 三指针。
  • 尾部 push_back 均摊 O(1);中间插入/删除 O(n)。
  • 扩容:新容量常为 1.5 或 2 倍(实现相关);扩容后所有迭代器、指针、引用失效。
std::vector<int> v = {1, 2, 3};
v.reserve(100); // 只扩容量,不改变 size
v.push_back(4);
v.shrink_to_fit(); // 请求归还多余容量(非强制)

list#

  • 双向链表,非连续;任意位置插入/删除 O(1),随机访问。
  • 成员:sort()merge()unique()splice()
  • 不能用标准 sort(需随机访问迭代器),用 list::sort

deque#

  • 分段连续缓冲区 + 中控 map;头尾插入 O(1),随机访问略慢于 vector
  • capacity() / reserve()

关联式容器#

底层多为红黑树(平衡二叉搜索树),有序,查找 O(log n)。

容器重复键
set= 值
multiset= 值
mappair<const K, V>映射
multimap同上映射
std::map<std::string, int> scores;
scores["alice"] = 90;
std::set<int> s = {3, 1, 2}; // 自动排序去重(set 内唯一)

自定义类型作键需提供严格弱序比较(或 C++20 透明比较 / 自定义哈希用于 unordered_*)。

无序关联容器(补充)#

unordered_map / unordered_set:哈希表,平均 O(1) 查找,无序。

容器适配器#

适配器默认底层特点
stackdeque栈顶操作,无迭代器
queuedeque队头队尾
priority_queuevector + 堆堆顶最值
std::stack<int> st;
st.push(1);
st.top();

算法#

通过迭代器区间 [first, last) 操作,与容器分离。

  • 质变:修改区间内容 — copy, fill, sort, remove, transform
  • 非质变:只读 — find, count, for_each(若仿函数写元素则例外)
std::vector<int> v = {3, 1, 4, 1, 5};
std::sort(v.begin(), v.end());
auto it = std::find(v.begin(), v.end(), 4);

仿函数(函数对象)#

重载 operator() 的类型,可带状态:

struct Greater {
bool operator()(int a, int b) const { return a > b; }
};
std::sort(v.begin(), v.end(), Greater{});
// 或 std::sort(v.begin(), v.end(), std::greater<int>{});

谓词:返回 bool 的仿函数,如 std::lessstd::equal_to

内建仿函数plus, minus, multiplies, less, logical_and 等。

适配器#

  • stack / queue / priority_queue:容器适配器。
  • reverse_iteratorinsert_iterator:迭代器适配器。
  • bind1st / bind2nd(C++11 前常用,现多被 lambda 与 std::bind 替代)。

容器选择策略#

需求推荐
随机访问、尾部增删多vector
中间频繁插入删除、不需随机访问list
头尾频繁操作deque
有序、去重、只关心键set
键值映射map
只需快速查找、不关心顺序unordered_map / unordered_set
LIFO / FIFOstack / queue

C++11 相关(与 STL 配合)#

  • autonullptr、范围 for:for (auto& x : v)
  • Lambdastd::sort(v.begin(), v.end(), [](int a, int b){ return a > b; });
  • 移动语义:push_back(std::move(x)) 减少拷贝
分享

如果这篇文章对你有帮助,欢迎分享给更多人!

【CPP】STL
https://lysj.work/posts/studynotes/cpp/cppstl/
作者
Sekiro
发布于
2026-04-02
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录