std::exclusive_scan
De es.cppreference.net
| 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 prefija exclusiva usando
op. Para cada entero
i en [0, std::distance(first, last)), realiza las siguientes operaciones en orden:
- Crea una secuencia que se forma mediante
initseguido de los elementos de[first,iter)en orden, dondeiteres el siguienteiésimo iterador defirst. - Calcula la suma generalizada no conmutativa de la secuencia sobre
op. - Asigna el resultado a
*dest, dondedestes el siguienteiésimo iterador ded_first.
2,4) Igual que (1,3), pero ejecutado de acuerdo a
policy. Estas sobrecargas participan en la resolución de sobrecargas solo si el valor de la siguiente expresión es
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 tiene solo un elemento, la suma es el valor del elemento.
- De lo 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.
Dado binary_op como la operación binaria real:
- El resultado es no determinista si
binary_opno es asociativa (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 cumple alguna de las siguientes condiciones, el comportamiento no está definido:
Tno es MoveConstructible.binary_opmodifica cualquier elemento de[first,last).binary_opinvalida cualquier iterador o subrango de[first,last].
Parámetros
| first, last | - | el par de iteradores que definen el rango 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 usar |
| init | - | el valor inicial |
| op | - | objeto función binario FunctionObject que se aplicará al resultado de desreferenciar los iteradores de entrada, los resultados de otros op, y init
|
| 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,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
ExecutionPolicyes una de las políticas estándar, se llama a std::terminate. Para cualquier otroExecutionPolicy, el comportamiento está definido por la implementación. - Si el algoritmo falla al asignar memoria, se lanza std::bad_alloc.
Ejemplo
Ejecutar este código
#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) | |
(C++17) |
aplica un invocable, luego calcula el escaneo exclusivo (plantilla de función) |
(C++17) |
similar a std::partial_sum, incluye el iésimo elemento de entrada en la iésima suma (plantilla de función) |