std::transform
| Definido en el archivo de encabezado <algorithm>
|
||
| (1) | ||
template< class InputIt, class OutputIt, class UnaryOperation > OutputIt transform( InputIt first1, InputIt last1, OutputIt d_first, UnaryOperation unary_op ); |
(hasta C++20) | |
template< class InputIt, class OutputIt, class UnaryOperation > constexpr OutputIt transform( InputIt first1, InputIt last1, OutputIt d_first, UnaryOperation unary_op ); |
(desde C++20) | |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2, class UnaryOperation > ForwardIt2 transform( ExecutionPolicy&& policy, ForwardIt1 first1, ForwardIt1 last1, ForwardIt2 d_first, UnaryOperation unary_op ); |
(2) | (desde C++17) |
| (3) | ||
template< class InputIt1, class InputIt2, class OutputIt, class BinaryOperation > OutputIt transform( InputIt1 first1, InputIt1 last1, InputIt2 first2, OutputIt d_first, BinaryOperation binary_op ); |
(hasta C++20) | |
template< class InputIt1, class InputIt2, class OutputIt, class BinaryOperation > constexpr OutputIt transform( InputIt1 first1, InputIt1 last1, InputIt2 first2, OutputIt d_first, BinaryOperation binary_op ); |
(desde C++20) | |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2, class ForwardIt3, class BinaryOperation > ForwardIt3 transform( ExecutionPolicy&& policy, ForwardIt1 first1, ForwardIt1 last1, ForwardIt2 first2, ForwardIt3 d_first, BinaryOperation binary_op ); |
(4) | (desde C++17) |
std::transform aplica la función dada a un rango y almacena el resultado en otro rango que comienza en d_first.
unary_op se aplica al rango definido por [first; last).binary_op se aplica a los pares de elementos de dos rangos: uno definido por [first; last) y el otro empezando en first2.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.
|
|
(hasta C++11) |
|
|
(desde C++11) |
Parámetros
| first1, last1 | - | El primer rango de elementos a transformar. |
| first2 | - | El comienzo del segundo rango de elementos a transformar. |
| d_first | - | El comienzo del rango destino, puede ser igual a first1 o first2.
|
| policy | - | La política de ejecución a usar. Véase política de ejecución para más detalles. |
| unary_op | - | Objeto función de operación unaria que se aplicará. La signatura de la función deberá ser equivalente a lo siguiente:
La signatura no necesita tener |
| binary_op | - | Función objeto de operación binaria que se aplicará. La signatura de la función deberá ser equivalente a lo siguiente:
La signatura no necesita tener |
| Requisitos de tipo | ||
-InputIt, InputIt1, InputIt2 debe satisfacer los requisitos de InputIterator.
| ||
-OutputIt debe satisfacer los requisitos de OutputIterator.
| ||
-ForwardIt1, ForwardIt2, ForwardIt3 debe satisfacer los requisitos de ForwardIterator.
| ||
Valor de retorno
Un iterador de salida al elemento después del último elemento transformado.
Complejidad
std::distance(first1, last1) aplicaciones de unary_op.std::distance(first1, last1) aplicaciones de binary_op.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.
Posible implementación
| Primera versión |
|---|
template<class InputIt, class OutputIt, class UnaryOperation>
OutputIt transform(InputIt first1, InputIt last1, OutputIt d_first,
UnaryOperation unary_op)
{
while (first1 != last1) {
*d_first++ = unary_op(*first1++);
}
return d_first;
}
|
| Segunda versión |
template<class InputIt1, class InputIt2,
class OutputIt, class BinaryOperation>
OutputIt transform(InputIt1 first1, InputIt1 last1, InputIt2 first2,
OutputIt d_first, BinaryOperation binary_op)
{
while (first1 != last1) {
*d_first++ = binary_op(*first1++, *first2++);
}
return d_first;
}
|
Notas
std::transform no garantiza una aplicación en orden de unary_op o de binary_op. Para aplicar una función a una secuencia en orden o para aplicar una función que modifica los elementos de una secuencia, utilizar std::for_each.
Ejemplo
El siguiente código utiliza transform para convertir una cadena en el sitio a mayúsculas utilizando la función std::toupper y luego transforma cada char a su valor ordinal:
#include <algorithm>
#include <cctype>
#include <iostream>
#include <string>
#include <vector>
int main()
{
std::string s("hola");
std::transform(s.begin(), s.end(), s.begin(),
[](unsigned char c) -> unsigned char { return std::toupper(c); });
std::vector<std::size_t> ordinals;
std::transform(s.begin(), s.end(), std::back_inserter(ordinals),
[](unsigned char c) -> std::size_t { return c; });
std::cout << s << ':';
for (auto ord : ordinals) {
std::cout << ' ' << ord;
}
std::transform(ordinals.cbegin(), ordinals.cend(), ordinals.cbegin(),
ordinals.begin(), std::plus<>{});
std::cout << '\n';
for (auto ord : ordinals) {
std::cout << ord << ' ';
}
std::cout << '\n';
}
Salida:
HOLA: 72 79 76 65
144 158 152 130
Véase también
| Aplica una función a un rango de elementos. (plantilla de función) |