std::transform — cppreference.com
Материал из cppreference.com
<tbody> </tbody>
| Определено в заголовочном файле |
||
|
|
(1) | |
|
|
(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; }
Вывод: