Espacios de nombres
Variantes
Acciones

std::inclusive_scan

De cppreference.com
< cpp‎ | algorithm
 
 
Biblioteca de algoritmos
Políticas de ejecución (C++17)
Operaciones de secuencia no modificantes
(C++11)(C++11)(C++11)
(C++17)
Operaciones de secuencia modificantes
Operaciones en almacenamiento no inicializado
Operaciones de partición
Operaciones de ordenación
(C++11)
Operaciones de búsqueda binaria
Operaciones de conjuntos (en rangos ordenados)
Operaciones de pila
(C++11)
Operaciones mínimo/máximo
(C++11)
(C++17)
Permutaciones
Operaciones numéricas
inclusive_scan
(C++17)
Bibliotecas C
 
Definido en el archivo de encabezado <numeric>
(1)
template< class InputIt, class OutputIt >

OutputIt inclusive_scan( InputIt first,

                         InputIt last, OutputIt d_first );
(desde C++17)
(hasta C++20)
template< class InputIt, class OutputIt >

constexpr OutputIt inclusive_scan( InputIt first,

                                   InputIt last, OutputIt d_first );
(desde C++20)
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >

ForwardtIt2 inclusive_scan( ExecutionPolicy&& policy, ForwardIt1 first,

                            ForwardIt1 last, ForwardIt2 d_first );
(2) (desde C++17)
(3)
template< class InputIt, class OutputIt, class BinaryOperation >

OutputIt inclusive_scan( InputIt first, InputIt last,

                         OutputIt d_first, BinaryOperation binary_op );
(desde C++17)
(hasta C++20)
template< class InputIt, class OutputIt, class BinaryOperation >

constexpr OutputIt inclusive_scan( InputIt first, InputIt last,

                                   OutputIt d_first, BinaryOperation binary_op );
(desde C++20)
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2,

          class BinaryOperation >
ForwardIt2 inclusive_scan( ExecutionPolicy&& policy,
                           ForwardIt1 first, ForwardIt1 last,

                           ForwardIt2 d_first, BinaryOperation binary_op );
(4) (desde C++17)
(5)
template< class InputIt, class OutputIt, class BinaryOperation, class T >

OutputIt inclusive_scan( InputIt first, InputIt last, OutputIt d_first,

                         BinaryOperation binary_op, T init );
(desde C++17)
(hasta C++20)
template< class InputIt, class OutputIt, class BinaryOperation, class T >

constexpr OutputIt inclusive_scan( InputIt first, InputIt last, OutputIt d_first,

                                   BinaryOperation binary_op, T init );
(desde C++20)
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2,

          class BinaryOperation, class T >
ForwardIt2 inclusive_scan( ExecutionPolicy&& policy,
                           ForwardIt1 first, ForwardIt1 last, ForwardIt2 d_first,

                           BinaryOperation binary_op, T init );
(6) (desde C++17)

Calcula una suma de prefijo inclusiva utilizando binary_op (o std::plus<>() para las sobrecargas (1-2)) para el rango [first, last), utilizando init como el valor inicial (si se proporciona), y escribe los resultados en el rango que comienza en d_first. "Inclusiva" significa que el i-ésimo elemento de entrada se incluye en la i-ésima suma.

Formalmente, asigna a través de cada iterador i en [d_first, d_first + (last - first)) el valor de:

  • para las sobrecargas (1-4), la suma generalizada no conmutativa de *j... para toda j en [first, first + (i - d_first + 1)) sobre binary_op,
  • para las sobrecargas (5-6), la suma generalizada no conmutativa de init, *j... para toda j en [first, first + (i - d_first + 1)) sobre binary_op,

donde la suma generalizada no conmutativa de GNSUM(op, a
1
, ..., a
N
)
se define de la manera siguiente:

  • si N=1, a
    1
  • si N > 1, op(GNSUM(op, a
    1
    , ..., a
    K
    ), GNSUM(op, a
    M
    , ..., a
    N
    ))
    para cualquier K donde 1 < K+1 = M ≤ N

