Namespaces
Variants

std::transform_exclusive_scan

De fr.cppreference.net
 
 
Bibliothèque d'algorithmes
Algorithmes contraints et algorithmes sur les plages (C++20)
Algorithmes contraints, par ex. ranges::copy, ranges::sort, ...
Opérations de séquence non modificatives    
Opérations par lots
(C++17)
Opérations de recherche
Opérations de séquence modificatives
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)

Opérations de tri et connexes
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 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, class T, 
          class BinaryOp, class UnaryOp >
OutputIt transform_exclusive_scan
    ( InputIt first, InputIt last, OutputIt d_first, T init,
      BinaryOp binary_op, UnaryOp unary_op );
(1) (depuis C++17)
(constexpr depuis C++20)
template< class ExecutionPolicy,
          class ForwardIt1, class ForwardIt2, class T,
          class BinaryOp, class UnaryOp >
ForwardIt2 transform_exclusive_scan
    ( ExecutionPolicy&& policy,
      ForwardIt1 first, ForwardIt1 last, ForwardIt2 d_first, T init,
      BinaryOp binary_op, UnaryOp unary_op );
(2) (depuis C++17)
1) calcule la somme de préfixe exclusive 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 qui est formée par init suivie des valeurs transformées des éléments de [firstiter) dans l'ordre par unary_op, où iter est le i-ième itérateur de first.
  2. Calcule la somme non commutative généralisée de la séquence sur binary_op.
  3. Assigne le résultat à *dest, où dest est le i-ième itérateur de d_first.
2) Identique à (1), mais exécuté selon policy.
Cette surcharge participe à la résolution de surcharge uniquement 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 non commutative généralisée 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 l'é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 qu'un seul élément dans la séquence.


Le résultat est non déterministe si le binary_op n'est pas associatif (comme l'addition en virgule flottante).

Si l'une des valeurs suivantes n'est pas convertible en T, le programme est mal formé :

  • binary_op(init, init)
  • binary_op(init, unary_op(*first))
  • binary_op(unary_op(*first), unary_op(*first))

Si l'une des conditions suivantes est satisfaite, le comportement est indéfini :

  • T n'est pas MoveConstructible.
  • unary_op ou binary_op modifie tout élément de [firstlast).
  • unary_op ou binary_op invalide tout itérateur ou sous-plage de [firstlast].

Paramètres

first, last - la paire d'itérateurs définissant la plage 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
unary_op - le FunctionObject unaire qui sera appliqué à chaque élément de la plage d'entrée. Le type de retour doit être acceptable en entrée pour binary_op .
binary_op - le FunctionObject binaire qui sera appliqué au résultat de unary_op , aux résultats d'autres binary_op , et à init .
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 unary_op et binary_op respectivement.

Exceptions

La surcharge avec un paramètre de modèle nommé ExecutionPolicy signale 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é.

Notes

unary_op n'est jamais appliqué à init .

Exemple

#include <functional>
#include <iostream>
#include <iterator>
#include <numeric>
#include <vector>
int main()
{
    std::vector data{3, 1, 4, 1, 5, 9, 2, 6};
    auto times_10 = [](int x) { return x * 10; };
    std::cout << "Somme exclusive multipliée par 10 : ";
    std::transform_exclusive_scan(data.begin(), data.end(),
                                  std::ostream_iterator<int>(std::cout, " "),
                                  0, std::plus<int>{}, times_10);
    std::cout << "\nSomme inclusive multipliée par 10 : ";
    std::transform_inclusive_scan(data.begin(), data.end(),
                                  std::ostream_iterator<int>(std::cout, " "),
                                  std::plus<int>{}, times_10);
    std::cout << '\n';
}

Sortie :

Somme exclusive multipliée par 10 : 0 30 40 80 90 140 230 250 
Somme inclusive multipliée par 10 : 30 40 80 90 140 230 250 310

Voir aussi

calcule la somme partielle d'une plage d'éléments
(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)
applique un appelable, puis calcule le scan inclusif
(modèle de fonction)