前面一节我们学习了填充算法 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()函数

通过 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;
}

编译结果如下:

transform()函数二元谓词参数使用

通过输出可以看出,对于序列 {1, 2, 3, 4, 5} 和 {2, 3, 4, 5, 6},我们对两个序列的对应元素进行了相加操作,得到了结果序列 {3, 5, 7, 9, 11},输出完全符合我们的预期。

总结,如果我们想要对一个序列进行元素转换,我们可以使用 transform() 函数的一元操作形式;如果想要对两个序列的对应元素进行操作,我们可以使用 transform() 函数的二元操作形式;同时,在蓝桥杯、ACM等算法竞赛上,transform() 函数常应用于向量标准化和字符串处理(比如大小写转换)等。

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)