STL-transform算法

xiaoxiao2021-02-28  9

transform算法的作用是 将一个容器中的值搬运到另一个容器中。提供了两个重载版本,我们先看下transform的源代码实现:

重载版本一:

template<class_InIt, class _OutIt, class _Fn1> inline _OutIt_Transform(_InIt _First, _InIt _Last,_OutIt _Dest, _Fn1 _Func) { for(; _First != _Last; ++_First, ++_Dest) *_Dest= _Func(*_First); return(_Dest); }

从参数可看出InIt表示这个算法接收的迭代器类型为输入迭代器类型。参数需要需要容器开始迭代器_First,结束迭代器_OutIt,标识被拷贝容器元素区间,将这个区间中的元素拷贝到_Dest迭代器中所表示的容器中。这里要注意,目标容器中一定要有足够的空间。最后一个参数是一个函数对象或者普通函数,接收容器中的元素作为参数,我们可在此函数中对原容器中元素进行运算,将运算结果插入到目标容器中。

我们举个例子:

struct transformTest01{ int operator()(int val){ return val + 100; } }; struct print01{ void operator()(int val){ cout << val << " "; } }; void test01(){ vector<int> vSource; for (int i = 0; i < 10;i ++){ vSource.push_back(i + 1); } //目标容器 vector<int> vTarget; //给vTarget开辟空间 vTarget.resize(vSource.size()); //将vSource中的元素搬运到vTarget vector<int>::iterator it = transform(vSource.begin(), vSource.end(), vTarget.begin(), transformTest01()); //打印 for_each(vTarget.begin(), vTarget.end(), print01()); cout << endl; }

重载版本二:

template<class_InIt1,class _InIt2,class _OutIt,class _Fn2> inline _OutIt_Transform(_InIt1 _First1, _InIt1 _Last1,_InIt2 _First2, _OutIt _Dest, _Fn2_Func) { for(; _First1 != _Last1; ++_First1, ++_First2, ++_Dest) *_Dest= _Func(*_First1, *_First2); return(_Dest); } 这个版本的transform算法可将两个容器中的元素经过Func运算存储到目标容器中。

//将容器1和容器2中的元素相加放入到第三个容器中 struct transformTest02{ int operator()(int v1,int v2){ return v1 + v2; } }; void test02(){ vector<int> vSource1; vector<int> vSource2; for (int i = 0; i < 10; i++){ vSource1.push_back(i + 1); } //目标容器 vector<int> vTarget; //给vTarget开辟空间 vTarget.resize(vSource1.size()); transform(vSource1.begin(), vSource1.end(), vSource2.begin(),vTarget.begin(), transformTest02()); //打印 for_each(vTarget.begin(), vTarget.end(), print01()); cout << endl; }

转载请注明原文地址: https://www.6miu.com/read-1100134.html

最新回复(0)