std::transform_inclusive_scan
| Definido en el encabezado <numeric>
|
||
template< class InputIt, class OutputIt,
class BinaryOp, class UnaryOp >
OutputIt transform_inclusive_scan
( InputIt first, InputIt last, OutputIt d_first,
BinaryOp binary_op, UnaryOp unary_op );
|
(1) | (desde C++17) (constexpr desde C++20) |
template< class ExecutionPolicy,
class ForwardIt1, class ForwardIt2,
class BinaryOp, class UnaryOp >
ForwardIt2 transform_inclusive_scan
( ExecutionPolicy&& policy,
ForwardIt1 first, ForwardIt1 last, ForwardIt2 d_first,
BinaryOp binary_op, UnaryOp unary_op );
|
(2) | (desde C++17) |
template< class InputIt, class OutputIt,
class BinaryOp, class UnaryOp, class T >
OutputIt transform_inclusive_scan
( InputIt first, InputIt last, OutputIt d_first,
BinaryOp binary_op, UnaryOp unary_op, T init );
|
(3) | (desde C++17) (constexpr desde C++20) |
template< class ExecutionPolicy,
class ForwardIt1, class ForwardIt2,
class BinaryOp, class UnaryOp, class T >
ForwardIt2 transform_inclusive_scan
( ExecutionPolicy&& policy,
ForwardIt1 first, ForwardIt1 last, ForwardIt2 d_first,
BinaryOp binary_op, UnaryOp unary_op, T init );
|
(4) | (desde C++17) |
op.i en [0, std::distance(first, last)), realiza las siguientes operaciones en orden:
- Crea una secuencia formada por los valores transformados de los elementos de
[first,iter]en orden medianteunary_op, dondeiteres el siguientei-ésimo iterador defirst. - Calcula la suma generalizada no conmutativa de la secuencia sobre
binary_op. - Asigna el resultado a
*dest, dondedestes el siguientei-ésimo iterador ded_first.
init seguido de los elementos de [first, iter] en orden.policy.true:
|
|
(hasta C++20) |
|
|
(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:
- Selecciona dos elementos adyacentes cualesquiera
elem1yelem2de la secuencia. - Calcula
binary_op(elem1, elem2)y reemplaza los dos elementos en la secuencia con el resultado. - Repite los pasos 1 y 2 hasta que solo quede un elemento en la secuencia.
El resultado es no determinista si binary_op no es asociativa (como la suma de punto flotante).
Para las sobrecargas (1,2), si binary_op(unary_op(*first), unary_op(*first)) no es convertible al tipo de valor de decltype(first), el programa está mal formado.
Para las sobrecargas (3,4), si alguno de los siguientes valores no es convertible a T, el programa está mal formado:
binary_op(init, init)binary_op(init, unary_op(*first))binary_op(unary_op(*first), unary_op(*first))
Si alguna de las siguientes condiciones se cumple, el comportamiento no está definido:
- Para las sobrecargas (1,2), el tipo de valor de
decltype(first)no es MoveConstructible. - Para las sobrecargas (3,4),
Tno es MoveConstructible. unary_opobinary_opmodifica cualquier elemento de[first,last).unary_opobinary_opinvalida cualquier iterador o subrango de[first,last].
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 |
| unary_op | - | objeto función FunctionObject unario que será aplicado a cada elemento del rango de entrada. El tipo de retorno debe ser aceptable como entrada para binary_op . |
| binary_op | - | objeto función FunctionObject binario que será aplicado al resultado de unary_op , los resultados de otros binary_op , y init si se proporciona |
| 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 ) :
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
ExecutionPolicyes uno de los standard policies , std::terminate es llamado. Para cualquier otroExecutionPolicy, el comportamiento está definido por la implementación. - Si el algoritmo falla al asignar memoria, std::bad_alloc es lanzado.
Notas
unary_op nunca se aplica a init .
El parámetro init aparece al final, a diferencia de std::transform_exclusive_scan , porque es opcional para esta función.
Ejemplo
#include <functional> #include <iostream> #include <iterator> #include <numeric> #include <vector> int main() { std::vector data{3, 1, 4, 1, 5, 9, 2, 6}; auto times_10 = [](int x) { return x * 10; }; std::cout << "Suma exclusiva multiplicada por 10: "; std::transform_exclusive_scan(data.begin(), data.end(), std::ostream_iterator<int>(std::cout, " "), 0, std::plus<int>{}, times_10); std::cout << "\nSuma inclusiva multiplicada por 10: "; std::transform_inclusive_scan(data.begin(), data.end(), std::ostream_iterator<int>(std::cout, " "), std::plus<int>{}, times_10); std::cout << '\n'; }
Salida:
Suma exclusiva multiplicada por 10: 0 30 40 80 90 140 230 250 Suma inclusiva multiplicada por 10: 30 40 80 90 140 230 250 310
Véase también
| calcula la suma parcial de un rango de elementos (plantilla de función) | |
| aplica una función a un rango de elementos, almacenando los resultados en un rango de destino (plantilla de función & objeto función de algoritmo) | |
(C++20) |
|
(C++17) |
similar a std::partial_sum, incluye el iésimo elemento de entrada en el iésimo suma (plantilla de función) |
(C++17) |
aplica un invocable, luego calcula el escaneo exclusivo (plantilla de función) |