标准模板库

一些常用的库。

algorithm

algorithm 库提供通用算法函数(如 sortfindreversemax),用于排序、搜索、遍历及容器操作,支持迭代器模式,适用于数据批量处理和竞赛编程优化。

algorithm 库中的函数基本都有 ranges 版本。

基于比较的函数可传入 cmp 以指定比较函数。

find(v.begin(), v.end(), val):顺序查找,其中 val 为需要查找的值。

reverse(v.begin(), v.end()):翻转序列,如数组、字符串。

sort(v.begin(), v.end(), cmp):内省排序,不保持相对顺序,其中 cmp 为自定义的比较函数。

stable_sort(v.begin(), v.end(), cmp):归并排序,保持相对顺序,用法同 sort

unique(v.begin(), v.end()):将序列相邻的重复元素移动到序列末尾,返回指向去重后序列结尾的迭代器,原容器大小不变。与 sort 结合使用可以实现序列去重。

shuffle(v.begin(), v.end()):随机地打乱序列。

nth_element(v.begin(), v.begin() + n, v.end(), cmp):按指定范围进行分类,即找出序列中第 n 大的元素,使其左边均为小于它的数,右边均为大于它的数。

binary_search(v.begin(), v.end(), val):二分查找。其中 val 为需要查找的值。

merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin()):将有序序列 v1v2 合并到序列 v3

inplace_merge(v.begin() + l, v.begin() + m, v.begin() + r):将两个(已按小于运算符排序的):[l, m)[m, r) 范围原地合并为一个有序序列。

lower_bound(v.begin(), v.end(), val):在有序序列 v 中进行二分查找,返回指向第一个大于等于 val 的元素的迭代器。如果不存在这样的元素,则返回尾迭代器。

upper_bound(v.begin(), v.end(), val):在有序序列 v 中进行二分查找,返回指向第一个大于 val 的元素的迭代器。如果不存在这样的元素,则返回尾迭代器。

is_permutation(v1.begin(), v1.end(), v2.begin()):判断序列 v1 是否为 v2.begin() 指向的序列的排列,即排序后集合元素两两相同。

next_permutation(v.begin(), v.end()):将当前排列更改为全排列中的下一个排列。如果当前排列已经是全排列中的最后一个排列(元素完全从大到小排列),函数返回 false 并将排列更改为全排列中的第一个排列(元素完全从小到大排列);否则,函数返回 true 。

prev_permutation(v.begin(), v.end()):将当前排列更改为 全排列中的上一个排列,用法同 next_permutation

includes(v1.begin(), v1.end(), v2.begin(), v2.end()):判断序列 v1 是否包含序列 v2,不必是连续的。

max(a, b)max({a, b, ...}):返回两个数或初始化列表中元素的最大值。

min(a, b)min({a, b, ...}):返回两个数或初始化列表中元素的最小值。

max_element(v.begin(), v.end()):返回序列中最大元素的迭代器。

min_element(v.begin(), v.end()):返回序列中最小元素的迭代器。

clamp(v, l, r):如果 v 属于 [l, r] ,则返回 v ,否则返回最临近的边界。

is_partitioned(v.begin(), v.end(), pred):判断范围是否已按给定的谓词 pred 划分,即所有满足 pred 的元素都会在所有不满足的元素之前出现。

partition(v.begin(), v.end(), pred):划分序列中的元素,使得 pred 对其返回 true 的所有元素位于谓词 pred 对其返回 false 的所有元素之前。不保持相对顺序。

stable_partition(v.begin(), v.end(), pred):稳定划分,用法同 partition()。

partition_point(v.begin(), v.end(), pred):检查序列分区范围,并找到第一个分区的末尾,即不满足 p 的第一个元素,如果所有元素都满足 p ,则返回尾迭代器。

transform(v.begin(), v.end(), dest, op):应用给定的函数 op 到某个输入范围中的元素,并将结果存储到从 dest 指针指向的序列。

replace(v.begin(), v.end(), old_value, new_value):以 new_value 替换序列中所有值为 old_value 的元素。

