Namespaces
Variants

std:: accumulate

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
Definiert im Header <numeric>
template < class InputIt, class T >
T accumulate ( InputIt first, InputIt last, T init ) ;
(1) (constexpr seit C++20)
template < class InputIt, class T, class BinaryOp >
T accumulate ( InputIt first, InputIt last, T init, BinaryOp op ) ;
(2) (constexpr seit C++20)

Berechnet die Summe des gegebenen Wertes init und der Elemente im Bereich [ first , last ) .

1) Initialisiert den Akkumulator acc (vom Typ T ) mit dem Anfangswert init und modifiziert ihn dann mit acc = acc + * i (bis C++20) acc = std :: move ( acc ) + * i (seit C++20) für jeden Iterator i im Bereich [ first , last ) in Reihenfolge.
2) Initialisiert den Akkumulator acc (vom Typ T ) mit dem Anfangswert init und modifiziert ihn dann mit acc = op ( acc, * i ) (bis C++20) acc = op ( std :: move ( acc ) , * i ) (seit C++20) für jeden Iterator i im Bereich [ first , last ) in Reihenfolge.

Wenn eine der folgenden Bedingungen erfüllt ist, ist das Verhalten undefiniert:

  • T ist nicht CopyConstructible .
  • T ist nicht CopyAssignable .
  • op modifiziert irgendein Element in [ first , last ) .
  • op invalidiert irgendeinen Iterator oder Teilbereich in [ first , last ] .

Inhaltsverzeichnis

Parameter

first, last - das Paar von Iteratoren, das den Bereich der zu akkumulierenden Elemente definiert
init - Anfangswert der Akkumulation
op - binäres Operationsfunktionsobjekt, das angewendet wird.

Die Signatur der Funktion sollte äquivalent zu Folgendem sein:

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

Die Signatur muss nicht const & enthalten.
Der Typ Type1 muss so beschaffen sein, dass ein Objekt vom Typ T implizit in Type1 konvertiert werden kann. Der Typ Type2 muss so beschaffen sein, dass ein Objekt vom Typ InputIt dereferenziert und dann implizit in Type2 konvertiert werden kann. Der Typ Ret muss so beschaffen sein, dass einem Objekt vom Typ T ein Wert vom Typ Ret zugewiesen werden kann. ​

Typanforderungen
-
InputIt muss die Anforderungen von LegacyInputIterator erfüllen.

Rückgabewert

acc nach allen Änderungen.

Mögliche Implementierung

accumulate (1)
template<class InputIt, class T>
constexpr // since C++20
T accumulate(InputIt first, InputIt last, T init)
{
    for (; first != last; ++first)
        init = std::move(init) + *first; // std::move since C++20
    return init;
}
accumulate (2)
template<class InputIt, class T, class BinaryOperation>
constexpr // since C++20
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;
}
*Hinweis: Der Text innerhalb der `
`-Tags (C++-Code) wurde gemäß den Anforderungen nicht übersetzt. Die Funktionsnamen und C++-spezifischen Begriffe wie "template", "constexpr", "InputIt" etc. bleiben unverändert.*

Hinweise

std::accumulate führt eine Linksfaltung durch. Um eine Rechtsfaltung durchzuführen, muss die Reihenfolge der Argumente für den binären Operator umgekehrt werden und reverse Iteratoren verwendet werden.

Wenn der Typinferenz überlassen, op operiert auf Werten desselben Typs wie init , was zu unerwünschten Typumwandlungen der Iteratorelemente führen kann. Zum Beispiel, std :: accumulate ( v. begin ( ) , v. end ( ) , 0 ) liefert wahrscheinlich nicht das gewünschte Ergebnis, wenn v vom Typ std:: vector < double > ist.

Beispiel

#include <functional>
#include <iostream>
#include <numeric>
#include <string>
#include <vector>
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>());
    auto dash_fold = [](std::string a, int b)
    {
        return std::move(a) + '-' + std::to_string(b);
    };
    std::string s = std::accumulate(std::next(v.begin()), v.end(),
                                    std::to_string(v[0]), // beginne mit erstem Element
                                    dash_fold);
    // Rechtsfaltung mit Reverse-Iteratoren
    std::string rs = std::accumulate(std::next(v.rbegin()), v.rend(),
                                     std::to_string(v.back()), // beginne mit letztem Element
                                     dash_fold);
    std::cout << "sum: " << sum << '\n'
              << "product: " << product << '\n'
              << "dash-separated string: " << s << '\n'
              << "dash-separated string (right-folded): " << rs << '\n';
}

Ausgabe:

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

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
LWG 242 C++98 op konnte keine Nebeneffekte haben es kann die beteiligten Bereiche nicht modifizieren

Siehe auch

berechnet die Differenzen zwischen benachbarten Elementen in einem Bereich
(Funktions-Template)
berechnet das innere Produkt zweier Elementbereiche
(Funktions-Template)
berechnet die Teilsumme eines Elementbereichs
(Funktions-Template)
(C++17)
ähnlich zu std::accumulate , jedoch außerhalb der Reihenfolge
(Funktions-Template)
faltet einen Elementbereich von links
(Algorithmus-Funktionsobjekt)