std::accumulateは、ベクタの指定した範囲内の要素の合計を計算する
さらに、第三引数の「初期値」、第四引数の「演算子」を適切に指定することで、vector <int>の単純な合計以外のことも計算できる
ここでは、vector<pair<int, int>>のfirst, secondそれぞれの要素の合計を求めてみる
コード
8–10行目ではvector<int>型の合計
12–15行目ではvector<pair<int, int>>型の合計
17–19行目では予め演算子を定義している
出力
$ g++ accum_pair.cpp $ ./a.out 11 11 15 11 15
解説
vector<int>型の合計
int sum = accumulate(A.begin(), A.end(), 0, [](int init, int v){ return init + v; });
実は第四引数は指定しないときは単純な和として計算してくれるので、下のコードでも良い
int sum = accumulate(A.begin(), A.end(), 0);
vector<pair<int, int>>型の合計
初期値は(0, 0)
第四引数で「i番目までの計算結果(init) にi+1番目の要素(v)をどう加えるか」を記述
正確には内部では高速化のため順番に加えてるわけではなさそうだけど、記述するときはこれでいい
出力はpair<int, int>型なので、しっかりその型で出力を受け止める
Pii sum_p = accumulate(A_p.begin(), A_p.end(), Pii(0, 0), [](Pii init, Pii v){ return Pii(init.first + v.first, init.second + v.second); });
予めラムダ式を用いて演算子を定義している
auto fx = [](Pii init, Pii v) -> Pii { return Pii(init.first + v.first, init.second + v.second); }; Pii sum_p2 = accumulate(A_p.begin(), A_p.end(), Pii(0, 0), fx);