std::transform
| Определено в заголовочном файле <algorithm>
|
||
template< class InputIt, class OutputIt, class UnaryOperation > OutputIt transform( InputIt first1, InputIt last1, OutputIt d_first, UnaryOperation unary_op ); |
(1) | |
template< class InputIt1, class InputIt2, class OutputIt, class BinaryOperation > OutputIt transform( InputIt1 first1, InputIt1 last1, InputIt2 first2, OutputIt d_first, BinaryOperation binary_op ); |
(2) | |
Применяет заданную функцию к одному диапазону и сохраняет результат в другой диапазон, начинающийся с d_first.
В первом варианте унарная операция unary_op применяется к диапазону [first1, last1). Во втором варианте бинарная операция binary_op применяется к элементам из двух диапазонов: [first1, last1) и начинающемуся с first2.
Параметры
[first1, last1)
|
— | два итератора задающих диапазон элементов для использования |
| first2 | — | начало второго диапазона элементов для использования |
| d_first | — | начало целевого диапазона, может совпадать с first1 или first2
|
| unary_op | — | unary operation function object that will be applied. The signature of the function should be equivalent to the following:
The signature does not need to have |
| binary_op | — | binary operation function object that will be applied. The signature of the function should be equivalent to the following:
The signature does not need to have |
| Требования к типам | ||
-InputIt должен соответствовать требованиям InputIterator.
| ||
-InputIt1 должен соответствовать требованиям InputIterator.
| ||
-InputIt2 должен соответствовать требованиям InputIterator.
| ||
-OutputIt должен соответствовать требованиям OutputIterator.
| ||
Возвращаемое значение
Output-итератор на элемент, следующий за последним изменённым.
Сложность
1) Ровно std::distance(first1, last1) применений unary_op.
2) Ровно std::distance(first1, last1) применений binary_op.
Требования
unary_op и binary_op не имеют побочных эффектов. (до C++11)
unary_op и binary_op не делают некорректными никакие итераторы (включая конечные) и не изменяют никакие элементы участвующих диапазонов. (начиная с C++11)
Целью этих требований является возможность параллельных или неупорядоченных реализаций функции std::transform. Чтобы применить функцию к последовательности по порядку, следует использовать std::for_each.
Возможная реализация
| Первый вариант |
|---|
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;
}
|
| Второй вариант |
template<class InputIt1, class InputIt2,
class OutputIt, class BinaryOperation>
OutputIt transform(InputIt first1, InputIt last1, InputIt first2,
OutputIt d_first, BinaryOperation binary_op)
{
while (first1 != last1) {
*d_first++ = binary_op(*first1++, *first2++);
}
return d_first;
}
|
Пример
Следующий код использует std::transform для приведения строки в верхний регистр при помощи функции std::toupper:
#include <string>
#include <cctype>
#include <algorithm>
#include <iostream>
int main()
{
std::string s("hello");
std::transform(s.begin(), s.end(), s.begin(), (int (*)(int))std::toupper);
std::cout << s;
}
Вывод:
HELLO
См. также
| применяет функцию к диапазону элементов (шаблон функции) |