名前空間
変種
操作

std::accumulate

提供: cppreference.com
< cpp‎ | algorithm
 
 
アルゴリズムライブラリ
実行ポリシー (C++17)
非変更シーケンス操作
(C++11)(C++11)(C++11)
(C++17)
変更シーケンス操作
未初期化記憶域の操作
分割操作
ソート操作
(C++11)
二分探索操作
集合操作 (ソート済み範囲用)
ヒープ操作
(C++11)
最小/最大演算
(C++11)
(C++17)
順列
数値演算
accumulate
(C++17)
C のライブラリ
 
ヘッダ <numeric> で定義
template< class InputIt, class T >
T accumulate( InputIt first, InputIt last, T init );
(1)
template< class InputIt, class T, class BinaryOperation >

T accumulate( InputIt first, InputIt last, T init,

              BinaryOperation op );
(2)

指定された値 init と範囲 [first, last) の要素の合計を計算します。 1つめのバージョンは要素の加算に operator+ を使用し、2つめのバージョンは指定された二項関数 op を使用します。 どちらの場合も左側の被演算子に std::move が適用されます。 (C++20およびそれ以降)

op は副作用を持っていてはなりません。

(C++11以前)

op は終端イテレータを含むいかなるイテレータも無効化してはならず、関係する範囲のいかなる要素も (*last も) 変更してはなりません。

(C++11およびそれ以降)

目次

[編集] 引数

first, last - 加算する要素の範囲
init - 加算する初期値
op - 適用される二項演算関数オブジェクト。 二項演算子は現在の累積値 a (init に初期化される) と現在の要素の値 b を取ります。

関数のシグネチャは以下と同等であるべきです。

 Ret fun(const Type1 &a, const Type2 &b);

シグネチャが const & を持つ必要はありません。
Type1 は、 T 型のオブジェクトから暗黙に変換可能なものでなければなりません。 型 Type2 は、 InputIt 型のオブジェクトの逆参照から暗黙に変換可能なものでなければなりません。 型 RetT 型のオブジェクトに代入可能なものでなければなりません。 ​

型の要件
-
InputItInputIterator の要件を満たさなければなりません。
-
TCopyAssignable および CopyConstructible の要件を満たさなければなりません。

[編集] 戻り値

1) 指定された値と指定された範囲の要素の合計。
2) op による指定された範囲の左畳み込みの結果。

[編集] ノート

std::accumulate は左畳み込みを行います。 右畳み込みを行うためには、二項演算子に渡す引数の順序を反転し、逆イテレータを使用しなければなりません。

[編集] 実装例

1つめのバージョン
template<class InputIt, class T>
T accumulate(InputIt first, InputIt last, T init)
{
    for (; first != last; ++first) {
        init = std::move(init) + *first; // std::move since C++20
    }
    return init;
}
2つめのバージョン
template<class InputIt, class T, class BinaryOperation>
T accumulate(InputIt first, InputIt last, T init, 
             BinaryOperation op)
{
    for (; first != last; ++first) {
        init = op(std::move(init), *first); // std::move since C++20
    }
    return init;
}

[編集]

#include <iostream>
#include <vector>
#include <numeric>
#include <string>
#include <functional>
 
int main()
{
    std::vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
 
    int sum = std::accumulate(v.begin(), v.end(), 0);
 
    int product = std::accumulate(v.begin(), v.end(), 1, std::multiplies<int>());
 
    std::string s = std::accumulate(std::next(v.begin()), v.end(),
                                    std::to_string(v[0]), // start with first element
                                    [](std::string a, int b) {
                                        return a + '-' + std::to_string(b);
                                    });
 
    std::cout << "sum: " << sum << '\n'
              << "product: " << product << '\n'
              << "dash-separated string: " << s << '\n';
}

出力:

sum: 55
product: 3628800
dash-separated string: 1-2-3-4-5-6-7-8-9-10

[編集] 関連項目

指定範囲の隣接する要素間の差を計算します
(関数テンプレート) [edit]
2つの範囲の要素の内積を計算します
(関数テンプレート) [edit]
指定範囲の要素の部分和を計算します
(関数テンプレート) [edit]
(C++17)
std::accumulate と同様ですが、計算順序は不定です
(関数テンプレート) [edit]