string

string 库提供字符串处理功能(如 findsubstrstoi),用于文本操作、转换及解析,支持动态内存管理和高效字符串算法,适用于输入处理、数据格式化及竞赛编程中的文本需求。

to_string(value):将值 value 转化为字符串。

stoi(str):将字符串 str 转化为有符号整数。

stof(str):将字符串 str 转化为浮点数数。

cctype

cctype 库提供字符处理函数(如 isdigitisalphatoupper),用于字符分类、转换及验证,支持基于 ASCII 的高效文本操作,适用于输入解析或格式化处理。

isalnum(ch):检查字符 ch 是否为字母或数字。

isalpha(ch):检查字符 ch 是否为字母。

islower(ch):检查字符 ch 是否为小写字符。

isupper(ch):检查字符 ch 是否为大写字符。

isdigit(ch):检查字符 ch 是否为数字。

ispunct(ch):检查字符是否为标点符,默认环境下(!”#$%&’()*+,-./:;<=>?@[]^_`{|}~\)为标点。

numeric

numeric 库提供数值计算函数(如 accumulateinner_productpartial_sum 和 adjacent_difference),用于累加、内积、前缀和及差分等算法操作。

gcd(m, n):计算整数 mn 的最大公约数。

lcm(m, n):计算整数 mn 的最小公倍数。

midpoint(a, b):计算整数、浮点或指针 a 和 b 的中点。

lerp(a, b, t):如果参数 t 在 $[0, 1]$ 内,则计算 a 和 b 之间的线性插值,否则为线性外推,即 a + t * ( b - a )。

accumulate(v.begin(), v.end(), value):计算给定值 init 与一个序列中各元素的和。

iota(v.begin(), v.end(), value):用按顺序递增的值填充序列,从 value 开始,然后重复计算 ++value。

partial_sum(v.begin(), v.end(), dest):计算一个序列前缀和,并赋值给 dest 指针指向的序列。

adjacent_difference(v.begin(), v.end(), dest) :计算一个序列的差分,使用同前缀和。

cmath

cmath 库提供数学计算函数(如 sqrtpowabssin),涵盖数值运算、几何计算及科学问题,支持浮点和整数类型的数学操作与常用算法需求。

cmath 库函数一般接收浮点型输入和输出浮点型,注意精度损失。

如需更高精度,可以在函数名后添加 l 以强制指定 long double 类型运算。

abs(x):x 的绝对值。

exp(x):e 的 x 次幂。

pow(x,y):x 的 y 次幂。

log(x):以 e 为底 x 的对数。

log10(x):以 10 为底 x 的对数。

log2(x):以 e 为底 x 的对数。

sqrt(x):x 的平方根。

cbrt(x):x 的立方根。

hypot(x,y):计算 x 和 y 平方和的平方根。

ceil(x):向上取整,即不小于 x 的整数。

floor(x):向下取整,即不大于 x 的整数。。

round(x):四舍五入取整,不管正负。

trunc(x):向零取整,即舍去 x 的小数部分。

bit

bit 库提供底层位操作函数(如 countl_zerobit_ceilbyteswap),用于位计数、掩码生成和字节序转换,支持高效位运算及数值优化。

使用 bit 库需要 c++20 以上的版本。

以下函数介绍中 x 为无符号整型。

has_single_bit(x):检查 x 是否为二的整数次幂。

bit_ceil(x):向上取二的整数次幂,即不小于 x 的最小的二的整数次幂。

bit_floor(x):向下取二的整数次幂,即不大于 x 的最小的二的整数次幂。

bit_width(x):若 x 非零,计算 x 的二进制位数。若 x 为零,则返回零。

rotl(x, s):计算 x 左循环移位 s 位的结果。

rotr(x, s):计算 x 右循环移位 s 位的结果。

countl_zero(x):从最高位起计量连续的 0 位的数量。

countl_one(x):从最高位起计量连续的 1 位的数量。

countr_zero(x):从最低位起计量连续的 0 位的数量。

countr_one(x):从最低位起计量连续的 1 位的数量。

pop_count(x):返回 x 中数位 1 的个数。

c++ 版本特性

c++98

第一个官方标准,啥都没有。

c++11

自动类型推导:引入了 auto 关键字,可以根据初始化表达式自动推导出变量的类型。

1
2
3
4
5
6
7
8
auto x = 5;          // int
auto y = 5.0; // double
auto z = "Hello"; // const char*

vector<int> v = {1, 2, 3, 4, 5};
for (auto it = v.begin(); it != v.end(); ++it) {
cout << *it << " "; // 使用auto推导迭代器类型
}

范围 for 循环:引入了范围 for 循环的语法(元素:容器),遍历容器更简洁 。

1
2
vector<int> v = {1, 2, 3, 4, 5};
for (auto n : v) cout << n << " "; // 直接遍历容器中的元素

Lambda 表达式:引入了 Lambda 表达式,可以方便地定义匿名函数对象 。

1
2
auto lambda = [](int x, int y) { return x + y; };
cout << "Sum: " << lambda(5, 10) << endl; // 使用 Lambda 表达式计算和

c++14

泛型 Lambda 表达式:在 Lambda 表达式中使用 auto 关键字进行类型推导 。

1
2
3
4
5
6
auto add = [](auto a, auto b) { return a + b; }; // 匿名函数更加灵活
cout << add(5, 3) << endl; // 输出 8
cout << add(3.14, 2.56) << endl; // 输出 5.7

auto dfs = [](auto &&self, int u) { if (u) self(self, u--); };
dfs(dfs, 10); // 递归 Lambda 表达式。

二进制字面量:可以方便地表示二进制数值 。

1
2
int binaryValue = 0b1101; // 表示二进制值 1101 ,即十进制的 13
cout << binaryValue << endl; // 输出 13

c++17

结构化绑定:可以方便地解构数据结构中的成员变量 。

1
2
3
pair<int, int> p{1, 2};
auto [x, y] = p; // 结构化绑定,解构 pair 结构体
cout << x << ", " << y << endl; // 输出 1, 2

c++20

范围(Ranges):为处理序列数据提供了统一的接口 。

1
2
3
4
5
vector<int> v = {5, 3, 9, 1, 6};

ranges::sort(v, greater<>{});

for (int n : v | views::reverse) std::cout << n << ' '; // 逆序输出排序后的向量:1 3 5 6 9

运算符优先级

优先级 操作符 描述 结合性
1 ()
[]
->
.
::
++
调节优先级的括号操作符
数组下标访问操作符
通过指向对象的指针访问成员的操作符
通过对象本身访问成员的操作符
作用域操作符
后置自增操作符
后置自减操作符
从左到右
2 !
~
++

-
+
*
&
(type)
sizeof
逻辑取反操作符
按位取反 (按位取补)
前置自增操作符
前置自减操作符
一元取负操作符
一元取正操作符
解引用操作符
取地址操作符
类型转换操作符
返回对象占用的字节数操作符
从右到左
3 ->*
.*
在指针上通过指向成员的指针访问成员的操作符
在对象上通过指向成员的指针访问成员的操作符
从左到右
4 *
/
%
乘法操作符
除法操作符
取余数操作符
从左到右
5 +
-
加法操作符
减法操作符
从左到右
6 <<
>>
按位左移操作符
按位右移操作符
从左到右
7 <
<=
>
>=
小于比较操作符
小于或等于比较操作符
大于比较操作符
大于或等于比较操作符
从左到右
8 ==
!=
等于比较操作符
不等于比较操作符
从左到右
9 & 按位与操作符 从左到右
10 ^ 按位异或操作符 从左到右
11 | 按位或操作符 从左到右
12 && 逻辑与操作符 从左到右
13 || 逻辑或操作符 从左到右
14 ? : 三元条件操作符 从右到左
15 =
?=
赋值操作符
任意复合赋值操作符
从右到左
16 , 逗号操作符 从左到右