C++編 逆引き 合計を求める

先頭へ戻る

目的

要素が数値の配列や、コンテナがあるとき、その要素の値の合計値を求めたいとします。

方法①(std::accumulate関数を使う)[C++03~]

C++ では、std::accumulate関数(【標準ライブラリ】第24章)を使うのが簡単です。 この関数を使うには、numeric という標準ヘッダのインクルードが必要です。

#include <iostream>
#include <list>
#include <numeric>

#define SIZE_OF_ARRAY(array) (sizeof(array)/sizeof(array[0]))

int main()
{
	// 配列の例
	int array[] = {0, 1, 2, 3, 4};
	std::cout << std::accumulate(array, array + SIZE_OF_ARRAY(array), 0)
	          << std::endl;

	// std;;list の例
	std::list<int> lst(array, array + SIZE_OF_ARRAY(array));
	std::cout << std::accumulate(lst.begin(), lst.end(), 0)
	          << std::endl;
}

実行結果:

10
10

C++11 では、std::begin(array) や std::end(array) のようにして、 配列の先頭や末尾(の次)を指すポインタを得られるので、 「std::accumulate(std::begin(array), std::end(array), 0)」と書けます。

std::accumulate関数の第3引数は初期値を表しますが、 同時に、合計値の型を表現していることにも注意して下さい。

std::accumulate関数には2つのテンプレートパラメータがあり、その1つが、戻り値と第3引数の型に使われています。 このテンプレートパラメータに当てはめる具体的な型が、第3引数の実引数から推測されます。

例えば、double型の配列の合計値を求めたいとき、第3引数を「0」にすると、合計値は int型で求められてしまいます。 「0.0」のように、double型の値を指定しましょう。

double array[] = {0.3, 1.3, 2.3, 3.3, 4.3};

std::cout << std::accumulate(array, array + SIZE_OF_ARRAY(array), 0)    // 10 を出力
          << std::endl;
          
std::cout << std::accumulate(array, array + SIZE_OF_ARRAY(array), 0.0)  // 11.5 を出力
          << std::endl;

なお、例えば int型の値を合計した結果、int型で表現できない値になってしまう可能性には注意して下さい。 これは、正の方向だけでなく、負の方向も同様です(巨大な負の数を持った要素が含まれているかも知れない)。

方法②(それぞれの値を加算していく)[C++03~]

C言語と同じ方法です。 C言語編の逆引き「合計を求める」を参照して下さい。


参考リンク

更新履歴

'2017/5/31 新規作成。





逆引きのトップページへ

C++編のトップページへ

Programming Place Plus のトップページへ


このエントリーをはてなブックマークに追加
rss1.0 取得ボタン RSS