C++算法 transform()函数以两种不同的方式使用:
1.一元运算 :- 此方法对range[first1,last1]中的元素执行一元运算op,并将结果存储在从result开始的参数中。
此transform()将函数应用于参数的每个元素:
2.二进制操作:- 此方法对range[first1,last1]内元素执行以二进制数操作,该参数内的元素以迭代器first2开头,并将结果存储在从result开始的参数内。
一元操作(1)
template <class InputIterator, class OutputIterator, class UnaryOperation> OutputIterator transform (InputIterator first1, InputIterator last1, OutputIterator result, UnaryOperation op);
二进制运算(2)
template <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryOperation> OutputIterator transform (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result, BinaryOperation binary_op);
first1 :一个输入迭代器,它指向要操作的第一个参数的第一个元素的位置。
last1 :一个迭代器,将位置指向要操作的第一个参数的最后一个元素。
first2 :输入迭代器,该迭代器指向要操作的第二个参数中的第一个元素。
result:一个输出迭代器,该迭代器存储操作结果的参数的初始位置。
op :一元函数应用于参数的每个元素。
binary_op :两个元素作为参数传递的二进制函数。
transform()返回一个指向转换参数末端的迭代器。
让我们看一个简单的例子来演示transform()的用法:
#include <algorithm> #include <iostream> #include <vector> #include <string> #include <iterator> using namespace std; int main() { vector<int> v = { 3,1,4 }; vector<string> result; transform(v.begin(), v.end(), back_inserter(result), [](int x) { return to_string(x * 2); }); for_each(result.begin(), result.end(), [](const string& s) { cout << s << endl; }); }
输出:
6 2 8
让我们看另一个简单的例子:
#include <algorithm> #include <iostream> #include <vector> #include <string> #include <iterator> using namespace std; int main() { vector<char> v1 = { 'a','b','c' }; vector<int> v2 = { 3,1,4 }; vector<string> result; transform(v1.begin(), v1.end(), v2.begin(), back_inserter(result), [](char a, int b) { return string(b, a); }); for_each(result.begin(), result.end(), [](const string& s) { cout << s << endl; }); return 0; }
输出:
aaa b cccc
让我们看另一个简单的例子:
#include <iostream> #include <algorithm> #include <vector> #include <functional> #include <iterator> #include <iomanip> #include <cmath> using namespace std; typedef const vector <int>& vecref; int power(int a, int b) { return pow(a, b); } void print(vecref a, vecref b, vecref c) { cout << "b[i] a[i] c[i]" << endl; for(int i = 0; i < a.size(); i++) { cout << setw(2) << setfill(' ') << a[i] << " ^ " << setw(1) << setfill(' ') << b[i] << " = " << setw(2) << setfill(' ') << c[i] << endl; } } int main() { vector <int> a(10), b(10), c(10); for (int i = 0; i < 10 ;i++) { a[i] = (i % 2 + 1); b[i] = (i % 3 + 1); } //Save the result in vector c cout << "Transform operation" << endl; transform(b.begin(), b.end(), a.begin(), c.begin(), power); print(b, a, c); return 0; }
输出:
Transform operation b[i] a[i] c[i] 1 ^ 1 = 1 2 ^ 2 = 4 3 ^ 1 = 3 1 ^ 2 = 1 2 ^ 1 = 2 3 ^ 2 = 9 1 ^ 1 = 1 2 ^ 2 = 4 3 ^ 1 = 3 1 ^ 2 = 1
上面的示例说明了transform()算法。该程序创建两个向量,并通过从第一个向量引发到第二个向量中元素的幂的插入一个等于元素的值来变换第三个向量。函数功效作为断言传递给函数transform()。
让我们看另一个简单的例子:
#include <iostream> //cout #include <algorithm> //transform #include <vector> //vector #include <functional> //plus using namespace std; int op_increase (int i) { return ++i; } int main () { vector<int> foo; vector<int> bar; //set some values: for (int i=1; i<6; i++) foo.push_back (i*10); //foo: 10 20 30 40 50 bar.resize(foo.size()); //allocate space transform (foo.begin(), foo.end(), bar.begin(), op_increase); //bar: 11 21 31 41 51 //plus adds together its two arguments: transform (foo.begin(), foo.end(), bar.begin(), foo.begin(), plus<int>()); //foo: 21 41 61 81 101 cout << "foo contains:"; for (vector<int>::iterator it=foo.begin(); it!=foo.end(); ++it) cout << ' ' << *it; cout << '\n'; return 0; }
输出:
foo contains: 21 41 61 81 101
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)