您当前的位置: 首页 >  算法

txwtech

暂无认证

  • 2浏览

    0关注

    813博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

cb38a_c++_STL_算法_transform

txwtech 发布时间:2020-02-23 16:15:53 ,浏览量:2

cb38a_c++_STL_算法_transformtransform()算法有两种形式:transform(b1,e1,b2,op);//b1(源区间)的数据通过op函数处理,存放在b2(目标区间)transform(b1,e1,b2,b3,op)//把b1,b2结合一起通过op函数处理,存放到b3

注意: 1.如果目标与源相同,transform()就和for_each()一样 2.如果想以某值替换符合规则的元素,应该使用replace()算法。

transform在指定的范围内应用于给定的操作,并将结果存储在指定的另一个范围内。transform函数包含在头文件中。

以下是std::transform的两个声明,

一元操作:

template

OutputIterator transform (InputIterator first1, InputIterator last1,OutputIterator result, UnaryOperation op);对于一元操作,将op应用于[first1, last1]范围内的每个元素,并将每个操作返回的值存储在以result开头的范围内。给定的op将被连续调用last1-first1+1次。

op可以是函数指针或函数对象或lambda表达式。

例如:op的一个实现 即将[first1, last1]范围内的每个元素加5,然后依次存储到result中。

int op_increase(int i) {return (i + 5)}; 调用std::transform的方式如下:

std::transform(first1, last1, result, op_increase); 二元操作:

template OutputIterator transform (InputIterator1 first1, InputIterator1 last1,InputIterator2 first2, OutputIterator result,BinaryOperation binary_op);

对于二元操作,使用[first1, last1]范围内的每个元素作为第一个参数调用binary_op,并以first2开头的范围内的每个元素作为第二个参数调用binary_op,每次调用返回的值都存储在以result开头的范围内。给定的binary_op将被连续调用last1-first1+1次。binary_op可以是函数指针或函数对象或lambda表达式。

例如:binary_op的一个实现即将first1和first2开头的范围内的每个元素相加,然后依次存储到result中。

int op_add(int, a, int b) {return (a + b)}; 调用std::transform的方式如下:

std::transform(first1, last1, first2, result, op_add);

#include //预定义函数对象 negate() 把一个数变成负数

1>d:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\algorithm(1443): template inline _OutIt transform(const _InIt _First, const _InIt _Last, _OutIt _Dest, _Fn _Func) { // transform [_First, _Last) with _Func _Adl_verify_range(_First, _Last); auto _UFirst = _Get_unwrapped(_First); const auto _ULast = _Get_unwrapped(_Last); auto _UDest = _Get_unwrapped_n(_Dest, _Idl_distance(_UFirst, _ULast)); for (; _UFirst != _ULast; ++_UFirst, (void)++_UDest) { *_UDest = _Func(*_UFirst); }

_Seek_wrapped(_Dest, _UDest); return (_Dest); }

使用预定义函数对象有2个参数是,需要使用预定义函数对象适配器,bind2nd bind2nd(multiplies(),10) //error C2065: “ostream_iterator”: 未声明的标识符,未包含#include

/*cb38a_c++_STL_算法_transform
transform()算法有两种形式:
transform(b1,e1,b2,op);//b1(源区间)的数据通过op函数处理,存放在b2(目标区间)
transform(b1,e1,b2,b3,op)//把b1,b2结合一起通过op函数处理,存放到b3

注意:
1.如果目标与源相同,transform()就和for_each()一样
2.如果想以某值替换符合规则的元素,应该使用replace()算法。


transform在指定的范围内应用于给定的操作,并将结果存储在指定的另一个范围内。transform函数包含在头文件中。

以下是std::transform的两个声明,

一元操作:

template 

OutputIterator transform (InputIterator first1, InputIterator last1,OutputIterator result, UnaryOperation op);
对于一元操作,将op应用于[first1, last1]范围内的每个元素,并将每个操作返回的值存储在以result开头的范围内。给定的op将被连续调用last1-first1+1次。

op可以是函数指针或函数对象或lambda表达式。

例如:op的一个实现 即将[first1, last1]范围内的每个元素加5,然后依次存储到result中。

int op_increase(int i) {return (i + 5)};
调用std::transform的方式如下:

std::transform(first1, last1, result, op_increase);
二元操作:

template 
OutputIterator transform (InputIterator1 first1, InputIterator1 last1,InputIterator2 first2, OutputIterator result,BinaryOperation binary_op);

对于二元操作,使用[first1, last1]范围内的每个元素作为第一个参数调用binary_op,并以first2开头的范围内的每个元素作为第二个参数调用binary_op,
每次调用返回的值都存储在以result开头的范围内。给定的binary_op将被连续调用last1-first1+1次。binary_op可以是函数指针或函数对象或lambda表达式。

例如:binary_op的一个实现即将first1和first2开头的范围内的每个元素相加,然后依次存储到result中。

int op_add(int, a, int b) {return (a + b)};
调用std::transform的方式如下:

std::transform(first1, last1, first2, result, op_add);

#include  //预定义函数对象
negate() 把一个数变成负数


1>d:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\algorithm(1443):
template inline
	_OutIt transform(const _InIt _First, const _InIt _Last, _OutIt _Dest, _Fn _Func)
	{	// transform [_First, _Last) with _Func
	_Adl_verify_range(_First, _Last);
	auto _UFirst = _Get_unwrapped(_First);
	const auto _ULast = _Get_unwrapped(_Last);
	auto _UDest = _Get_unwrapped_n(_Dest, _Idl_distance(_UFirst, _ULast));
	for (; _UFirst != _ULast; ++_UFirst, (void)++_UDest)
		{
		*_UDest = _Func(*_UFirst);
		}

	_Seek_wrapped(_Dest, _UDest);
	return (_Dest);
	}

	使用预定义函数对象有2个参数是,需要使用预定义函数对象适配器,bind2nd
	 bind2nd(multiplies(),10)
 //error C2065: “ostream_iterator”: 未声明的标识符,未包含#include

*/

#include 
#include 
#include 
#include 
#include  //预定义函数对象
#include 

using namespace std;

int main()
{
	vector ivec;
	list ilist;
	for (int i = 1; i             
关注
打赏
1665060526
查看更多评论
0.0412s