accumulate

[機能]

  イテレータで指定された範囲の総和を計算します.

[形式]
#include <numeric>

template <class InputIterator, class T>
    T accumulate(InputIterator first, InputIterator last, T init);
template <class InputIterator, class T, class BinaryOperation>
    T accumulate(InputIterator first, InputIterator last, T init,
                 BinaryOperation binary_op);		

[使用例]

  1. accumulate,reduce,transform_reduce,inner_product の使用方法です.以下に示すプログラム例において,いくつかのコメント部分は,その上に記述された方法とほぼ同等なものであることを示しています.
    #include <stdio.h>
    #include <vector>
    #include <numeric>
    
    using namespace std;
    
    int sum_o(int s, int n)
    {
    	return (n % 2 == 0) ? s + n : s;
    }
    
    int sum(int x, int y)
    {
    	return x + y;
    }
    
    int mul(int x, int y)
    {
    	return x * y;
    }
    
    int main()
    {
    			// 初期設定
    	vector<int> v1 {1, 2, 3, 4, 5};
    	printf("初期状態 v1 :");
    	for (auto x : v1)
    		printf("  %d", x);
    	printf("\n");
    			// accumulate
    	int s1 = accumulate(v1.begin(), v1.end(), 0);
    //	int s1 = accumulate(v1.begin(), v1.end(), 0, sum);   // 関数
    //	int s1 = accumulate(v1.begin(), v1.end(), 0, plus<>());   // 二項関数オブジェクト plus
    //	int s1 = accumulate(v1.begin(), v1.end(), 0, [](int s, int x){ return s += x; });   // ラムダ式
    	int s2 = accumulate(v1.begin(), v1.end(), 0, sum_o);
    //	int s2 = accumulate(v1.begin(), v1.end(), 0, [](int s, int n){ return (n % 2 == 0) ? s + n : s; });
    	printf("  すべての要素の和(accumulate) = %d\n", s1);
    	printf("  偶数要素の和(accumulate) = %d\n", s2);
    			// reduce
    	s1 = reduce(v1.begin(), v1.end(), 0);
    //	s1 = reduce(v1.begin(), v1.end());
    //	s1 = reduce(v1.begin(), v1.end(), 0, sum);
    //	s1 = reduce(v1.begin(), v1.end(), 0, plus<>());
    	s2 = reduce(v1.begin(), v1.end(), 0, sum_o);
    //	s2 = reduce(v1.begin(), v1.end(), 0, [](int s, int n){ return (n % 2 == 0) ? s + n : s; });
    	printf("  すべての要素の和(reduce) = %d\n", s1);
    	printf("  偶数要素の和(reduce) = %d\n", s2);
    			// transform_reduce, inner_product
    	vector<int> v2 {0, 1, 2, 3, 4};
    	printf("初期状態 v1 :");
    	for (auto x : v1)
    		printf("  %d", x);
    	printf("\n");
    	printf("初期状態 v2 :");
    	for (auto x : v2)
    		printf("  %d", x);
    	printf("\n");
    	s1 = transform_reduce(v1.begin(), v1.end(), v2.begin(), 0);
    //	s1 = transform_reduce(v1.begin(), v1.end(), v2.begin(), 0, plus<>(), multiplies<>());   // 二項関数オブジェクト plus, multiplies
    //	s1 = transform_reduce(v1.begin(), v1.end(), v2.begin(), 0, sum, mul);
    //	s1 = transform_reduce(v1.begin(), v1.end(), v2.begin(), 0, [](int a, int b){ return a + b; }, [](int a, int b){ return a * b; });
    	s2 = inner_product(v1.begin(), v1.end(), v2.begin(), 0);
    	printf("  内積(transform_reduce) = %d\n", s1);
    	printf("  内積(inner_product) = %d\n", s2);
    
    	return 0;
    }
    			
    (出力)
    初期状態 v1 :  1  2  3  4  5
      すべての要素の和(accumulate) = 15
      偶数要素の和(accumulate) = 6
      すべての要素の和(reduce) = 15
      偶数要素の和(reduce) = 6
    初期状態 v1 :  1  2  3  4  5
    初期状態 v2 :  0  1  2  3  4
      内積(transform_reduce) = 40
      内積(inner_product) = 40			
[参照]

reducetransform_reduceinner_product

菅沼ホーム 本文目次 演習問題解答例 付録目次 索引