语言特性
标准模板库
一些常用的库。
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 | , | 逗号操作符 | 从左到右 |