std::inclusive_scan
Definido en el archivo de encabezado <numeric>
|
||
(1) | ||
template< class InputIt, class OutputIt > OutputIt inclusive_scan( InputIt first, |
(desde C++17) (hasta C++20) |
|
template< class InputIt, class OutputIt > constexpr OutputIt inclusive_scan( InputIt first, |
(desde C++20) | |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 > ForwardtIt2 inclusive_scan( ExecutionPolicy&& policy, ForwardIt1 first, |
(2) | (desde C++17) |
(3) | ||
template< class InputIt, class OutputIt, class BinaryOperation > OutputIt inclusive_scan( InputIt first, InputIt last, |
(desde C++17) (hasta C++20) |
|
template< class InputIt, class OutputIt, class BinaryOperation > constexpr OutputIt inclusive_scan( InputIt first, InputIt last, |
(desde C++20) | |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2, class BinaryOperation > |
(4) | (desde C++17) |
(5) | ||
template< class InputIt, class OutputIt, class BinaryOperation, class T > OutputIt inclusive_scan( InputIt first, InputIt last, OutputIt d_first, |
(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, |
(desde C++20) | |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2, class BinaryOperation, class T > |
(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 todaj
en [first, first + (i - d_first + 1)) sobrebinary_op
, - para las sobrecargas (5-6), la suma generalizada no conmutativa de
init, *j...
para todaj
en [first, first + (i - d_first + 1)) sobrebinary_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) | |
Suma un rango de elementos (plantilla de función) | |
Calcula la suma parcial de un rango de elementos (plantilla de función) | |
(C++17) |
Aplica un invocable, luego calcula la suma de prefijo (o suma acumulativa) inclusiva (plantilla de función) |
(C++17) |
Similar a std::partial_sum, excluye el i-ésimo elemento de entrada de la i-ésima suma (plantilla de función) |