c++ & STL の 神奇用法
min()
与 max()
的列表版本
普通的 min()
与 max()
只能得到两个数的最值,但是这个版本可以得到许多数的最值.
例子:
1 |
|
时间复杂度:.
minmax_element(begin, end)
这个函数用于查询区间 的最大、最小值,返回一个 pair,first 最小,second 最大.
时间复杂度 .
shuffle(begin, end, gen) & is_sorted(begin, end)
这个函数可以随机打乱数组,其中 gen 是一个随机数生成器(一般为 mt19937),begin 与 end 为首尾迭代器,时间复杂度 .
is_sorted()
可以检查一个序列是否有序,时间复杂度为 .
iota(begin, end, value)
将区间 赋值为 等等.
时间复杂度为 .
可以用来初始化并查集等.
prev_permutation(begin, end) & next_permutation(begin, end)
两个求排列的函数,一个求上一个排列,一个求下一个排列.
当然,“排列” 存在相同元素也是可以的.
如果已经是第一个 / 最后一个排列,返回 false
,否则返回 true
,并将区间 更改为上 / 下一个排列.
时间复杂度:
count(begin, end, value) & count_if(begin, end, func) & replace(begin, end, value1, value2) & fill(begin, end, value) & copy(begin, end, begin2) & find(begin, end, value)
这六个函数都是区间赋值或检查类的.
这些函数的时间复杂度均为 .
-
count(begin, end, value)
返回区间 中值为 的个数. -
count_if(begin, end, func)
对于区间 中的一个值 ,返回func(x)
为 true 的个数。其中func
应为一个返回值为bool
,有一个参数的函数指针,也可以 函数. -
replace(begin, end, value1, value2)
将区间 的所有等于 的数替换为 . -
fill(begin, end, value)
将区间 全部设为 ,类似函数memset
. -
copy(begin, end, begin2)
将区间 复制到区间 . -
find(begin, end, value)
线性查找区间 中为 的数。对于有序区间,请使用lower_bound()
或upper_bound()
. -
accumulate(begin, end, value)
返回区间 中每一个元素加上初始值 的总和,即 .
时间复杂度为 .
accumulate(begin, end, value)
返回区间 中每一个元素加上初始值 的总和,即 .
时间复杂度为 .
partial_sum(begin, end, begin2) & adjacent_difference(bg1,ed1,bg2)
-
partial_sum(begin, end, begin2)
将区间 的前缀和存储至 中. -
adjacent_difference(bg1,ed1,bg2)
将区间 的差分存储至 中.
时间复杂度为 .
inplace_merge(begin, mid, end)
对区间 ) 和区间 进行归并排序,并存入区间 .
时空复杂度均为 . 可以传入第四个参数作为比较.
function<>
function<R<T1, T2, ..., Tn> > f;
表示定义一个返回值类型为 ,形参为 的名为 的函数.
1 |
|
显然,我们做到了在 C++ 里像 JavaScript 一样使用 lambda 函数了!
在这个类型出来之前,我们一般使用 auto 关键字(我也喜欢这样使用):
1 |
|
同样地,function<>
也可以作为函数指针,如下例:
1 |
|