Функция transform
Функция transform применяет заданную операцию к каждому элементу исходного диапазона и записывает результат в целевой диапазон. В первом параметре мы передаем итератор начала исходного диапазона, во втором - итератор конца исходного диапазона, в третьем - итератор начала целевого диапазона, а в четвертом - функцию или функциональный объект, который выполняет преобразование.
Существует две формы функции: унарная, которая принимает один аргумент, и бинарная, которая принимает два аргумента из двух разных диапазонов. Функция возвращает итератор, указывающий на элемент, следующий за последним преобразованным элементом в целевом диапазоне.
Синтаксис
// унарная операция
transform(first1, last1, result, unary_op);
// бинарная операция
transform(first1, last1, first2, result, binary_op);
Пример
Давайте умножим каждый элемент вектора на 2 с помощью лямбда-функции:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> src = {1, 2, 3, 4, 5};
vector<int> res(src.size());
transform(src.begin(), src.end(), res.begin(), [](int x) {
return x * 2;
});
for (int x : res) {
cout << x << " ";
}
cout << endl;
return 0;
}
Результат выполнения кода:
2 4 6 8 10
Пример
Давайте преобразуем строку в верхний регистр с помощью функции toupper:
#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>
using namespace std;
int main()
{
string src = "abcde";
string res = src;
transform(src.begin(), src.end(), res.begin(), [](unsigned char c) {
return toupper(c);
});
cout << res << endl;
return 0;
}
Результат выполнения кода:
"ABCDE"
Пример
Давайте сложим элементы двух векторов попарно с помощью бинарной формы функции:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> a = {1, 2, 3, 4, 5};
vector<int> b = {10, 20, 30, 40, 50};
vector<int> res(a.size());
transform(a.begin(), a.end(), b.begin(), res.begin(), [](int x, int y) {
return x + y;
});
for (int x : res) {
cout << x << " ";
}
cout << endl;
return 0;
}
Результат выполнения кода:
11 22 33 44 55
Пример
Давайте заменим каждый элемент вектора на противоположный по знаку, используя стандартную функцию negate:
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
int main()
{
vector<int> src = {1, 2, 3, 4, 5};
vector<int> res(src.size());
transform(src.begin(), src.end(), res.begin(), negate<int>());
for (int x : res) {
cout << x << " ";
}
cout << endl;
return 0;
}
Результат выполнения кода:
-1 -2 -3 -4 -5
Смотрите также
-
функция
copy,
которая копирует элементы из одного диапазона в другой -
функция
for_each,
которая применяет функцию к каждому элементу диапазона -
функция
replace,
которая заменяет элементы с определенным значением -
функция
accumulate,
которая вычисляет сумму элементов диапазона