Namespaces
Variants

std:: 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
Operations on uninitialized memory
Definido en el encabezado <numeric>
template < class InputIt, class OutputIt, class T >

OutputIt exclusive_scan ( InputIt first, InputIt last,

OutputIt d_first, T init ) ;
(1) (desde C++17)
(constexpr desde 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) (desde 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) (desde C++17)
(constexpr desde 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) (desde C++17)
1) Equivalente a exclusive_scan ( first, last, d_first, init, std:: plus <> ( ) .
3) Calcula la suma de prefijo exclusiva utilizando op .
Para cada entero i en [ 0 , std:: distance ( first, last ) ) , realiza las siguientes operaciones en orden:
  1. Crea una secuencia formada por init seguido de los elementos de [ first , iter ) en orden, donde iter es el siguiente iterador número i th de first .
  2. Calcula la suma generalizada no conmutativa de la secuencia sobre op .
  3. Asigna el resultado a * dest , donde dest es el siguiente iterador número i th de d_first .
2,4) Igual que (1,3) , pero ejecutado de acuerdo con policy .
Estas sobrecargas participan en la resolución de sobrecarga solo si se cumplen todas las siguientes condiciones:

std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> es true .

(hasta C++20)

std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> es true .

(desde C++20)

La suma generalizada no conmutativa de una secuencia de elementos sobre una operación binaria binary_op se define de la siguiente manera:

  • Si la secuencia solo tiene un elemento, la suma es el valor del elemento.
  • De lo contrario, realiza las siguientes operaciones en orden:
  1. Selecciona dos elementos adyacentes cualesquiera elem1 y elem2 de la secuencia.
  2. Calcula binary_op ( elem1, elem2 ) y reemplaza los dos elementos en la secuencia con el resultado.
  3. Repite los pasos 1 y 2 hasta que solo quede un elemento en la secuencia.


Dado binary_op como la operación binaria real:

  • El resultado es no determinista si el binary_op no es asociativo (como la suma de punto flotante).
  • Si alguno de los siguientes valores no es convertible a T , el programa está mal formado:
  • binary_op ( init, * first )
  • binary_op ( init, init )
  • binary_op ( * first, * first )
  • Si se satisface cualquiera de las siguientes condiciones, el comportamiento es indefinido:
  • T no es MoveConstructible .
  • binary_op modifica cualquier elemento de [ first , last ) .
  • binary_op invalida cualquier iterador o subrango de [ first , last ] .

Contenidos

Parámetros

first, last - el par de iteradores que define el rango de elementos a sumar
d_first - el inicio del rango destino; puede ser igual a first
policy - la política de ejecución a utilizar
init - el valor inicial
op - objeto binario FunctionObject que será aplicado al resultado de desreferenciar los iteradores de entrada, los resultados de otros op , y init
Requisitos de tipo
-
InputIt debe cumplir con los requisitos de LegacyInputIterator .
-
OutputIt debe cumplir con los requisitos de LegacyOutputIterator .
-
ForwardIt1, ForwardIt2 debe cumplir con los requisitos de LegacyForwardIterator .

Valor de retorno

Iterador al elemento después del último elemento escrito.

Complejidad

Dado N como std:: distance ( first, last ) :

1,2) O(N) aplicaciones de std:: plus <> ( ) .
3,4) O(N) aplicaciones de op .

Excepciones

Las sobrecargas con un parámetro de plantilla llamado ExecutionPolicy reportan errores de la siguiente manera:

  • Si la ejecución de una función invocada como parte del algoritmo lanza una excepción y ExecutionPolicy es uno de los standard policies , std::terminate es llamado. Para cualquier otro ExecutionPolicy , el comportamiento está definido por la implementación.
  • Si el algoritmo falla al asignar memoria, std::bad_alloc es lanzado.

Ejemplo

#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<>{});
}

Salida:

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

Véase también

calcula las diferencias entre elementos adyacentes en un rango
(plantilla de función)
suma o pliega un rango de elementos
(plantilla de función)
calcula la suma parcial de un rango de elementos
(plantilla de función)
aplica un invocable, luego calcula un escaneo exclusivo
(plantilla de función)
similar a std::partial_sum , incluye el i ésimo elemento de entrada en la i ésima suma
(plantilla de función)