std::transform
Определено в заголовочном файле <algorithm>
|
||
template< class InputIt, class OutputIt, class UnaryOperation > OutputIt transform( InputIt first1, InputIt last1, OutputIt d_first, |
(1) | |
template< class InputIt1, class InputIt2, class OutputIt, class BinaryOperation > OutputIt transform( InputIt1 first1, InputIt1 last1, InputIt2 first2, |
(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: Ret fun(const Type &a); The signature does not need to have const &. |
binary_op | — | binary operation function object that will be applied. The signature of the function should be equivalent to the following: Ret fun(const Type1 &a, const Type2 &b); The signature does not need to have const &. |
Требования к типам | ||
-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
[править] См. также
применяет функцию к диапазону элементов (шаблон функции) |