【C++】vector<string>の全要素をaccumulateで結合

std::accumulateは、ベクタの指定した範囲内の要素の合計を計算する

さらに、第三引数の「初期値」、第四引数の「演算子」を適切に指定することで、vector <int>の単純な合計以外のことも計算できる

ここでは、vector<string>の全要素を結合してみる

コード

12–13行目は単純に文字列を結合

15–17行目は空白文字を入れて文字列を結合

19–21行目は空白文字を入れて文字列を結合する関数を先に定義してる

22–25行目は、ラムダ式の「キャプチャ」という機能で式の外側で定義した区切り文字を使っている

vector<string>を全結合

出力

$ 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; };

参考

accumulate - cpprefjp C++日本語リファレンス

std::accumulate - C++入門

ラムダ式 - cpprefjp C++日本語リファレンス

std::accumulateをつかって、{"A","B","C"}な配列を指定文字で結合するサンプル - Qiita