前面一节我们学习了填充算法 generate() 函数和 generate_n() 函数,读者是否还记得它们的功能分别是什么吗?没错,generate() 函数能通过生成器为序列中的每个元素赋值,generate_n() 函数能够从指定位置开始为指定个数的元素重新赋值。本节我们将学习一个转换算法——transform() 函数,"transform" 意为"转换",顾名思义,transform() 函数能够对序列中的元素进行转换操作,并将结果存储到目标位置。
transform() 函数的语法格式如下:
template< class InputIt, class OutputIt, class UnaryOperation > OutputIt transform( InputIt first1, InputIt last1, OutputIt ret, UnaryOperation pred ); template< class InputIt1, class InputIt2, class OutputIt, class BinaryOperation > OutputIt transform( InputIt1 first1, InputIt1 last1, InputIt2 first2, OutputIt ret, BinaryOperation pred );
transform(first1, last1, ret, pred) 函数的功能是对区间 [first1, last1) 中的每个元素应用一元操作,并将结果存储到以 ret 开始的目标序列中。transform(first1, last1, first2, ret, pred) 函数的功能是对两个序列中对应位置的元素应用二元操作,并将结果存储到目标序列中。
下面我们通过代码的方式实操一下 transform() 函数。
#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator>
#include<string>
#include<cmath>
using namespace std;
/*transform()函数*/
void test() {
vector<int> v1{1, 2, 3, 4, 5};
vector<int> v2;
cout << "转换前v1:";
for_each(v1.begin(), v1.end(), [](const int& n){
cout << n << " ";
});
cout << '\n';
/*对v1容器内的所有元素求平方并存储到v2*/
transform(v1.begin(), v1.end(), back_inserter(v2), [](int x){
return x * x;
});
cout << "平方转换后v2:";
for_each(v2.begin(), v2.end(), [](const int& n){
cout << n << " ";
});
cout << '\n';
}
int main(){
system("title dotcpp.com");
test();
return 0;
}编译结果如下:

通过 transform(first1, last1, ret, pred) 函数我们成功将序列 {1, 2, 3, 4, 5} 转换为平方序列 {1, 4, 9, 16, 25},实现了对每个元素的数学变换,输出完全符合我们的预期。
当然,我们并不止步于此,如果我们想要对两个序列的对应元素进行操作,我们就可以使用 transform() 函数的二元操作重载形式。
transform() 函数二元操作语法格式如下:
template< class InputIt1, class InputIt2, class OutputIt, class BinaryOperation > OutputIt transform( InputIt1 first1, InputIt1 last1, InputIt2 first2, OutputIt ret, BinaryOperation pred );
transform(first1, last1, first2, ret, pred) 函数表示对第一个序列 [first1, last1) 和第二个序列从 first2 开始的对应元素应用二元操作,将结果存储到目标序列。
下面我们通过代码的方式来实操 transform() 函数的二元操作:
#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator>
#include<string>
using namespace std;
/*transform()函数二元操作*/
void test() {
vector<int> v1{1, 2, 3, 4, 5};
vector<int> v2{2, 3, 4, 5, 6};
vector<int> result;
cout << "序列v1:";
for_each(v1.begin(), v1.end(), [](const int& n){
cout << n << " ";
});
cout << '\n';
cout << "序列v2:";
for_each(v2.begin(), v2.end(), [](const int& n){
cout << n << " ";
});
cout << '\n';
/*对v1和v2容器的对应元素相加*/
transform(v1.begin(), v1.end(), v2.begin(), back_inserter(result),
[](int a, int b) {
return a + b;
});
cout << "两序列相加结果:";
for_each(result.begin(), result.end(), [](const int& n){
cout << n << " ";
});
cout << '\n';
}
int main(){
system("title dotcpp.com");
test();
return 0;
}编译结果如下:

通过输出可以看出,对于序列 {1, 2, 3, 4, 5} 和 {2, 3, 4, 5, 6},我们对两个序列的对应元素进行了相加操作,得到了结果序列 {3, 5, 7, 9, 11},输出完全符合我们的预期。
总结,如果我们想要对一个序列进行元素转换,我们可以使用 transform() 函数的一元操作形式;如果想要对两个序列的对应元素进行操作,我们可以使用 transform() 函数的二元操作形式;同时,在蓝桥杯、ACM等算法竞赛上,transform() 函数常应用于向量标准化和字符串处理(比如大小写转换)等。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程