C++头文件小记
STL 主要头文件速查与竞赛用法
STL头文件清单与bits/stdc++.h
在C++中,每个标准库组件都有对应的头文件。正确包含头文件是使用它们的前提。
1. 竞赛“万能头文件” - <bits/stdc++.h>
- 这是什么? 这是一个GCC编译器特有的头文件,它包含了几乎所有标准C++库头文件。
- 优点:在编程竞赛中,你只需要在代码开头写一行
#include <bits/stdc++.h>,就无需再关心其他头文件,极大节省时间。 - 缺点:
- 非标准:只适用于GCC/Clang等编译器,不保证在所有C++编译环境(如Visual Studio)中可用。
- 编译慢:因为它包含的内容巨大,会显著增加编译时间(但在OJ上提交评测时无影响)。
- 竞赛建议:在ICPC、Codeforces、LeetCode等支持的环境下,强烈推荐使用。可以为你节省大量时间,并避免忘记包含头文件的错误。
2. 标准头文件分类清单(了解与查阅) 即使使用万能头,了解组件与头文件的对应关系也至关重要。以下是按功能分类的常用头文件列表:
| 头文件 | 包含的典型内容 | 说明与竞赛用途 |
|---|---|---|
| 容器 (Containers) | ||
<vector> | vector (动态数组) | 最常用的序列容器,替代C数组。 |
<string> | string (字符串类) | 字符串处理,比char[]方便安全。 |
<deque> | deque (双端队列) | 两端都能快速插入删除。 |
<list> | list (双向链表) | 支持常数时间的任意位置插入删除。 |
<set> | set, multiset | 有序集合/多重集合(基于红黑树)。 |
<map> | map, multimap | 有序键值对映射(基于红黑树)。 |
<unordered_set> | unordered_set, unordered_multiset | 哈希集合,通常比set更快(不排序)。 |
<unordered_map> | unordered_map, unordered_multimap | 哈希映射,通常比map更快(不排序)。 |
<queue> | queue (队列), priority_queue (优先队列/堆) | 注意:queue 和 stack 是容器适配器。 |
<stack> | stack (栈) | |
| 算法 (Algorithms) | ||
<algorithm> | sort, find, reverse, next_permutation, max, min, swap... | 算法库核心,包含绝大多数常用算法。 |
<numeric> | accumulate(求和), gcd, lcm, iota(填充序列) | 数值运算相关算法。 |
| 迭代器与工具 | ||
<iterator> | begin(), end(),迭代器相关工具 | 通常被其他容器头文件包含,很少直接使用。 |
<utility> | pair, make_pair, swap | 实用工具,pair非常常用。 |
| 输入输出 | ||
<iostream> | cin, cout, endl | 标准输入输出流。 |
<fstream> | ifstream, ofstream | 文件流,用于读写文件(某些题需要)。 |
| 其他常用 | ||
<cmath> | sqrt, pow, sin, abs(浮点版) | C++版本的数学库,优先于C的<math.h>。 |
<cstring> | strlen, strcmp, memset, memcpy | C风格字符串和内存操作,在竞赛中memset常用于初始化数组。 |
<climits> | INT_MAX, INT_MIN, LLONG_MAX | 整型极限值常量。 |
<cstdio> | printf, scanf, getchar | C风格输入输出,如果你要与cin/cout混用(不推荐加速后混用)。 |
3. 如何选择?Deepseek的建议
日常练习与比赛:
- 统一使用
#include <bits/stdc++.h>。 - 加上标准命名空间和加速语句,形成你的竞赛代码模板:
cpp#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0); // 你的代码逻辑 return 0; }- 统一使用
当你不使用万能头时(例如在某些课程作业中):
- 根据你要用的组件,包含对应的头文件。
- 黄金法则:如果你用了
vector,就包含<vector>;如果你用了sort,就包含<algorithm>;如果你用了pair,就包含<utility>。 - 一个常见的最小集合是:
<iostream>,<vector>,<algorithm>,<string>,这覆盖了大部分基础题目。
特别注意:
<algorithm>并不包含<vector>或<string>等容器。容器和算法是分离的。- 虽然
<iostream>间接包含了<ios_base>等,但显式写出你依赖的头文件是好习惯(除非用万能头)。 - 优先使用C++头文件(如
<cmath>),而非C头文件(如<math.h>)。