zoukankan      html  css  js  c++  java
  • STL经常使用遍历算法for_each和transform的比較

    for_each()和transform()算法比較
    1)STL 算法 – 改动性算法
     for_each()
     copy()
     copy_backward()
     transform()
     merge()
     swap_ranges()
     fill()
     fill_n()
     generate()
     generate_n()
     replace
     replace_if()
     replace_copy()
     replace_copy_if()
    2)
     for_each() 速度快 不灵活
     transform() 速度慢 很灵活


    普通情况下:for_each所使用的函数对象,參数是引用,没有返回值
    transform所使用的函数对象,參数一般不使用引用,而是还有返回值

    int showElem2(int n)
    {
    	cout << n << " ";
    	return n;
    }
    
    void main43_transform_pk_foreach()
    {
    	vector<int> v1;
    	v1.push_back(1);
    	v1.push_back(3);
    	v1.push_back(5);
    
    	vector<int> v2 = v1;
    
    	for_each(v1.begin(), v1.end(), showElem);
    
    
    	//transform 对 函数对象的要求
    	/*
    c:program filesmicrosoft visual studio 10.0vcincludealgorithm(1119): 
    	參见对正在编译的函数 模板 实例化
    		“_OutIt std::_Transform1<int*,_OutIt,
    		void(__cdecl *)(int &)>(_InIt,_InIt,_OutIt,_Fn1,
    		std::tr1::true_type)”的引用
    1>          with
    1>          [
    1>              _OutIt=std::_Vector_iterator<std::_Vector_val<int,std::allocator<int>>>,
    1>              _InIt=int *,
    1>              _Fn1=void (__cdecl *)(int &)
    1>          ]
    	*/
    
    	/*
    	template<class _InIt,
    	class _OutIt,
    	class _Fn1> inline
    		_OutIt _Transform(_InIt _First, _InIt _Last,
    		_OutIt _Dest, _Fn1 _Func)
    	{	// transform [_First, _Last) with _Func
    		for (; _First != _Last; ++_First, ++_Dest)
    			*_Dest = _Func(*_First);  //解释了 为什么 要有返回值
    		return (_Dest);
    	}
    	*/
    	transform(v2.begin(), v2.end(), v2.begin(), showElem2);
    }



    demo 完整的演示了for_each和transform算法的使用方法。以及

    #include <iostream>
    #include <cstdio>
    #include <vector>
    #include <list>
    #include <algorithm>
    #include <functional>
    #include <iterator>
    
    using namespace std;
    
    class CMyShow
    {
    public:
    	CMyShow()
    	{
    		num = 0;
    	}
    	void operator()(int &n)
    	{
    		num++;
    		cout << n << " ";
    	}
    	void printNum()
    	{
    		cout << "num:" << num << endl;
    	}
    protected:
    private:
    	int num;
    };
    
    void printV(vector<int> &v)
    {
    	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
    	{
    		cout << *it << " ";
    	}
    	cout << endl;
    }
    
    void printList(list<int> &v)
    {
    	for (list<int>::iterator it = v.begin(); it != v.end(); it++)
    	{
    		cout << *it << " ";
    	}
    	cout << endl;
    }
    
    void showElem(int &n)
    {
    	cout << n << " ";
    }
    
    // for_each函数使用方法
    void play_for_each()
    {
    	vector<int> v1;
    	v1.push_back(1);
    	v1.push_back(3);
    	v1.push_back(5);
    
    	printV(v1);
    	cout << endl;
    
    	/*
    	template<class _InIt,
    	class _Fn1> inline
    	_Fn1 for_each(_InIt _First, _InIt _Last, _Fn1 _Func)
    	{	// perform function for each element
    	_DEBUG_RANGE(_First, _Last);
    	_DEBUG_POINTER(_Func);
    	return (_For_each(_Unchecked(_First), _Unchecked(_Last), _Func));
    	} */
    
    	//函数对象 回调函数入口地址
    	for_each(v1.begin(), v1.end(), showElem);
    	cout << endl;
    
    	for_each(v1.begin(), v1.end(), CMyShow());
    	cout << endl;
    
    	CMyShow mya;
    	CMyShow my1 = for_each(v1.begin(), v1.end(), mya); //给my1初始化
    	mya.printNum();  //ma1和my1 是两个不同的对象
    	my1.printNum();
    
    	my1 = for_each(v1.begin(), v1.end(), mya);  //给my1赋值
    	my1.printNum();
    }
    
    int  increase(int i)
    {
    	return i + 100;
    }
    
    // transform函数使用方法
    void play_transform()
    {
    	vector<int> v1;
    	v1.push_back(1);
    	v1.push_back(3);
    	v1.push_back(5);
    
    	printV(v1);
    	cout << endl;
    
    	//transform 使用回调函数
    	transform(v1.begin(), v1.end(), v1.begin(), increase);
    	printV(v1);
    	cout << endl;
    
    	//transform 使用 提前定义的函数对象
    	transform(v1.begin(), v1.end(), v1.begin(), negate<int>());
    	printV(v1);
    	cout << endl;
    
    	//transform 使用 函数适配器 和函数对象
    	list<int> mylist;
    	mylist.resize(v1.size());
    
    	transform(v1.begin(), v1.end(), mylist.begin(), bind2nd(multiplies<int>(), 10));
    	printList(mylist);
    	cout << endl;
    
    	//transform 也能够把运算结果 直接输出到屏幕
    	transform(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "), negate<int>());
    	cout << endl;
    }
    
    //普通情况下:for_each所使用的函数对象,參数是引用。没有返回值
    //transform所使用的函数对象,參数一般不使用引用,而是还有返回值
    
    int showElem2(int n)
    {
    	cout << n << " ";
    	return n;
    }
    
    void play_transform_pk_foreach()
    {
    	vector<int> v1;
    	v1.push_back(1);
    	v1.push_back(3);
    	v1.push_back(5);
    
    	vector<int> v2 = v1;
    
    	for_each(v1.begin(), v1.end(), showElem);
    
    
    	//transform 对 函数对象的要求
    	/*
    	c:program filesmicrosoft visual studio 10.0vcincludealgorithm(1119):
    	參见对正在编译的函数 模板 实例化
    	“_OutIt std::_Transform1<int*,_OutIt,
    	void(__cdecl *)(int &)>(_InIt,_InIt,_OutIt,_Fn1,
    	std::tr1::true_type)”的引用
    	1>          with
    	1>          [
    	1>              _OutIt=std::_Vector_iterator<std::_Vector_val<int,std::allocator<int>>>,
    	1>              _InIt=int *,
    	1>              _Fn1=void (__cdecl *)(int &)
    	1>          ]
    	*/
    
    	/*
    	template<class _InIt,
    	class _OutIt,
    	class _Fn1> inline
    	_OutIt _Transform(_InIt _First, _InIt _Last,
    	_OutIt _Dest, _Fn1 _Func)
    	{	// transform [_First, _Last) with _Func
    	for (; _First != _Last; ++_First, ++_Dest)
    	*_Dest = _Func(*_First);  //解释了 为什么 要有返回值
    	return (_Dest);
    	}
    	*/
    	transform(v2.begin(), v2.end(), v2.begin(), showElem2);
    }
    
    int main()
    {
    	play_for_each();
    	play_transform();
    	play_transform_pk_foreach();
    
    	return 0;
    }

  • 相关阅读:
    linux centos 7.5 开启 postgresql 远程访问
    linux centos 7 开启 ftp
    CentOS 7.5 改IP后不生效无法上网解决办法
    Windows Server 2008R2 及上系统安装 Windows 可选功能
    C#只允许运行一个实例
    C# 命令行参数分割
    C# 获取所有已登录系统的用户名
    C#获取进程用户名
    psexec 用法
    检测 Visual C++ Redistributable Package 相应版本是否已安装
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7288870.html
Copyright © 2011-2022 走看看