transform
Материал из cppreference.com
Синтаксис:
#include <algorithm> output_iterator transform( input_iterator start, input_iterator end, output_iterator result, UnaryFunction f ); output_iterator transform( input_iterator start1, input_iterator end1, input_iterator2 start2, output_iterator result, BinaryFunction f );
Алгоритм transform применяет функцию f к диапазону и располагает результат каждого применения в result.
Первая версия функции применяет f к каждому элементу диапазона [start,end) и располагает первый вывод функции в result, второй вывод в (result+1), и т.д.
Вторая версия функции работает аналогично, за исключением того, что ей дается два диапазона и она вызывает бинарную функцию для пары элементов.
Например, следующий код использует transform для конвертирования строки типа string в строку с прописными символами, используя функцию toupper:
string s("hello"); transform(s.begin(), s.end(), s.begin(), toupper); // в некоторых компиляторах вам, возможно, придется добавить явное определение типов к "toupper" для разрешения двусмысленности: // transform(s.begin(), s.end(), s.begin(), (int (*)(int))toupper); cout << s << endl;
Вывод:
HELLO
Следующий пример показывает, как можно трансформировать вектор с помощью определенной пользователем функции:
int increment(int i) { return ++i; } int sum(int a, int b) { return a+b; } int main() { vector<int> v1; for(int i=1; i<6; i++) v1.push_back (i*i); // v1: 1 4 9 16 25 vector<int> v2(v1.size()); transform(v1.begin(), v1.end(), v2.begin(), increment); // v2: 2 5 10 17 26 // добавление элементов v1 и v2, расположение результата в v1 transform(v1.begin(), v1.end(), v2.begin(), v1.begin(), sum); // v1: 3 9 19 33 51 return 0; }