1. 为什么我们需要告别for循环求和?
在力扣刷题或者日常开发中,计算数组和可能是我们最常写的代码之一。多少次我们机械地写下这样的代码:
cpp复制int sum = 0;
for(int i=0; i<arr.size(); i++){
sum += arr[i];
}
这种写法虽然直观,但存在几个明显问题:首先,代码冗长,特别是当我们需要频繁计算数组和时;其次,容易出错,比如边界条件处理不当;最重要的是,它没有充分利用现代编程语言提供的工具库。
2. numeric库的救赎之道
C++标准库中的<numeric>头文件提供了accumulate函数,可以完美替代手动for循环求和。它的基本用法如下:
cpp复制#include <numeric>
#include <vector>
int main() {
std::vector<int> arr = {1, 2, 3, 4, 5};
int sum = std::accumulate(arr.begin(), arr.end(), 0);
return 0;
}
2.1 accumulate函数的三重境界
-
基础用法:如上面示例所示,三个参数分别是起始迭代器、结束迭代器和初始值。
-
自定义操作:accumulate还接受第四个参数,可以指定累加操作:
cpp复制// 计算乘积
int product = std::accumulate(arr.begin(), arr.end(), 1,
[](int a, int b){ return a * b; });
- 复杂类型处理:可以处理自定义类型的累加:
cpp复制struct Point { double x, y; };
std::vector<Point> points = {...};
Point sum = std::accumulate(points.begin(), points.end(), Point{0,0},
[](Point p1, Point p2){ return Point{p1.x+p2.x, p1.y+p2.y}; });
