快速求和
如果要讓你求得一個陣列裡所有數的和怎麼辦?
如果這樣寫:
int sum;
for(int i = 0; i < n; ++i){
sum += a[i];
}
cout<<sum;
是不是感覺這很不優雅,而且如果是要在 if
等語句裡判斷時還得寫一半跳出來在外面寫一個 for
和 sum
然後再判斷,大大降低了思維的連貫性。這時候我們可以採用 accumulate()
函式。
#include <numeric>
accumulate(起始迭代器,結束迭代器,初始值,自定義操作函式)
accumulate()
可以對指定可迭代序列進行有初始值的求和,如果加上自定義操作函式還可以求積求差之類的。例如:
#include <iostream>
#include <numeric>
using namespace std;
int main(){
int a[] = {1, 2, 3, 4, 5};
cout << (accumulate(a, a + 5, 0)); //輸出 15
return 0;
}
除了拿來求和,轉變一下思路還可以拿來判斷一些別的東西。
在藍橋杯2016年國賽中有一道叫做“路徑之謎”的題,其中要判斷 col[]
和 row[]
陣列內每一項是否都為零,這裡陣列每一項都是非負整數,如果我們知道這個函式,那麼就可以很優雅地寫出如下程式碼:
if(accumulate(col, col+n, 0) == 0 && accumulate(row, row+n, 0) == 0){
return true;
}