std::exclusive_scan
De fr.cppreference.net
< cpp | algorithmes
| 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 [0, std::distance(first, last)), effectue les opérations suivantes dans l'ordre :
- Crée une séquence qui est formée de
initsuivie des éléments de[first,iter)dans l'ordre, oùiterest leiième itérateur suivant defirst. - Calcule la somme généralisée non commutative de la séquence sur
op. - Affecte le résultat à
*dest, oùdestest leiième itérateur suivant ded_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 :
|
|
(jusqu'à C++20) |
|
|
(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 :
- Sélectionne deux éléments adjacents quelconques
elem1etelem2de la séquence. - Calcule
binary_op(elem1, elem2)et remplace les deux éléments de la séquence par le résultat. - 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_opn'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 :
Tn'est pas MoveConstructible.binary_opmodifie un élément quelconque de[first,last).binary_opinvalide un itérateur ou une sous-plage quelconque de[first,last].
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
ExecutionPolicyfait partie des politiques standard, std::terminate est appelée. Pour toute autreExecutionPolicy, 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
Exécuter ce code
#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) | |
(C++17) |
applique un appelable, puis calcule le scan exclusif (gabarit de fonction) |
(C++17) |
similaire à std::partial_sum, inclut le ième élément d'entrée dans la ième somme (gabarit de fonction) |