std:: accumulate
|
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
)
.
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.
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:
-
Tist nicht CopyConstructible . -
Tist 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.
|
| 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; } |
`-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) |
|
(C++23)
|
faltet einen Elementbereich von links
(Algorithmus-Funktionsobjekt) |