std::accumulateは、ベクタの指定した範囲内の要素の合計を計算する
さらに、第三引数の「初期値」、第四引数の「演算子」を適切に指定することで、vector <int>の単純な合計以外のことも計算できる
ここでは、vector<string>の全要素を結合してみる
コード
12–13行目は単純に文字列を結合
15–17行目は空白文字を入れて文字列を結合
19–21行目は空白文字を入れて文字列を結合する関数を先に定義してる
22–25行目は、ラムダ式の「キャプチャ」という機能で式の外側で定義した区切り文字を使っている
出力
$ g++ accum_string.cpp $ ./a.out Ihaveapen. I have a pen. I have a pen. I, have, a, pen.
解説
1文字目を初期値として、2番目以降の要素を足していくのがミソ
初期値を定義したところで一文字目の前に区切り文字が入って条件分岐して別処理とか面倒
ただし、2番目以降の要素を足していくので、第一引数のイテレータは2番目の要素を指すようにする
string sum_A = accumulate(A.begin() + 1, A.end(), A[0], [](string &init, string &v){ return init + v; });
予め関数を定義する部分
auto f = [](string &init, string &v) -> string { return init + " " + v; };
ラムダ導入子[]で外で定義した区切り文字をキャプチャする
ここでは参照している
auto f2 = [&delim](string &init, string &v) -> string { return init + delim + v; };