stl中的数值算法accumulate和inner_product功能强大且实用。accumulate不仅可求和,还可通过自定义操作符实现字符串拼接、结构体字段汇总等,例如将vector中的数字拼接成字符串。inner_product默认计算两个序列的点积,但可通过自定义操作符实现元素比较、逻辑判断等功能,如判断两个vector是否完全相同。两者均支持Lambda表达式,扩展性强,适用于多种数据计算场景,掌握其用法可显著提升编码效率。
STL中的数值算法虽然不像排序或查找那样高频出现,但在处理数据计算时非常实用。其中
accumulate
和
inner_product
是两个比较常用且功能强大的函数,掌握它们的用法可以简化代码、提升效率。
accumulate:不只是求和
accumulate
最常见的是用来求和,但其实它的能力远不止于此。它在
<numeric>
头文件中定义,基本形式如下:
accumulate(起始迭代器, 结束迭代器, 初始值);
默认情况下它是将元素逐个加到初始值上,但你还可以传入一个二元操作符,比如乘法、拼接字符串等。
举个例子:
假设你想把一个vector里的所有数字连起来变成字符串:
vector<int> nums = {1, 2, 3, 4}; string result = accumulate(nums.begin(), nums.end(), string(""), [](string s, int n) { return s + to_string(n); });
这样就能得到
"1234"
,是不是比写循环方便多了?
inner_product:两个序列的“点积”变形
inner_product
默认行为是对两个序列对应元素相乘后求和,就像数学中的点积运算。它的基本调用方式如下:
inner_product(第一个范围起始, 第一个范围结束, 第二个范围起点, 初始累加值);
但它的强大之处在于可以自定义两个操作符:一个是“每对元素怎么处理”,另一个是“这些结果如何合并”。
举个例子:
你想判断两个vector是否完全相同,可以用它来做:
vector<int> a = {1, 2, 3}, b = {1, 2, 3}; int same = inner_product(a.begin(), a.end(), b.begin(), 0, plus<>(), equal_to<>());
这里的意思是:每对元素比较是否相等(equal_to),然后把结果加起来(plus)。如果最终结果等于向量长度,说明两个序列完全一致。
使用技巧小贴士
-
accumulate
也可以用于字符串拼接、结构体字段提取汇总等。
-
inner_product
能灵活用于比较、组合、逻辑判断等多种场景。
- 这两个函数都支持lambda表达式作为操作符,所以扩展性很强。
- 注意第二个参数是“结束迭代器”,不是最后一个元素的下一个位置!
基本上就这些。这两个函数看起来简单,但一旦掌握好用法,在实际编程中能省不少事。