C++ STL函数总结
STL 函数
accumulate
accumulate(begin, end, init)复杂度:O(N)
对序列元素求和,begin 和 end 是始末位置的迭代器(左闭右开),init 是加上的初始值。返回求和结果,数据类型与 init 相同。
基础累加求和
1 | int a[]={1,3,5,9,10}; |
自定义二元对象求和
使用 lamda表达式
1 | typedef long long ll; |
atoi
atoi(const char*),将字符串转换为 int 类型。
注意参数为 char 型数组,如果需要将 string 类型转换为 int 类型,可以使用 stoi 函数,或者将 string 类型转换为 const char * 类型。
关于输出数字的范围:
atoi不做范围检查,如果超出上界,输出上界,超出下界,输出下界。stoi会做范围检查,默认必须在int范围内,如果超出范围,会出现 RE(Runtime Error)错误。
1 | string s = "1234"; |
stoi同理
fill
fill(beg, end, num),复杂度 O(N),对一个序列进行初始化赋值。
1 | //对a数组的所有元素赋1 |
memset()是按字节进行赋值,对于初始化赋 0 或 -1 有比较好的效果,如果赋某个特定的数会出错,赋值特定的数建议使用fill()
is_sorted
is_sorted(beg, end),复杂度 O(N),判断序列是否有序,返回 bool 值。
1 | //如果序列有序,输出YES |
iota
iota(beg, end, init),让序列递增赋值。
1 | vector<int> a(10); |
lower_bound
lower_bound(beg, end, x),复杂度 O(logN),二分查找。
1 | //在a数组中查找第一个大于等于x的元素,返回该元素的地址 |
min_element
min_element(beg, end),复杂度 O(N),返回序列最小值的地址。
1 | //函数都是返回地址,需要加*取值 |
min
复杂度 O(1),找多个元素的最大值最小值。
1 | //找a,b的最大值和最小值 |
minmax_element
minmax_element(beg, end),复杂度 O(N),返回序列中的最小和最大值组成 pair 的对应的地址。
1 | int n = 10; |
nth_element
nth_element(beg, nth, end),平均复杂度 O(N),寻找序列第 n 小的值。
nth 为一个迭代器,指向序列中的一个元素。第 n 小的值恰好在 nth 位置上。执行 nth_element() 之后,序列中的元素会围绕 nth 进行划分:nth之前的元素都小于等于它,而之后的元素都大于等于它。
1 | // 求序列中的第3小的元素 |
next_permutation
next_permutation(beg, end),复杂度 O(N),求序列的下一个排列,下一个排列是字典序大一号的排列。返回 bool 值,如果是最后一个排列,返回 false ,否则求出下一个序列后,返回 true。
求 a 所有的排列。
1 | // 数组a不一定是最小字典序序列,所以将它排序 |
同理有 prev_permutation(beg, end)
partial_sort
partial_sort(beg, mid, end),复杂度大概 O(NlogM),M 为距离。部分排序,排序 mid-beg 个元素,mid 为要排序区间元素的尾后的一个位置,从 beg 到 mid 前的元素都排好序。
1 | int a[] = {1,2,5,4,7,9,8,10,6,3}; |
也可以添加自定义排序规则:
partial_sort(beg, mid, end, cmp)
1 | int a[] = {1,2,5,4,7,9,8,10,6,3}; |
shuffle
shuffle(beg, end),复杂度 O(N),随机打乱。
1 | vector<int> b(n); |
reverse
reverse(beg, end),复杂度 O(N),翻转序列。
1 | string s = "abcde"; |
sort
sort(beg, end),复杂度 O(NlogN),对序列排序。
1 | //对a数组的[0,n-1]位置从大到小排序 |
stable_sort不会改变相等元素的相对位置
transform
transform(beg, end, dest, unaryOp),复杂度 O(N),使用给定操作,结果写入 dest。
1 | //大小写转换,把结果存到起始地址为dest的序列中 |
to_string
将数字转化为字符串,支持小数(double)
1 | int a = 12345678; |
unique
unique(beg, end),复杂度 O(N),消除重复元素,返回消除完重复元素的下一个位置的地址。
如:
a[] = {1,2,3,3,4},unique 之后 a 数组为{1,2,3,4,3}前面为无重复元素的数组,后面则是重复元素移到后面,返回a[4]位置的地址(不重复元素的尾后地址)
消除重复元素一般需要原序列是有序序列
离散化
1 | for(int i = 0; i < n; i++) { |
其他
__gcd(a, b),求 a 和 b 的最大公约数__lg(a),求一个数二进制下最高位位于第几位(从第0位开始)__builtin_ffs(x),二进制中对应最后一位 1 的位数(__builtin_ffs(4) = 3)__builtin_popcount(x),x 中 1 的个数__builtin_ctz(x),x 末尾 0 的个数__builtin_clz(x),x 前导 0 的个数__builtin_parity(x),x 中 1 的个数的奇偶性,奇数输出 1