En otras palabras, las operaciones de suma pueden realizarse en orden arbitrario, y el comportamiento no es determinista si binary_op no es asociativa.

Las sobrecargas (2,4,6) se ejecutan de acuerdo a la política de ejecución policy. Estas sobrecargas no participan en la resolución de sobrecarga a menos que std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> (hasta C++20) std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> (desde C++20) sea verdadera.

binary_op no deberá invalidar interadores (incluyendo los iteradores al final) o subrangos, ni modificar elementos en los rangos [first, last) o [d_first, d_first + (last - first)). De lo contrario, el comportamiento está indefinido.

Contenido

[editar] Parámetros

first, last - 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 usar. Véase política de ejecución para más detalles.
init - El valor inicial (opcional).
binary_op - Objeto función (FunctionObject) binario que se aplicará al resultado de desreferenciar los iteradores de entrada, los resultados de otra binary_op, e init (si se proporciona).
Requisitos de tipo
-
InputIt debe satisfacer los requisitos de InputIterator.
-
OutputIt debe satisfacer los requisitos de OutputIterator.
-
ForwardIt1 debe satisfacer los requisitos de ForwardIterator.
-
ForwardIt2 debe satisfacer los requisitos de ForwardIterator.
-
Si init no se proporciona, el tipo del valor de decltype(first)debe ser MoveConstructible y binary_op(*first, *first) debe ser convertible al tipo de valor de decltype(first).
-
T (si se proporciona init) debe satisfacer los requisitos de MoveConstructible. Todos los siguientes, binary_op(init, *first), binary_op(init, init), y binary_op(*first, *first) deben ser convertibles a T.

[editar] Valor de retorno

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

[editar] Complejidad

O(last - first) aplicaciones de la operación binaria.

[editar] Excepciones

Las sobrecargas con un parámetro de plantilla llamado ExecutionPolicy (política de ejecución) reportan errores tales que:

  • Si la ejecución de una función invocada como parte del algoritmo lanza una excepción y la política de ejecución es una de las tres políticas estándar, se llama a std::terminate. Para cualquier otra política de ejecución, el comportamiento está definido por la implementación.
  • Si el algoritmo falla al asignar memoria, se lanza std::bad_alloc.

[editar] 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 << "suma exclusiva: ";
  std::exclusive_scan(data.begin(), data.end(),
		      std::ostream_iterator<int>(std::cout, " "),
		      0);
  std::cout << "\nsuma inclusiva: ";
  std::inclusive_scan(data.begin(), data.end(),
		      std::ostream_iterator<int>(std::cout, " "));
 
  std::cout << "\n\nproducto exclusivo: ";  
  std::exclusive_scan(data.begin(), data.end(),
		      std::ostream_iterator<int>(std::cout, " "),
		      1, std::multiplies<>{});		      
  std::cout << "\nproducto inclusivo: ";
  std::inclusive_scan(data.begin(), data.end(),
		      std::ostream_iterator<int>(std::cout, " "),
		      std::multiplies<>{});		      
}

Salida:

suma exclusiva: 0 3 4 8 9 14 23 25 
suma inclusiva: 3 4 8 9 14 23 25 31 
 
producto exclusivo: 1 3 3 12 12 60 540 1080 
producto inclusivo: 3 3 12 12 60 540 1080 6480

[editar] Véase también

Calcula las diferencias entre elementos adyacentes en un rango
(plantilla de función) [editar]
Suma un rango de elementos
(plantilla de función) [editar]
Calcula la suma parcial de un rango de elementos
(plantilla de función) [editar]
Aplica un invocable, luego calcula la suma de prefijo (o suma acumulativa) inclusiva
(plantilla de función) [editar]
Similar a std::partial_sum, excluye el i-ésimo elemento de entrada de la i-ésima suma
(plantilla de función) [editar]