std::transform在指定的范围内应用于给定的操作,并将结果存储在指定的另一个范围内。要使用std::transform函数需要包含<algorithm>
头文件。
std::transform有两个重载方法,一个是对应于一元操作,一个是对应于二元操作。
std::transform 二元操作
std::transform(first1, last1, first2, result, func);
对于二元操作,使用[first1, last1)范围内的每个元素作为第一个参数调用func, 并以first2开头的范围内的每个元素作为第二个参数调用func, 每次调用返回的值都存储在以result开头的范围内。给定的func将被连续调用last1-first1次。func可以是函数指针或函数对象或lambda表达式。
std::transform 一元操作
std::transform(first1, last1, result, func);
对于一元操作,将func应用于[first1,last1)范围内的每个元素,并将每个操作返回的值存储在以result开头的范围内。给定的op将被连续调用last1-first1次。func可以是函数指针或函数对象或lambda表达式。
示例代码
/*
std::transform用法
*/
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int value_increase(int i){ return i + 5; }
/*
std::transform 二元操作
std::transform(first1, last1, first2, result, func);
对于二元操作,使用[first1, last1)范围内的每个元素作为第一个参数调用func,
并以first2开头的范围内的每个元素作为第二个参数调用func,
每次调用返回的值都存储在以result开头的范围内。
给定的func将被连续调用last1-first1次。func可以是函数指针或函数对象或lambda表达式。
*/
int main() {
vector<int> vec1{1, 4, 2, 3, 5};
vector<int> vec2{1, 2, 3, 4, 5};
// 将vec1和vec2的每个元素相加,并保存到vec2
std::transform(vec1.begin(), vec1.end(), vec2.begin(), vec2.begin(),
[](int v1, int v2) -> int { return v1 + v2; });
for (auto ele : vec2) {
cout << ele << " ";
}
cout << endl;
return 0;
}
/*
std::transform 一元操作
std::transform(first1, last1, result, func);
对于一元操作,将func应用于[first1,last1)范围内的每个元素,
并将每个操作返回的值存储在以result开头的范围内。
给定的op将被连续调用last1-first1次。func可以是函数指针或函数对象或lambda表达式。
*/
int main1() {
vector<int> vec1{1, 4, 2, 3, 5};
vector<int> vec2;
// 指定vec2的大小
vec2.resize(vec1.size());
// 将vec1的每个元素都增加5,存到vec2
std::transform(vec1.begin(), vec1.end(), vec2.begin(), value_increase);
for (auto ele : vec2) {
cout << ele << " ";
}
cout << endl;
vector<int> vec3;
// 指定vec2的大小
vec3.resize(vec1.size());
// 将vec1的每个元素都增加5,存到vec3
std::transform(vec1.begin(), vec1.end(), vec3.begin(),
[](int v) -> int { return v + 10; });
for (auto ele : vec3) {
cout << ele << " ";
}
cout << endl;
return 0;
}
当需要使用容器拷贝并且按照一定的特征操作数据时,可以使用std::transform。