Namespaces
Variants

std:: inclusive_scan

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 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 [ 0 , std:: distance ( first, last ) ) , effectue les opérations suivantes dans l'ordre :
  1. Crée une séquence formée par les éléments de [ first , iter ] dans l'ordre, où iter est le prochain i ième itérateur de first .
  2. Calcule la somme généralisée non commutative de la séquence via op .
  3. Affecte le résultat à * dest , où dest est le prochain i ième itérateur de d_first .
5) Identique à (3) , mais chaque séquence créée est formée par init suivi des éléments de [ first , iter ] dans l'ordre.
2,4,6) Identique à (1,3,5) , mais exécuté selon la policy .
Ces surcharges participent à la résolution de surcharge seulement si toutes les conditions suivantes sont satisfaites :

std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> est true .

(jusqu'à C++20)

std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> est true .

(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 ne contient 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 dans 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 ne reste qu'un seul élément dans la séquence.


Étant donné binary_op comme l'opération binaire réelle :

  • Le résultat est non déterministe si le binary_op n'est pas associatif (comme l'addition en virgule flottante).
  • Pour les surcharges (1-4) , si binary_op ( * first, * first ) n'est pas convertible vers 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 )
**Note:** Le contenu étant principalement du code C++ (dans les balises ` `), aucun texte n'a nécessité de traduction selon vos instructions. La structure HTML et les termes spécifiques au C++ (`binary_op`, `init`, `first`) ont été conservés intacts.
  • 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 tout élément de [ first , last ) .
  • binary_op invalide tout itérateur ou sous-intervalle de [ first , last ] .

Table des matières

Paramètres

first, last - la paire d'itérateurs définissant la plage source des éléments à sommer
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 FunctionObject binaire 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 (si 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 vers l'élément après le 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 fait partie 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é.

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 << "Somme exclusive : ";
    std::exclusive_scan(data.begin(), data.end(),
                        std::ostream_iterator<int>(std::cout, " "),
                        0);
    std::cout << "\nSomme inclusive : ";
    std::inclusive_scan(data.begin(), data.end(),
                        std::ostream_iterator<int>(std::cout, " "));
    std::cout << "\n\nProduit exclusif : ";
    std::exclusive_scan(data.begin(), data.end(),
                        std::ostream_iterator<int>(std::cout, " "),
                        1, std::multiplies<>{});
    std::cout << "\nProduit inclusif : ";
    std::inclusive_scan(data.begin(), data.end(),
                        std::ostream_iterator<int>(std::cout, " "),
                        std::multiplies<>{});
}

Sortie :

Somme exclusive : 0 3 4 8 9 14 23 25
Somme inclusive : 3 4 8 9 14 23 25 31
Produit exclusif : 1 3 3 12 12 60 540 1080
Produit inclusif : 3 3 12 12 60 540 1080 6480

Voir aussi

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