37項 範囲に関する要約情報を取得するには、accumulateまたはfor_eachを使おう

範囲に関する要約情報を取得するには、accumulateまたはfor_eachを使おう



numericには、accumulateがあります。accumulateは、指定した範囲から値を求めるために使えます。
accumulateに関数を指定せずに呼び出すと、範囲の和を返します。

list<double> l;
...

double sum = accumulate(l.begin(), l.end(), 0.0); // 0.0であることに注意

accumulateに0ではなく0.0を指定しているのは、和がint型に変換されるのを防ぐためです。


関数を指定することで、accumulateの求める値を変えることができます。
例えば、文字列の長さの和を求めるには、下のように書きます。

string::size_type
stringLengthSum(string::size_type sumSoFar, // sumSoFarはそれまでの文字数の合計
                const string &s)
{
	return sumSoFar + s.size();
}
...

list<string> l;
...

string::size_type sum = accumulate(l.begin(), l.end(), 0, stringLengthSum);

範囲の平均値などもaccumulateで求められます。



for_eachは範囲のすべての要素に処理を行うアルゴリズムですが、指定した範囲から値を求めるためにも使えます。