Namespaces
Variants

std:: transform_exclusive_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
transform_exclusive_scan
(C++17)

Operations on uninitialized memory
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 préfixe exclusive 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 init suivie des valeurs transformées des éléments de [ first , iter ) dans l'ordre par unary_op , 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 sur binary_op .
  3. Affecte le résultat à * dest , où dest est le prochain i ième itérateur de d_first .
2) Identique à (1) , mais exécuté selon la policy .
Cette surcharge participe à la résolution de surcharge uniquement 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.


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 un élément quelconque de [ first , last ) .
  • unary_op ou binary_op invalide un itérateur ou un sous-intervalle quelconque de [ first , last ] .

Table des matières

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)