C++STL 中的线性容器整体/逐元素操作方法 少写80%for循环
2021-07-03 20:03
标签:运算 长度 .com multi ade 空间 table cto dac 本文中示例代码默认已引用 返回给定区间内元素的累加值与给定初值的和,初值不可省略 可指定求和运算,默认为 运算操作函数对象见 functional 头文件,常用如下 ? 计算给定区间的前缀和,存入 ? 递增填充给定区间,即 示例: ? 填充给定区间为 指定区间起点和长度 ? 使用函数生成给定区间的值 其中 配合读入优化可以一行代码读取数据,免去写 for 循环了 此外还可以用来随机数填充等等 ? 对区间内的元素执行一元函数 感觉非常有用,配合 lambda 比写 for 循环舒服多了,应用场景非常广泛 ? 对区间内的元素执行一元函数 可以直接存入原容器 ? 计数区间内值为 计数区间内满足条件的元素个数, ? 感觉有了这些 STL 几乎就不再用写那种只有一两句循环体的 for 循环了... C++STL 中的线性容器整体/逐元素操作方法 少写80%for循环 标签:运算 长度 .com multi ade 空间 table cto dac 原文地址:https://www.cnblogs.com/glowming/p/cppstl.htmlstd
命名空间累加 (std::accumulate)
accumulate(begin, end, init, op)
std::plus
vector
函数对象
含义
multiplies
乘法
bit_xor
按位异或
bit_and
按位与
前缀和 (std::partial_sum)
partial_sum(begin, end, res)
res
(iterator)中,可以直接存入原容器int a[5] = {1, 2, 3, 4, 5};
partial_sum(a, a+5, a);
// a : {1, 3, 6, 10, 15}
递增填充 (std::iota)
iota(begin, end, value)
*(d_first) = value;
*(d_first+1) = ++value;
...
vector
定值填充 (std::fill)
fill(begin, end, val)
val
fill_n(begin, n, val)
生成值填充 (std::generate)
generate(begin, end, func)
generate_n(begin, n, func)
int a[10];
generate(a, a+5, read);
read
函数可以为int read(){
int ret;
scanf("%d", &ret);
return ret;
}
逐元素函数操作 (std::for_each)
for_each(begin, end, func)
func
int a[5] = {1, 2, 3, 4, 5};
for_each(a, a+5, [](int &x){ x&=1; });
//a : {1, 0, 1, 0, 1}
逐元素函数计算 (std::transform)
transform(begin, end, res, func)
func
,将返回值存到 res
(也是 iterator)中int a[5] = {1, 2, 3, 4, 5};
transform(a, a+5, a, [](int x) { return __gcd(x, 2); });
//a : {1, 2, 1, 2, 1}
计数与条件计数 (std::count & std::count_if)
count(begin, end, value)
value
的元素个数count_if(begin, end, func)
func
为一元谓词int a[5] = {1, -1, 2, -2, 3};
cout0; });
//输出 : 3
文章标题:C++STL 中的线性容器整体/逐元素操作方法 少写80%for循环
文章链接:http://soscw.com/essay/101405.html