语言特性
标准模板库
一些常用的库函数。
__buildin 位运算
高效位运算,
bit库的替代品。
注意在给 64 位整数使用时须在函数名末尾添加
ll。
__builtin_ctz():返回括号内数的二进制表示数末尾 0
的个数。
__buitlin_clz():返回括号内数的二进制表示数前导 0
的个数。
__builtin_popcount():返回括号内数的二进制表示数 1
的个数。
__builtin_parity():判断括号中数的二进制表示数 1
的个数的奇偶性(偶数返回 0 ,奇数返回 0 )。
algorithm 库
algorithm库提供通用算法函数(如sort、find、reverse、max),用于排序、搜索、遍历及容器操作,支持迭代器模式,适用于数据批量处理和竞赛编程优化。
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()):将有序序列
v1 和 v2 合并到序列 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库提供字符串处理功能(如find、substr、stoi),用于文本操作、转换及解析,支持动态内存管理和高效字符串算法,适用于输入处理、数据格式化及竞赛编程中的文本需求。
to_string(value):将值 value
转化为字符串。
stoi(str):将字符串 str
转化为有符号整数。
stof(str):将字符串 str
转化为浮点数数。
cctype 库
cctype库提供字符处理函数(如isdigit、isalpha、toupper),用于字符分类、转换及验证,支持基于 ASCII 的高效文本操作,适用于输入解析或格式化处理。
isalnum(ch):检查字符 ch 是否为字母或数字。
isalpha(ch):检查字符 ch 是否为字母。
islower(ch):检查字符 ch 是否为小写字符。
isupper(ch):检查字符 ch 是否为大写字符。
isdigit(ch):检查字符 ch 是否为数字。
ispunct(ch):检查字符是否为标点符,默认环境下(!“#$%&’()*+,-./:;<=>?@[]^_`{|}~\)为标点。
numeric 库
numeric库提供数值计算函数(如accumulate、inner_product、partial_sum和adjacent_difference),用于累加、内积、前缀和及差分等算法操作。
gcd(m, n):计算整数 m 和 n
的最大公约数。
lcm(m, n):计算整数 m 和 n
的最小公倍数。
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库提供数学计算函数(如sqrt、pow、abs、sin),涵盖数值运算、几何计算及科学问题,支持浮点和整数类型的数学操作与常用算法需求。
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_zero、bit_ceil、byteswap),用于位计数、掩码生成和字节序转换,支持高效位运算及数值优化。
使用
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 | auto x = 5; // int |
范围 for 循环:引入了范围 for 循环的语法(元素:容器),遍历容器更简洁 。
1 | vector<int> v = {1, 2, 3, 4, 5}; |
Lambda 表达式:引入了 Lambda 表达式,可以方便地定义匿名函数对象 。
1 | auto lambda = [](int x, int y) { return x + y; }; |
c++14
泛型 Lambda 表达式:在 Lambda 表达式中使用 auto
关键字进行类型推导 。
1 | auto add = [](auto a, auto b) { return a + b; }; // 匿名函数更加灵活 |
二进制字面量:可以方便地表示二进制数值 。
1 | int binaryValue = 0b1101; // 表示二进制值 1101 ,即十进制的 13 |
c++17
结构化绑定:可以方便地解构数据结构中的成员变量 。
1 | pair<int, int> p{1, 2}; |
c++20
范围(Ranges):为处理序列数据提供了统一的接口 。
1 | vector<int> v = {5, 3, 9, 1, 6}; |
运算符优先级
| 优先级 | 操作符 | 描述 | 结合性 |
|---|---|---|---|
| 1 | () [] -> . :: ++ – |
调节优先级的括号操作符 数组下标访问操作符 通过指向对象的指针访问成员的操作符 通过对象本身访问成员的操作符 作用域操作符 后置自增操作符 后置自减操作符 |
从左到右 |
| 2 | ! ~ ++ – - + * & (type) sizeof |
逻辑取反操作符 按位取反 (按位取补) 前置自增操作符 前置自减操作符 一元取负操作符 一元取正操作符 解引用操作符 取地址操作符 类型转换操作符 返回对象占用的字节数操作符 |
从右到左 |
| 3 | ->* .* |
在指针上通过指向成员的指针访问成员的操作符 在对象上通过指向成员的指针访问成员的操作符 |
从左到右 |
| 4 | * / % |
乘法操作符 除法操作符 取余数操作符 |
从左到右 |
| 5 | + - |
加法操作符 减法操作符 |
从左到右 |
| 6 | << >> |
按位左移操作符 按位右移操作符 |
从左到右 |
| 7 | < <= > >= |
小于比较操作符 小于或等于比较操作符 大于比较操作符 大于或等于比较操作符 |
从左到右 |
| 8 | == != |
等于比较操作符 不等于比较操作符 |
从左到右 |
| 9 | & | 按位与操作符 | 从左到右 |
| 10 | ^ | 按位异或操作符 | 从左到右 |
| 11 | | | 按位或操作符 | 从左到右 |
| 12 | && | 逻辑与操作符 | 从左到右 |
| 13 | || | 逻辑或操作符 | 从左到右 |
| 14 | ? : | 三元条件操作符 | 从右到左 |
| 15 | = ?= |
赋值操作符 任意复合赋值操作符 |
从右到左 |
| 16 | , | 逗号操作符 | 从左到右 |



