std:: accumulate
|
Défini dans l'en-tête
<numeric>
|
||
|
template
<
class
InputIt,
class
T
>
T accumulate ( InputIt first, InputIt last, T init ) ; |
(1) | (constexpr depuis C++20) |
|
template
<
class
InputIt,
class
T,
class
BinaryOp
>
T accumulate ( InputIt first, InputIt last, T init, BinaryOp op ) ; |
(2) | (constexpr depuis C++20) |
Calcule la somme de la valeur donnée
init
et des éléments dans l'intervalle
[
first
,
last
)
.
T
) avec la valeur initiale
init
puis le modifie avec
acc
=
acc
+
*
i
(jusqu'en C++20)
acc
=
std
::
move
(
acc
)
+
*
i
(depuis C++20)
pour chaque itérateur
i
dans l'intervalle
[
first
,
last
)
dans l'ordre.
T
) avec la valeur initiale
init
puis le modifie avec
acc
=
op
(
acc,
*
i
)
(jusqu'en C++20)
acc
=
op
(
std
::
move
(
acc
)
,
*
i
)
(depuis C++20)
pour chaque itérateur
i
dans l'intervalle
[
first
,
last
)
dans l'ordre.
Si l'une des conditions suivantes est satisfaite, le comportement est indéfini :
-
Tn'est pas CopyConstructible . -
Tn'est pas CopyAssignable . -
op
modifie un élément quelconque de
[first,last). -
op
invalide un itérateur ou un sous-intervalle quelconque dans
[first,last].
Table des matières |
Paramètres
| first, last | - | la paire d'itérateurs définissant l'intervalle des éléments à accumuler |
| init | - | valeur initiale de l'accumulation |
| op | - |
objet fonction d'opération binaire qui sera appliqué.
La signature de la fonction doit être équivalente à : Ret fun ( const Type1 & a, const Type2 & b ) ;
La signature n'a pas besoin d'avoir
const
&
.
|
| Exigences de type | ||
-
InputIt
doit satisfaire aux exigences de
LegacyInputIterator
.
|
||
Valeur de retour
acc après toutes les modifications.
Implémentation possible
| 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; } |
` et `` n'est pas traduit
- Les termes spécifiques au C++ sont conservés en anglais
- Seul le texte descriptif a été traduit
Notes
std::accumulate
effectue un
pliage
à gauche. Pour effectuer un pliage à droite, il faut inverser l'ordre des arguments de l'opérateur binaire et utiliser des itérateurs inverses.
Si on laisse faire l'inférence de type, op opère sur des valeurs du même type que init ce qui peut entraîner un cast indésirable des éléments de l'itérateur. Par exemple, std :: accumulate ( v. begin ( ) , v. end ( ) , 0 ) ne donne probablement pas le résultat souhaité lorsque v est de type std:: vector < double > .
Exemple
#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]), // commencer avec le premier élément dash_fold); // Pliage droit utilisant des itérateurs inversés std::string rs = std::accumulate(std::next(v.rbegin()), v.rend(), std::to_string(v.back()), // commencer avec le dernier élément dash_fold); std::cout << "somme: " << sum << '\n' << "produit: " << product << '\n' << "chaîne séparée par des tirets: " << s << '\n' << "chaîne séparée par des tirets (pliée à droite): " << rs << '\n'; }
Sortie :
somme: 55 produit: 3628800 chaîne séparée par des tirets: 1-2-3-4-5-6-7-8-9-10 chaîne séparée par des tirets (pliée à droite): 10-9-8-7-6-5-4-3-2-1
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Appliqué à | Comportement tel que publié | Comportement correct |
|---|---|---|---|
| LWG 242 | C++98 | op ne pouvait pas avoir d'effets secondaires | il ne peut pas modifier les plages impliquées |
Voir aussi
|
calcule les différences entre les éléments adjacents dans une plage
(modèle de fonction) |
|
|
calcule le produit scalaire de deux plages d'éléments
(modèle de fonction) |
|
|
calcule la somme partielle d'une plage d'éléments
(modèle de fonction) |
|
|
(C++17)
|
similaire à
std::accumulate
, mais sans ordre
(modèle de fonction) |
|
(C++23)
|
réduit gauche une plage d'éléments
(objet fonction algorithme) |