• c++ for_each( )学习


    for_each()事实上是個 function template,其实质如下  [effective STL item 41]

    template<typename InputIterator, typename Function>
    Function for_each(InputIterator beg, InputIterator end, Function f) {
      while(beg != end) 
        f(*beg++);
    }
    能看懂吧!!!

    Object Oriented 与for_each 搭配

    1、不传入参数,使用function object

    #include<iostream>
    #include<vector>
    #include<algorithm>
    #include<typeinfo>
    using namespace std;
    
    struct Play
    {
        void operator () (int i)
        {
            cout<<i<<endl;
        }
    };
    
    int main()
    {
        int a[] = { 1, 3, 4, 5};
        vector<int> vc(a, a+sizeof(a)/sizeof(int));
        for_each(vc.begin(), vc.end(), Play());
    }
    #include<iostream>
    #include<vector>
    #include<algorithm>
    #include<typeinfo>
    using namespace std;
    
    struct Play
    {
        Play()
        {
            cout<<"new a Play"<<endl;
        }
        Play(const Play&)
        {
            cout<<"new a copy Play"<<endl;
        }
        void operator () (int i)
        {
            cout<<i<<endl;
        }
        ~Play()
        {
            cout<<"dispose a Play"<<endl;
        }
    };
    
    int main()
    {
        int a[] = { 1, 3, 4, 5};
        vector<int> vc(a, a+sizeof(a)/sizeof(int));
        for_each(vc.begin(), vc.end(), Play());
        cout<<"See something"<<endl;
    }
    结果如下:
    new a Play 




    new a copy Play 
    dispose a Play 
    dispose a Play 
    See something

    可以看到这个过程有两个Play对象生成,但是,用于输出元素的却是第一个对象(重载() 操作符),为什么? 
    这时候回去看for_each的源码,就会发现,它的返回值是function,以我的猜测,应该是这样的。

    Play() 生成一个临时的匿名的Play对象,传入for_each 函数里,然后执行完for_each 函数后,return一个function时,Play用复制构造函数生成一个Play对象,然后两个Play对象的生命周期都结束,于是依次销毁。

    2、传入参数

    可以通过构造函数的技巧传入参数

    #include<iostream>
    #include<vector>
    #include<algorithm>
    #include<typeinfo>
    using namespace std;
    
    struct Play
    {
        const char* str;
        Play(const char* s):str(s) {}
        void operator () (int i)
        {
            cout<<str<<i<<endl;
        }
    };
    
    int main()
    {
        int a[] = { 1, 3, 4, 5};
        vector<int> vc(a, a+sizeof(a)/sizeof(int));
        for_each(vc.begin(), vc.end(), Play("Element:"));  //其实 还是关键看  Play函数如何实现的!
    }

    结果:
    Element:1                                                                                                                                                                          
    Element:3                                                                                                                                                                          
    Element:4                                                                                                                                                                          
    Element:5                                                                                                                                                                          

    Member function 与 for_each 搭配

    1、不传入参数

    通过mem_fun_ref() 这个funtion adapater 将 member funtion 转成 function object。

    先到这里吧 下次 继续    !!!!

  • 相关阅读:
    PHP获取当前页面完整url地址,包括参数的函数
    研究在SAE上搭建最新wordpress
    CentOS6.5 编译安装lnmp环境
    cried me a river--kristinia debarge
    Bad Day -- Daniel Powter
    Back to December -- Taylor Swift
    英语单词的偏旁部首之常见前缀(一)
    21 Guns -- Green Day
    影子
    BNUOJ 1037 精神控制
  • 原文地址:https://www.cnblogs.com/zhangkele/p/9373063.html
Copyright © 2020-2023  润新知