transform函数的作用是:将某操作应用于指定范围的每个元素。transform函数有两个重载版本:
transform(first,last,result,op);//first是容器的首迭代器,last为容器的末迭代器,result为存放结果的容器,op为要进行操作的一元函数对象或sturct、class。

transform(first1,last1,first2,result,binary_op);//first1是第一个容器的首迭代器,last1为第一个容器的末迭代器,first2为第二个容器的首迭代器,result为存放结果的容器,binary_op为要进行操作的二元函数对象或sturct、class。

注意:第二个重载版本必须要保证两个容器的元素个数相等才行,否则会抛出异常。

看一个例子:利用transform函数将一个给定的字符串中的小写字母改写成大写字母,并将结果保存在一个叫second的数组里,原字符串内容不变。
我们只需要使用transform的第一个重载函数,当然我们也可以使用for_each函数来完成再copy几次就行了,现在来看一下代码:
#include <iostream>
#include <algorithm>
using namespace std;
char op(char ch)
{
      if(ch>='A'&&ch<='Z')
            return ch+32;
      else
            return ch;
}
int main()
{
      string first,second;
      cin>>first;
      second.resize(first.size());
      transform(first.begin(),first.end(),second.begin(),op);
      cout<<second<<endl;
      return 0;
}

再看一个例子:给你两个vector向量(元素个数相等),请你利用transform函数将两个vector的每个元素相乘,并输出相乘的结果。
代码:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
void print(int &elem){cout<<elem<<" ";}
int op(int a,int b){return a*b;}
int main()
{
      vector <int> A,B,SUM;
      int n;
      cin>>n;
      for(int i=0;i<n;i++)
      {
            int t;
            cin>>t;
            A.push_back(t);
      }
      for(int i=0;i<n;i++)
      {
            int t;
            cin>>t;
            B.push_back(t);
      }
      SUM.resize(n);
      transform(A.begin(),A.end(),B.begin(),SUM.begin(),op);
      for_each(SUM.begin(),SUM.end(),print);
      return 0;
}
输入:
5
1 2 3 4 5
5 4 3 2 1
输出:
5 8 9 8 5

再看一个网上的例子:
#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>
using namespace std;
class Print
{
public:
      void operator () (int val)
      {
            cout << val << " " ;
      }
} ;
int main()
{
      int arr1[] = {1, 2, 3, 4, 5, 6, 7, 8, 9} ;
      vector<int> vec1(arr1, arr1 + sizeof arr1 / sizeof (int)) ;
      vector<int> vec2(9, 0) ;
      //      transform(beg, end, dest, unaryOp) ;
      //      操作前:[beg,end)标示输入序列.dest是目标迭代器.unaryOp是一元函数对象.
      //      操作后:对[beg,end)中每个元素应用unaryOp操作并将结果复制到dest迭代器所在的容器中.
      //      返回值:返回目标容器中被写入的最后一个位置的下一个迭代器.
      //      备注:            [dest,...)必须能够存储[beg,end)中的全部元素.否则将抛出异常.
      transform(vec1.begin(), vec1.end(), vec2.begin(), bind2nd(plus<int> (), 1000)) ;
      for_each(vec2.begin(), vec2.end(), Print()) ;
      //      transform(beg, end, beg2, dest, binaryOp) ;
      //      操作前:[beg,end)标示输入序列.[beg2,...)标示输入序列.dest是目标迭代器..binaryOp是二元函数对象.
      //      操作后:[beg,end)序列中的元素依次作为二元操作的第一个实参.
      //                              [beg2,...)序列中的元素依次作为二元操作的第二个实参.
      //                              将运算结果依次复制到dest迭代器所在的容器中.
      //      返回值:返回目标容器中被写入的最后一个元素的下一个位置的迭代器.
      //      备注:            [beg2,...)必须能够存储[beg,end)中的全部元素.
      //                              [dest,...)必须能够存储[beg,end)中的全部元素.
      //                              否则将抛出异常
      vector<int> vec3(18, 1) ;
      transform(vec1.begin(), vec1.end(), vec2.begin(), vec3.begin(), multiplies<int> ()) ;
      for_each(vec3.begin(), vec3.end(), Print()) ;
      return 0 ;
}
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