ACM / 常用函数 · 2024-01-29

常用函数

max和min

max(a, b); min(a, b); max({a, b, c}); min({a, b, c});

sort

//用法
sort(begin, end);
//自定义排序
bool cmp(int x1,int x2) { return x1 < x2; }
sort(arr, arr + n, cmp);
//Lambda表达式
sort(arr, arr + n, [](int x1, int x2){ return x1 < x2; });

二分查找

binary_search

bool flag = binary_search(arr + l, arr + r, val); //查[l, r),找到结果为true,没有则为false
//binary_search利用的也是指针

lower_bound

lower_bound(arr + l, arr + r, val) //找到[l, r)第一个大于等于val的数
//返回地址,如果返回尾地址,则没找到

upper_bound

upper_bound(arr + l, arr + r, val) //找到[l, r)第一个严格大于val的数
//返回地址,如果返回尾地址,则没找到

equal_range

equal_range综合了lower_bound和upper_bound

pair<T, T> = equal_range(arr + l, arr + r, val); //返回pair类型
//等价于{lower_bound(arr + l, arr + r, val) ,upper_bound(arr + l, arr + r, val)}

copy

copy(arr1 + l, arr1 + r, arr2); //把arr1[l, r)的部分复制到arr2

copy_n

copy_n(arr1 + l, x, arr2); //把arr1[l, l + x)的部分复制到arr2

swap

swap(a, b); //交换a, b

replace

replace(arr + l, arr + r, oldV, newV); //把[l, r)区间的oldV全部替换为newV

fill

fill(arr + l, arr + r, val); //把[l, r)区间赋值为val

reverse

reverse(arr + l, arr + r); //把[l, r)区间反转

rotate

rotate(arr + l, arr + mid, arr + r); //滚动数组,arr + mid向前滚动,成为新的[l, r)区间首元素

find

find(arr + l, arr + r, val); //可用于对无序数组查找
//返回地址,如果返回尾地址,则没找到

find_end

find_end(arr1 + l, arr1 + r, arr2 + l, arr2 + r); //查询arr1中是否有子数组arr2
//返回地址,如果返回尾地址,则没找到

unique

unique的作用是“去掉”容器中相邻元素的重复元素

它实质上是一个伪去除,它会把重复的元素添加到容器末尾,而返回值是去重部分的尾地址

⚠ unique针对的是相邻元素,所以对于顺序错乱的数组成员,或者容器成员,需要先进行排序

unique(a.begin(), a.end()); //去重,将重复元素放在末尾

count

auto cnt = count(arr + l, arr + r, val); //统计[l, r)中val的个数

equal

bool flag = equal(arr1 + l, arr1 + r, arr2); //arr1的[l, r)区间是否与arr2相等
//找到结果为true,没有则为false

merge

merge(arr1, arr1 + n, arr2, arr2 + m, arr3); //将arr1,arr2有序合并为arr3,归并排序

includes

includes(arr1 + l, arr1 + r, arr2 + l, arr2 + r); //查询arr1中是否有子序列arr2

集合相关

set_union

其作用是求两个集合的并集,但是要求输入的两个集合必须是有序的

int len = set_union(arr1, arr1 + n1, arr2, arr2 + n2, arr3) - arr3;
//返回新集合大小

set_intersection

其作用是求两个集合的交集,但是要求输入的两个集合必须是有序的

int len = set_intersection(arr1, arr1 + n1, arr2, arr2 + n2, arr3) - arr3;
//返回新集合大小

set_difference

其作用是求两个集合的差(A - B),但是要求输入的两个集合必须是有序的

int len = set_difference(arr1, arr1 + n1, arr2, arr2 + n2, arr3) - arr3;
//返回新集合大小

set_symmetric_difference

其作用是求两个集合的对称差集 AB = ( AB )∪( BA ) ,但是要求输入的两个集合必须是有序的

int len = set_symmetric_difference(arr1, arr1 + n1, arr2, arr2 + n2, arr3) - arr3;
//返回新集合大小

字典序函数

next_permutation

next_permutation(arr ,arr + n); //得到下个一个字典序

prev_permutation

prev_permutation(arr ,arr + n); //得到上个一个字典序