Skip to content

C++头文件小记

STL 主要头文件速查与竞赛用法

STL头文件清单与bits/stdc++.h

在C++中,每个标准库组件都有对应的头文件。正确包含头文件是使用它们的前提。

1. 竞赛“万能头文件” - <bits/stdc++.h>

  • 这是什么? 这是一个GCC编译器特有的头文件,它包含了几乎所有标准C++库头文件
  • 优点:在编程竞赛中,你只需要在代码开头写一行 #include <bits/stdc++.h>,就无需再关心其他头文件,极大节省时间。
  • 缺点
    1. 非标准:只适用于GCC/Clang等编译器,不保证在所有C++编译环境(如Visual Studio)中可用。
    2. 编译慢:因为它包含的内容巨大,会显著增加编译时间(但在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 (优先队列/堆)注意queuestack 是容器适配器。
<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, memcpyC风格字符串和内存操作,在竞赛中memset常用于初始化数组。
<climits>INT_MAX, INT_MIN, LLONG_MAX整型极限值常量。
<cstdio>printf, scanf, getcharC风格输入输出,如果你要与cin/cout混用(不推荐加速后混用)。

3. 如何选择?Deepseek的建议

  1. 日常练习与比赛

    • 统一使用 #include <bits/stdc++.h>
    • 加上标准命名空间和加速语句,形成你的竞赛代码模板
    cpp
    #include <bits/stdc++.h>
    using namespace std;
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(0);
        // 你的代码逻辑
        return 0;
    }
  2. 当你不使用万能头时(例如在某些课程作业中)

    • 根据你要用的组件,包含对应的头文件。
    • 黄金法则:如果你用了 vector,就包含 <vector>;如果你用了 sort,就包含 <algorithm>;如果你用了 pair,就包含 <utility>
    • 一个常见的最小集合是:<iostream>, <vector>, <algorithm>, <string>,这覆盖了大部分基础题目。
  3. 特别注意

    • <algorithm> 并不包含 <vector><string> 等容器。容器和算法是分离的。
    • 虽然 <iostream> 间接包含了 <ios_base> 等,但显式写出你依赖的头文件是好习惯(除非用万能头)。
    • 优先使用C++头文件(如 <cmath>),而非C头文件(如 <math.h>)。