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
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 ) .

1) Initialise l'accumulateur acc (de type 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.
2) Initialise l'accumulateur acc (de type 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 :

  • T n'est pas CopyConstructible .
  • T n'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 & .
Le type Type1 doit être tel qu'un objet de type T puisse être implicitement converti en Type1 . Le type Type2 doit être tel qu'un objet de type InputIt puisse être déréférencé puis implicitement converti en Type2 . Le type Ret doit être tel qu'un objet de type T puisse recevoir une valeur de type Ret . ​

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;
}
**Note:** Le contenu a été traduit en français selon vos instructions : - Les balises HTML et attributs sont préservés - Le code C++ dans les balises `
` 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)
réduit gauche une plage d'éléments
(objet fonction algorithme)