Namespaces
Variants

std::inclusive_scan

Depuis fr.cppreference.net
 
 
Bibliothèque d'algorithmes
Algorithmes contraints et algorithmes sur les vues (C++20)
Algorithmes contraints, ex. ranges::copy, ranges::sort, ...
Opérations de séquence non modificatrices    
Opérations par lots
(C++17)
Opérations de recherche
Opérations de séquence modificatrices
Opérations de copie
(C++11)
(C++11)
Opérations d'échange
Opérations de transformation
Opérations de génération
Opérations de suppression
Opérations de changement d'ordre
(jusqu'à C++17)(C++11)
(C++20)(C++20)
Opérations d'échantillonnage
(C++17)

Tri et opérations associées
Opérations de partitionnement
(C++11)    

Opérations de tri
Opérations de recherche binaire
(sur des plages partitionnées)
Opérations d'ensemble (sur des plages triées)
Opérations de fusion (sur des plages triées)
Opérations de tas
Opérations de minimum/maximum
(C++11)
(C++17)
Opérations de comparaison lexicographique
Opérations de permutation


 
 
Défini dans l'en-tête <numeric>
template< class InputIt, class OutputIt >
OutputIt inclusive_scan( InputIt first, InputIt last,
                         OutputIt d_first );
(1) (depuis C++17)
(constexpr depuis C++20)
template< class ExecutionPolicy,
          class ForwardIt1, class ForwardIt2 >
ForwardIt2 inclusive_scan( ExecutionPolicy&& policy,
                           ForwardIt1 first, ForwardIt1 last,
                           ForwardIt2 d_first );
(2) (depuis C++17)
template< class InputIt, class OutputIt, class BinaryOp >
OutputIt inclusive_scan( InputIt first, InputIt last,
                         OutputIt d_first, BinaryOp op );
(3) (depuis C++17)
(constexpr depuis C++20)
template< class ExecutionPolicy,
          class ForwardIt1, class ForwardIt2, class BinaryOp >
ForwardIt2 inclusive_scan( ExecutionPolicy&& policy,
                           ForwardIt1 first, ForwardIt1 last,
                           ForwardIt2 d_first, BinaryOp op );
(4) (depuis C++17)
template< class InputIt, class OutputIt,
          class BinaryOp, class T >
OutputIt inclusive_scan( InputIt first, InputIt last,
                         OutputIt d_first, BinaryOp op, T init );
(5) (depuis C++17)
(constexpr depuis C++20)
template< class ExecutionPolicy,
          class ForwardIt1, class ForwardIt2,
          class BinaryOp, class T >
ForwardIt2 inclusive_scan( ExecutionPolicy&& policy,
                           ForwardIt1 first, ForwardIt1 last,
                           ForwardIt2 d_first, BinaryOp op, T init );
(6) (depuis C++17)
1) Équivalent à inclusive_scan(first, last, d_first, std::plus<>().
3) Calcule la somme préfixe inclusive en utilisant op.
Pour chaque entier i dans [0std::distance(first, last)), effectue les opérations suivantes dans l'ordre :
  1. Crée une séquence formée par les éléments de [firstiter] dans l'ordre, où iter est le iième itérateur suivant first.
  2. Calcule la somme généralisée non commutative de la séquence sur op.
  3. Affecte le résultat à *dest, où dest est le iième itérateur suivant d_first.
