下面这份清单整理了 30 个 C++ 竞赛高频函数,每个都给出「所在头文件」「一句话作用」「原型」「常用写法 / 注意点」四个维度,赛前 10 min 扫一遍即可快速回忆。
一、算法头文件 <algorithm>
| # | 函数 | 一句话作用 | 原型 / 示例 |
|---|---|---|---|
| 1 | sort | 区间排序 | sort(a, a+n); 默认升序 |
| 2 | stable_sort | 稳定排序 | stable_sort(v.begin(), v.end()); |
| 3 | partial_sort | 部分排序 | partial_sort(a, a+k, a+n); 前 k 小 |
| 4 | nth_element | 选第 k 小 | nth_element(a, a+k, a+n); O(n) |
| 5 | binary_search | 二分存在性 | bool ok=binary_search(a, a+n, x); |
| 6 | lower_bound | ≥x 首个位置 | int p=lower_bound(a, a+n, x)-a; |
| 7 | upper_bound | >x 首个位置 | int p=upper_bound(a, a+n, x)-a; |
| 8 | max_element | 最大元素迭代器 | auto it=max_element(a, a+n); |
| 9 | min_element | 最小元素迭代器 | auto it=min_element(a, a+n); |
| 10 | minmax_element | 一次求最大最小 | auto [mn,mx]=minmax_element(a, a+n); |
| 11 | reverse | 区间反转 | reverse(s.begin(), s.end()); |
| 12 | rotate | 循环左移 | rotate(a, a+k, a+n); 把 k 提最前 |
| 13 | next_permutation | 下一个字典序 | while(next_permutation(a, a+n)); |
| 14 | prev_permutation | 上一个字典序 | 同上,反方向 |
| 15 | unique | 去重(先排序) | int m=unique(a, a+n)-a; |
| 16 | merge | 归并两个有序区间 | merge(a, a+n1, b, b+n2, c); |
| 17 | inplace_merge | 就地归并 | inplace_merge(a, a+m, a+n); |
| 18 | count | 计数等于 | int c=count(a, a+n, val); |
| 19 | count_if | 条件计数 | count_if(first, last, pred); |
| 20 | find | 线性查找 | auto it=find(a, a+n, val); |
| 21 | find_if | 条件查找 | find_if(first, last, pred); |
| 22 | equal | 两区间相等 | bool ok=equal(a, a+n, b); |
| 23 | swap | 交换两对象 | swap(x, y); |
| 24 | fill | 区间赋相同值 | fill(a, a+n, 0); |
| 25 | iota | 递增赋值 | iota(a, a+n, start); C++11 |
二、数值头文件 <numeric>
| # | 函数 | 一句话作用 | 原型 / 示例 |
|---|---|---|---|
| 26 | accumulate | 求和 / 自定义累积 | long long s=accumulate(a, a+n, 0LL); |
| 27 | gcd | 最大公约数 | int g=gcd(a, b); C++17 |
| 28 | lcm | 最小公倍数 | int l=lcm(a, b); C++17 |
| 29 | inner_product | 内积 / 自定义 | inner_product(a, a+n, b, init); |
三、字符串 / 字符处理
| # | 函数 | 一句话作用 | 原型 / 示例 |
|---|---|---|---|
| 30 | to_string | 数值转 string | string s=to_string(1234); |
| 31 | stoi / stol / stoll | string 转整数 | int x=stoi(s); |
| 32 | isdigit | 字符是否数字 | if(isdigit(ch)) ... 头文件 <cctype> |
| 33 | isalpha | 字符是否字母 | 同上 |
| 34 | isalnum | 字母或数字 | 同上 |
| 35 | tolower / toupper | 大小写转换 | putchar(tolower(ch)); |
四、数学函数 <cmath>(选 5 个最常用)
| # | 函数 | 一句话作用 | 原型 / 示例 |
|---|---|---|---|
| 36 | abs / labs / llabs | 整数绝对值 | long long x=llabs(a); |
| 37 | fabs | 浮点绝对值 | double x=fabs(-3.14); |
| 38 | sqrt | 平方根 | int r=(int)sqrt(n); 注意强转 |
| 39 | pow | 幂运算 | double p=pow(x, 3.0); 浮点版本 |
| 40 | ceil / floor / round | 上 / 下 / 四舍五入 | int c=ceil(2.3); → 3 |
五、内存与容器小工具
| # | 函数 | 一句话作用 | 原型 / 示例 |
|---|---|---|---|
| 41 | memset | 按字节填充 | memset(a, 0, sizeof a); 仅 0 / -1 安全 |
| 42 | memcpy | 块拷贝 | memcpy(dst, src, n*sizeof(T)); |
| 43 | __builtin_popcount | int 二进制 1 个数 | int c=__builtin_popcount(x); GCC |
| 44 | __builtin_clz | 前导 0 个数 | int lz=__builtin_clz(x); 返回 0~31 |
| 45 | __lg | 向下取 log2 | int k=__lg(n); 等价于 31-__builtin_clz(n) |
使用小贴士
-
所有
<algorithm>函数都接受「半开区间」[first, last)。 -
自定义排序 / 比较器可用 lambda:
sort(a, a+n, [](int x, int y){ return x > y; }); -
整型取绝对值用
std::abs会自动匹配重载;64 位请用llabs或std::int64_t版本。 -
memset按字节赋值,只能安全置 0 或 -1(全 0xFF),不要用于浮点或 vector。 -
若比赛环境支持 C++20,可用
std::popcount、std::bit_ceil等替代内置函数,提高移植性。
把这份清单打印/手抄一份,赛前 5 min 翻一遍,基本可覆盖 90% 以上常见需求。祝 AC 愉快!