C++标准库---transform()

transform

算法transform()提供以下两种能力:

1.第一形式有4个参数,把源区间的元素转换到目标区间。也就是说,复制和修改元素一气呵成;

2.第二形式有5个参数,将前两个源序列中的元素合并,并将结果写入目标区间。

注意:含有修改元素,仅仅只做复制元素,可以使用copy()。

第一种形式

transform(sourceBeg,sourceEnd,destBeg,op)

(1)针对源区间[sourceBeg,sourceEnd)中的每一个元素调用:op(elem) 并将结果写到以destBeg起始的目标区间内;

(2)返回目标区间内“最后一个被转换元素”的下一个位置,也就是第一个未被覆盖的元素位置;

(3)调用者必须确保目标区间有足够的空间,要不就得使用插入型迭代器;

(4)sourceBeg于destBeg可以相同,所以,和for_each()算法一样,你可以使用这个算法来变动某一序列内的元素;

(5)如果想以某值替换符合某一准则的元素,应使用replace()算法;

(6)复杂度:线性;


代码示例(第一种形式):

[cpp]  view plain  copy
  1. #include"fuzhu.h"  
  2.   
  3. using namespace std;  
  4.   
  5. int main()  
  6. {  
  7.     vector<int> coll1;  
  8.     list<int> coll2;  
  9.   
  10.     INSERT_ELEMENTS(coll1,1,9);  
  11.   
  12.     PRINT_ELEMENTS(coll1,"coll1: ");  
  13.   
  14.     transform(coll1.begin(),coll1.end(),coll1.begin(),negate<int>());  
  15.   
  16.     PRINT_ELEMENTS(coll1,"negated: ");  
  17.   
  18.     transform(coll1.begin(),coll1.end(),back_inserter(coll2),bind2nd(multiplies<int>(),10));  
  19.   
  20.     PRINT_ELEMENTS(coll2,"coll2: ");  
  21.   
  22.     transform(coll2.rbegin(),coll2.rend(),ostream_iterator<int>(cout," "),negate<int>());  
  23.     cout<<endl;  
  24.   
  25.     system("pause");  
  26.     return 0;  
  27. }  

运行结果:



第二种形式

transform(source1Beg,source1End,source2Beg,destBeg,op)

(1)针对第一源区间[source1Beg,source1End)以及“从source2Beg开始的第二源区间”的对应元素,调用:op(source1Elem,source2Elem) 并将结果写入以destBeg起始的目标区间内;

(2)返回区间内的“最后一个被转换元素”的下一位置,就是第一个未被覆盖的元素的位置;

(3)调用者必须保证第二源区间有足够空间(至少拥有和第一区间相同的空间大小);

(4)调用者必须确保目标区间有足够空间,要不就得使用插入型迭代器;

(5)source1Beg,source2Beg,destBeg可以相同。所以,可以让元素自己和自己结合,然后将结果覆盖至某个序列;

(6)复杂度:线性;


代码示例:

[cpp]  view plain  copy
  1. #include"fuzhu.h"  
  2.   
  3. using namespace std;  
  4.   
  5. int main()  
  6. {  
  7.     vector<int> coll1;  
  8.   
  9.     list<int> coll2;  
  10.   
  11.     INSERT_ELEMENTS(coll1,1,9);  
  12.   
  13.     PRINT_ELEMENTS(coll1,"coll1: ");  
  14.   
  15.     transform(coll1.begin(),coll1.end(),coll1.begin(),coll1.begin(),multiplies<int>());//1*1  2*2   
  16.   
  17.     PRINT_ELEMENTS(coll1,"squared: ");  
  18.   
  19.     transform(coll1.begin(),coll1.end(),coll1.rbegin(),back_inserter(coll2),plus<int>());//1+81  4+64   
  20.   
  21.     PRINT_ELEMENTS(coll2,"coll2: ");  
  22.   
  23.     cout<<"diff: ";  
  24.     transform(coll1.begin(),coll1.end(),coll2.begin(),ostream_iterator<int>(cout," "),minus<int>());//1-82  4-68  
  25.     cout<<endl;  
  26.   
  27.     system("pause");  
  28.     return 0;  
  29. }  

运行结果:

猜你喜欢

转载自blog.csdn.net/jisuanji198509/article/details/80723870