5) Identique à (3), mais chaque séquence créée est formée par init suivi des éléments de [firstiter] dans l'ordre.
2,4,6) Identique à (1,3,5), mais exécuté selon policy.
Ces surcharges ne participent à la résolution de surcharge que si la valeur de l'expression suivante est true :

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(jusqu'à C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(depuis C++20)

La somme généralisée non commutative d'une séquence d'éléments sur une opération binaire binary_op est définie comme suit :

  • Si la séquence n'a qu'un seul élément, la somme est la valeur de cet élément.
  • Sinon, effectue les opérations suivantes dans l'ordre :
  1. Sélectionne deux éléments adjacents quelconques elem1 et elem2 de la séquence.
  2. Calcule binary_op(elem1, elem2) et remplace les deux éléments dans la séquence par le résultat.
  3. Répète les étapes 1 et 2 jusqu'à ce qu'il n'y ait plus qu'un seul élément dans la séquence.


Étant donné binary_op comme opération binaire effective :

  • Le résultat est non déterministe si binary_op n'est pas associative (comme l'addition en virgule flottante).
  • Pour les surcharges (1-4), si binary_op(*first, *first) n'est pas convertible en le type de valeur de decltype(first), le programme est mal formé.
  • Pour les surcharges (5,6), si l'une des valeurs suivantes n'est pas convertible en T, le programme est mal formé :
  • binary_op(init, *first)
  • binary_op(init, init)
  • binary_op(*first, *first)
  • Si l'une des conditions suivantes est satisfaite, le comportement est indéfini :
  • Pour les surcharges (1-4), le type de valeur de decltype(first) n'est pas MoveConstructible.
  • Pour les surcharges (5,6), T n'est pas MoveConstructible.
  • binary_op modifie un élément de [firstlast).
  • binary_op invalide un itérateur ou une sous-plage de [firstlast].

Paramètres

first, last - la paire d'itérateurs définissant la plage source des éléments à additionner
d_first - le début de la plage de destination ; peut être égal à first
policy - la politique d'exécution à utiliser
init - la valeur initiale
op - objet fonction binaire FunctionObject qui sera appliqué au résultat du déréférencement des itérateurs d'entrée, aux résultats d'autres op, et à init (s'il est fourni)
Exigences de type
-
InputIt doit satisfaire aux exigences de LegacyInputIterator.
-
OutputIt doit satisfaire aux exigences de LegacyOutputIterator.
-
ForwardIt1, ForwardIt2 doit satisfaire aux exigences de LegacyForwardIterator.

Valeur de retour

Itérateur pointant au-delà du dernier élément écrit.

Complexité

Étant donné N comme std::distance(first, last) :

1,2) O(N) applications de std::plus<>().
3-6) O(N) applications de op.

Exceptions

Les surcharges avec un paramètre de modèle nommé ExecutionPolicy signalent les erreurs comme suit :

  • Si l'exécution d'une fonction invoquée dans le cadre de l'algorithme lève une exception et que ExecutionPolicy est l'une des politiques standard, std::terminate est appelé. Pour tout autre ExecutionPolicy, le comportement est défini par l'implémentation.
  • Si l'algorithme ne parvient pas à allouer de la mémoire, std::bad_alloc est levée.

Exemple

#include <functional>
#include <iostream>
#include <iterator>
#include <numeric>
#include <vector>

int main()
{
    std::vector data{3, 1, 4, 1, 5, 9, 2, 6};
    
    std::cout << "Exclusive sum: ";
    std::exclusive_scan(data.begin(), data.end(),
                        std::ostream_iterator<int>(std::cout, " "),
                        0);
    
    std::cout << "\nInclusive sum: ";
    std::inclusive_scan(data.begin(), data.end(),
                        std::ostream_iterator<int>(std::cout, " "));
    
    std::cout << "\n\nExclusive product: ";
    std::exclusive_scan(data.begin(), data.end(),
                        std::ostream_iterator<int>(std::cout, " "),
                        1, std::multiplies<>{});
    
    std::cout << "\nInclusive product: ";
    std::inclusive_scan(data.begin(), data.end(),
                        std::ostream_iterator<int>(std::cout, " "),
                        std::multiplies<>{});
}

Sortie :

Exclusive sum: 0 3 4 8 9 14 23 25
Inclusive sum: 3 4 8 9 14 23 25 31

Exclusive product: 1 3 3 12 12 60 540 1080
Inclusive product: 3 3 12 12 60 540 1080 6480

Voir aussi

calcule les différences entre éléments adjacents dans une plage
(fonction patron)
additionne ou réduit une plage d'éléments
(fonction patron)
calcule la somme partielle d'une plage d'éléments
(fonction patron)
applique un invocable, puis calcule le scan inclusif
(fonction patron)
similaire à std::partial_sum, exclut le ième élément d'entrée de la ième somme
(fonction patron)