合計を求める | Programming Place Plus C++編 逆引き

トップページC++編逆引き

C++編で扱っている C++ は 2003年に登場した C++03 という、とても古いバージョンのものです。C++ はその後、C++11 -> C++14 -> C++17 -> C++20 と更新されており、今後も 3年ごとに更新されます。
なかでも C++11 での更新は非常に大きなものであり、これから C++ の学習を始めるのなら、C++11 よりも古いバージョンを対象にするべきではありません。特に事情がないなら、新しい C++ を学んでください。 当サイトでは、C++14 をベースにした新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

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 のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る