Reduce (C++17)
ll s = reduce(a + 1, a + 1 + n); // 求和
ll s = reduce(a + 1, a + 1 + n, std::plus<ll>); // 求和
double s = reduce(a + 1, a + 1 + n, std::multiples<double>); // 求积
int s = reduce(a + 1, a + 1 + n, std::max<int>); // 求最大值
把一个数组压缩成一个数字的办法,不保证他们内部的分组和运行的方法。需要传入一个有结合律(associative property)和交换律(commutative property)的二元运算符(注意浮点数的加法是有误差的)。
由于不需要多余的操作,比较好写。
另外这里也暗示了线段树可以通过传入一个二元运算符来实现,TODO。
https://en.cppreference.com/w/cpp/algorithm/reduce
Accumulate
对比常见的 Accumulate,需要传入一个初始值,和一个无需条件的二元运算符,他一定会从左到右执行:
std::vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int sum = std::accumulate(v.begin(), v.end(), 0);
int product = std::accumulate(v.begin(), v.end(), 1, std::multiplies<int>());
但是这个要放一个初始值,初始值是必传的参数,不如上面那个reduce好用。而且reduce跑得还更快。限制是reduce是要求满足交换律和结合律的。
minmax
auto [m, M] = std::minmax(a, b); // 把a和b之间的最小值放到m,最大值放到M
// 其实不如:
if (a > b) swap (a, b); // 非常直观
minmax_elements
相当于是min_element和max_element的结合体,返回一个pair,里面是俩迭代器,一次找到最小值和最大值的位置。
标签:std,STL,基础,初始值,reduce,运算符,int,minmax,一些 From: https://www.cnblogs.com/purinliang/p/18171072