C++ transform()
C++ 算法transform()
C++ 算法 transform()函数以两种不同的方式使用:
1.一元运算:-该方法对范围[first1,last1]中的元素执行一元运算 op 并将结果存储在从 result 开始的范围中。
此transform()将函数应用于范围的每个元素:
2、二值运算:-该方法对范围为[first1,last1]的元素以及其中的元素执行二元运算 binary_op 。以迭代器 first2 开头的范围,并将结果存储在以结果开头的范围内。
此transform()接受两个2范围,并应用一个2个参数,分别位于输入范围内的每对元素上:
语法
一元运算(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()返回一个指向转换范围末端的迭代器。
复杂度
在first1和last1之间的距离中,线性是线性的。
数据竞争
[f]范围内的对象irst1,last1)被访问,其中每个对象仅被访问一次。
范围从结果开始的对象被修改。
异常安全性
如果任何函数调用赋值或迭代器上的操作引发异常,则会引发异常。
请注意,无效参数会导致未定义的行为。
示例1
让我们看一个简单的示例来演示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; });
}
输出:
示例2
让我们看另一个简单的示例:
#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;
}
输出:
示例3
让我们看另一个简单的示例:
#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()算法。该程序创建两个 Vector ,并通过从第一个 Vector 引发到第二个 Vector 中元素的幂的插入一个等于元素的值来变换第三个 Vector 。函数幂作为谓词传递给函数transform()。
示例4
让我们看另一个简单的示例:
#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