Namespaces
Variants

std::exclusive_scan

De fr.cppreference.net
 
 
Bibliothèque d'algorithmes
Algorithmes contraints et algorithmes sur les vues (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)

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

Opérations de tri
Opérations de recherche dichotomique
(sur des intervalles partitionnés)
Opérations ensemblistes (sur des intervalles triés)
Opérations de fusion (sur des intervalles triés)
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 T >
OutputIt exclusive_scan( InputIt first, InputIt last,
                         OutputIt d_first, T init );
(1) (depuis C++17)
(constexpr depuis C++20)
template< class ExecutionPolicy,
          class ForwardIt1, class ForwardIt2, class T >
ForwardIt2 exclusive_scan( ExecutionPolicy&& policy,
                           ForwardIt1 first, ForwardIt1 last,
                           ForwardIt2 d_first, T init );
(2) (depuis C++17)
template< class InputIt, class OutputIt,
          class T, class BinaryOp >
OutputIt exclusive_scan( InputIt first, InputIt last,
                         OutputIt d_first, T init, BinaryOp op );
(3) (depuis C++17)
(constexpr depuis C++20)
template< class ExecutionPolicy,
          class ForwardIt1, class ForwardIt2,
          class T, class BinaryOp >
ForwardIt2 exclusive_scan( ExecutionPolicy&& policy,
                           ForwardIt1 first, ForwardIt1 last,
                           ForwardIt2 d_first, T init, BinaryOp op );
(4) (depuis C++17)
1) Équivalent à exclusive_scan(first, last, d_first, init, std::plus<>().
3) Calcule le préfixe exclusif 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 de init suivie des éléments de [firstiter) dans l'ordre, où iter est le iième itérateur suivant de 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 de d_first.
2,4) Identique à (1,3), mais exécuté selon policy.
Ces surcharges ne participent à la résolution des surcharges 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 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.


É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).
  • 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 :
  • T n'est pas MoveConstructible.
  • binary_op modifie un élément quelconque de [firstlast).
  • binary_op invalide un itérateur ou une sous-plage quelconque de [firstlast].

Paramètres

first, last - la paire d'itérateurs définissant l'intervalle d'éléments à sommer
d_first - le début de l'intervalle 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
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 après le dernier élément écrit.

Complexité

Soit N égal à std::distance(first, last) :

1,2) O(N) applications de std::plus<>().
3,4) 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ée. Pour toute 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 des éléments adjacents dans un intervalle
(gabarit de fonction)
additionne ou plie un intervalle d'éléments
(gabarit de fonction)
calcule la somme partielle d'un intervalle d'éléments
(gabarit de fonction)
applique un appelable, puis calcule le scan exclusif
(gabarit de fonction)
similaire à std::partial_sum, inclut le ième élément d'entrée dans la ième somme
(gabarit de fonction)