zoukankan      html  css  js  c++  java
  • for_each用法

    for_each()是个function template
    
    #include <algorithm>头文件说明
    template<class _InIt,
        class _Fn1> inline
        void _For_each(_InIt _First, _InIt _Last, _Fn1& _Func)
        {    // perform function for each element
        for (; _First != _Last; ++_First)
            _Func(*_First);
        }
    
    由以上source可知,for_each()只能配合global function和function object。
    
    #include <iostream>
    #include <stdlib.h>
    #include "vector"
    #include "map"
    #include <algorithm>
    #include <atlstr.h>
    #include <xfunctional>
    using namespace std;
    
    //单一类对象
    class CClassObj
    {
    public:
        CClassObj(void){}
        ~CClassObj(void){}
        void PrintElem(){
            std::cout << "mem_fun_ref" << std::endl;
        }
    };
    class ClassController
    {
    protected:
        vector<CClassObj> _ObjVec;
    public:
        ClassController(void){}
        ~ClassController(void){}
        void AddClass(CClassObj cObj){
            _ObjVec.push_back(cObj);
        }
        void PrintElem(){
            for_each(_ObjVec.begin(), _ObjVec.end(), mem_fun_ref(&CClassObj::PrintElem));
        }
    };
    
    //多态
    class AbstactClass
    {
    public:
        virtual void PrintElem(){
            std::cout << "Abstact mem_fun 1" << std::endl;
        }
    };
    
    class MyClass1 : public AbstactClass{};
    class MyClass2 : public AbstactClass
    {
    public:
        void PrintElem(){
            std::cout << "Abstact mem_fun 2" << std::endl;
        }
    };
    
    class ClassCont
    {
    protected:
        vector<AbstactClass*> _ObjVec;
    
    public:
        void AddClass(AbstactClass& obj){
            _ObjVec.push_back(&obj);
        }
        void PrintElem(){
            for_each(_ObjVec.begin(), _ObjVec.end(), mem_fun(&AbstactClass::PrintElem));
        }
    };
    
    
    struct  Mystruct
    {
        int cnt;
        string str;
        Mystruct()
        {
            cnt = 0;
            str = "str";
        }
    };
    
    //函数调用对象 for_each()只能配合global function和function object。
    /*void Print(const Mystruct stru){ cout << stru.cnt << ", " << stru.str.c_str() << endl; }*/
    void Print(const Mystruct stru, const char* str){ cout << str << stru.cnt << ", " << stru.str.c_str() << endl; }
    
    struct PrintStru
    {
        string _str = "";
        PrintStru(string str) : _str(str){
        }
        void operator()(string &str){
            cout << _str.c_str() << str.c_str() << endl;
        }
    };
    int main()
    {
    /*    Add a(1, 2), b(3, 4);*/
    /*    std::cout << a << " + " << b << " = " << (a + b) << std::endl;*/
        vector<Mystruct> vecStru;
        Mystruct stru;
        vecStru.push_back(stru);
        vecStru.push_back(stru);
        /*for_each(vecStru.begin(), vecStru.end(), [](const Mystruct stru){cout << stru.cnt << ", " << stru.str.c_str() << endl; });//lambda可调用对象*/
    
        //Procedure Based與for_each()搭配
        /*for_each(vecStru.begin(), vecStru.end(), Print);//print: 不传入参数*/
        for_each(vecStru.begin(), vecStru.end(), bind2nd(ptr_fun(Print), "elem: "));//print:  传入参数
    
        //Object Oriented與for_each()搭配
        string Arr[] = { "123", "123456", "12345", "12", "1" };
        vector<string> vecStr(Arr, Arr + sizeof(Arr) / sizeof(string));
        for_each(vecStr.begin(), vecStr.end(), PrintStru(""));//print: 不传入参数
        //若使用function object,也可以將參數傳給PrintStru(),透過constructor的技巧接收參數。
        for_each(vecStr.begin(), vecStr.end(), PrintStru("Elem: "));//print: 不传入参数
    
        ClassController cConT;
        cConT.AddClass(CClassObj());
        cConT.AddClass(CClassObj());
        cConT.PrintElem();
    
        //多态
        ClassCont cT;
        cT.AddClass(MyClass1());
        cT.AddClass(MyClass2());
        cT.PrintElem();
    
    }

    借鉴:http://www.cnblogs.com/Purple_Xiapei/archive/2012/05/27/2520477.html

  • 相关阅读:
    poj 2100 尺取法 一个数字拆成连续数字平方和
    poj 1011 dfs+剪枝
    CF-242-C bfs+stl
    hdu 1297 递推
    poj 2104 划分树模板
    poj 3842 全排列+筛素数+暴力
    hdu 1421 经典dp
    hdu 1069 最长上升子序列变形
    hdu 3496 二维费用的01背包
    nyoj 16 最长上升子序列变形
  • 原文地址:https://www.cnblogs.com/zhangleibo/p/5225974.html
Copyright © 2011-2022 走看看