Namespaces
Variants

std::transform_inclusive_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 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)

Opérations de tri et connexes
Opérations de partitionnement
(C++11)    

Opérations de tri
Opérations de recherche binaire
(sur les plages partitionnées)
Opérations d'ensemble (sur les plages triées)
Opérations de fusion (sur les 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,
          class BinaryOp, class UnaryOp >
OutputIt transform_inclusive_scan
    ( InputIt first, InputIt last, OutputIt d_first,
      BinaryOp binary_op, UnaryOp unary_op );
(1) (depuis C++17)
(constexpr depuis C++20)
template< class ExecutionPolicy,
          class ForwardIt1, class ForwardIt2,
          class BinaryOp, class UnaryOp >
ForwardIt2 transform_inclusive_scan
    ( ExecutionPolicy&& policy,
      ForwardIt1 first, ForwardIt1 last, ForwardIt2 d_first,
      BinaryOp binary_op, UnaryOp unary_op );
(2) (depuis C++17)
template< class InputIt, class OutputIt,
          class BinaryOp, class UnaryOp, class T >
OutputIt transform_inclusive_scan
    ( InputIt first, InputIt last, OutputIt d_first,
      BinaryOp binary_op, UnaryOp unary_op, T init );
(3) (depuis C++17)
(constexpr depuis C++20)
template< class ExecutionPolicy,
          class ForwardIt1, class ForwardIt2,
          class BinaryOp, class UnaryOp, class T >
ForwardIt2 transform_inclusive_scan
    ( ExecutionPolicy&& policy,
      ForwardIt1 first, ForwardIt1 last, ForwardIt2 d_first,
      BinaryOp binary_op, UnaryOp unary_op, T init );
(4) (depuis C++17)
1) 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 qui est formée par les valeurs transformées des éléments de [firstiter] dans l'ordre par unary_op, où iter est le ième itérateur suivant de first.
  2. Calcule la somme généralisée non commutative de la séquence sur binary_op.
  3. Affecte le résultat à *dest, où dest est le ième itérateur suivant de d_first.
3) Identique à (1), mais chaque séquence créée est formée par init suivi des éléments de [firstiter] dans l'ordre.
2,4) Identique à (1,3), mais exécutée selon policy.
Ces surcharges participent à 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 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 l'élément.
  • Sinon, effectue les opérations suivantes dans l'ordre :
  1. Sélectionne deux éléments adjacents elem1 et elem2 de la séquence.
  2. Calcule binary_op(elem1, elem2) et remplace les deux éléments de 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.


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

Pour les surcharges (1,2), si binary_op(unary_op(*first), unary_op(*first)) n'est pas convertible en type de valeur de decltype(first), le programme est mal formé.

Pour les surcharges (3,4), 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 :

  • Pour les surcharges (1,2), le type de valeur de decltype(first) n'est pas MoveConstructible.
  • Pour les surcharges (3,4), 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 - un 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 - un FunctionObject binaire qui sera appliqué au résultat de unary_op , aux résultats d'autres binary_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-4) O(N) applications de unary_op et binary_op respectivement.

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ée.

Notes

unary_op n'est jamais appliqué à init .

Le paramètre init apparaît en dernier, différant de std::transform_exclusive_scan , car il est optionnel pour cette fonction.

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)
applique une fonction à une plage d'éléments, stockant les résultats dans une plage de destination
(modèle de fonction &objet fonction d'algorithme)
similaire à std::partial_sum, inclut le ith élément d'entrée dans la ith somme
(modèle de fonction)
applique un invocable, puis calcule le scan exclusif
(modèle de fonction)