Namespaces
Variants

std::inclusive_scan

De es.cppreference.net
 
 
Biblioteca de algoritmos
Algoritmos restringidos y algoritmos sobre rangos (C++20)
Algoritmos restringidos, p. ej. ranges::copy, ranges::sort, ...
Operaciones de secuencia no modificadoras    
Operaciones por lotes
(C++17)
Operaciones de búsqueda
Operaciones de secuencia modificadoras
Operaciones de copia
(C++11)
(C++11)
Operaciones de intercambio
Operaciones de transformación
Operaciones de generación
Operaciones de eliminación
Operaciones de cambio de orden
(hasta C++17)(C++11)
(C++20)(C++20)
Operaciones de muestreo
(C++17)

Ordenación y operaciones relacionadas
Operaciones de partición
(C++11)    

Operaciones de ordenación
Operaciones de búsqueda binaria
(en rangos particionados)
Operaciones de conjuntos (en rangos ordenados)
Operaciones de mezcla (en rangos ordenados)
Operaciones de montículo
Operaciones de mínimo/máximo
(C++11)
(C++17)
Operaciones de comparación lexicográfica
Operaciones de permutación


 
 
Definido en el encabezado <numeric>
template< class InputIt, class OutputIt >
OutputIt inclusive_scan( InputIt first, InputIt last,
                         OutputIt d_first );
(1) (desde C++17)
(constexpr desde C++20)
template< class ExecutionPolicy,
          class ForwardIt1, class ForwardIt2 >
ForwardIt2 inclusive_scan( ExecutionPolicy&& policy,
                           ForwardIt1 first, ForwardIt1 last,
                           ForwardIt2 d_first );
(2) (desde C++17)
template< class InputIt, class OutputIt, class BinaryOp >
OutputIt inclusive_scan( InputIt first, InputIt last,
                         OutputIt d_first, BinaryOp op );
(3) (desde C++17)
(constexpr desde C++20)
template< class ExecutionPolicy,
          class ForwardIt1, class ForwardIt2, class BinaryOp >
ForwardIt2 inclusive_scan( ExecutionPolicy&& policy,
                           ForwardIt1 first, ForwardIt1 last,
                           ForwardIt2 d_first, BinaryOp op );
(4) (desde C++17)
template< class InputIt, class OutputIt,
          class BinaryOp, class T >
OutputIt inclusive_scan( InputIt first, InputIt last,
                         OutputIt d_first, BinaryOp op, T init );
(5) (desde C++17)
(constexpr desde C++20)
template< class ExecutionPolicy,
          class ForwardIt1, class ForwardIt2,
          class BinaryOp, class T >
ForwardIt2 inclusive_scan( ExecutionPolicy&& policy,
                           ForwardIt1 first, ForwardIt1 last,
                           ForwardIt2 d_first, BinaryOp op, T init );
(6) (desde C++17)
1) Equivalente a inclusive_scan(first, last, d_first, std::plus<>().
3) Calcula la suma prefija inclusiva usando op.
Para cada entero i en [0, std::distance(first, last)), realiza las siguientes operaciones en orden:
  1. Crea una secuencia formada por los elementos de [first, iter] en orden, donde iter es el siguiente iésimo iterador 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 iésimo iterador de d_first.
5) Igual que (3), pero cada secuencia creada está formada por init seguido de los elementos de [first, iter] en orden.
2,4,6) Igual que (1,3,5), pero ejecutado de acuerdo con policy.
Estas sobrecargas participan en la resolución de sobrecargas solo si el valor de la siguiente expresión es true:

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)

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.
  • En caso 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 binary_op no es asociativa (como la suma de punto flotante).
  • Para las sobrecargas (1-4), si binary_op(*first, *first) no es convertible al tipo de valor de decltype(first), el programa está mal formado.
  • Para las sobrecargas (5,6), 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 cumple alguna de las siguientes condiciones, el comportamiento no está definido:
  • Para las sobrecargas (1-4), el tipo de valor de decltype(first) no es MoveConstructible.
  • Para las sobrecargas (5,6), T no es MoveConstructible.
  • binary_op modifica cualquier elemento de [first, last).
  • binary_op invalida cualquier iterador o subrango de [first, last].

Parámetros

first, last - el par de iteradores que definen el rango fuente de elementos a sumar
d_first - el inicio del rango de destino; puede ser igual a first
policy - la política de ejecución a utilizar
init - el valor inicial
op - objeto función FunctionObject binario que se aplicará al resultado de desreferenciar los iteradores de entrada, los resultados de otros op e init (si se proporciona)
Requisitos de tipo
-
InputIt debe cumplir los requisitos de LegacyInputIterator.
-
OutputIt debe cumplir los requisitos de LegacyOutputIterator.
-
ForwardIt1, ForwardIt2 debe cumplir 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-6) 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 una de las políticas estándar, se llama a std::terminate. Para cualquier otro ExecutionPolicy, el comportamiento está definido por la implementación.
  • Si el algoritmo falla al asignar memoria, se lanza std::bad_alloc.

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 la exploración inclusiva
(plantilla de función)
similar a std::partial_sum, excluye el iésimo elemento de entrada de la iésima suma
(plantilla de función)