zoukankan      html  css  js  c++  java
  • 函数对象

    数组
    enum eRelation                                  // 表示计算策略的枚举体
    {
        eLess,                                      // 小于
        eEqual,                                     // 等于
        eGreater                                    // 大于
    };
    template< typename T, typename ITER_TYPE>
    ITER_TYPE find_if_number( ITER_TYPE begin, ITER_TYPE end,
                      eRelation relType, const T &target )
                                                    // 用数值表示策略的find_if函数
    {
        for(ITER_TYPE iter = begin; iter!=end; iter++) // 遍历迭代器区间
        {
            switch( relType )                           // 根据不同的策略
            {
            case eLess:
                if( *iter < target )                    // 比较当前元素与目标
                {
                    return iter;                        // 返回迭代器
                }
            case eEqual:
              if( *iter == target )
                {
                    return iter;
                }
            case eGreater:
              if( *iter > target )
                {
                    return iter;
                }
            }
        }
        return end;                                     // 失败,则返回区间尾部
    }
    int main(int argc, char *argv[])                    // 主函数
    {
        int ary[5] = {1,2,3,4,5};                       // 数组
        vector vec(ary, ary+5);                    // 构造向量
        vector::iterator iter;                     // 定义迭代器
        iter = find_if_number( vec.begin(), vec.end(), eEqual, 3);  // 应用数值策略查找
        cout<< *iter <<endl;                            // 输出查找结果3
        return EXIT_SUCCESS;
     
     
    指针
     
     
    bool Equal(const int &ele, const int &target)       // 策略实现函数
    {
        return ele == target;
    }
    template< typename T, typename ITER_TYPE >          // 模板参数
    ITER_TYPE find_if_fun_ptr( ITER_TYPE begin, ITER_TYPE end,// 迭代器区间参数
            bool (*PFUN)(const T &, const T &),         // 表示算法策略的函数指针
            const T& target )                           // 查找目标
    {
        for(ITER_TYPE iter = begin; iter!=end; iter++) // 遍历迭代器区间
        {
          if(PFUN(*iter, target))                       // 应用算法策略(函数)
          {
                return iter;                            // 返回迭代器
            }
        }
        return end;                                     // 失败,则返回区间尾部
    }
    int main(int argc, char *argv[])// 主函数
    {
        int ary[5] = {1,2,3,4,5};                       // 定义数组
        vector vec(ary, ary+5);                    // 定义向量
        vector::iterator iter;                     // 定义迭代器
        iter = find_if_fun_ptr(vec.begin(), vec.end(), Equal, 3);
                                                        // 使用函数指针表达算法策略
        cout<< *iter <<endl;                            // 输出结果3
        system("PAUSE");
        return EXIT_SUCCESS;
    }
     
     函数对象
    template
    struct equal2 // 函数对象
    {
        bool operator()(const int &ele, const int &target)// 重载函数调用运算符
        {
            return ele == target;
        }
    };
    template< typename T, typename ITER_TYPE, typename Comp >
    ITER_TYPE find_if_fun_obj( ITER_TYPE begin, ITER_TYPE end,// 迭代器区间
            Comp funObj,                                   // 函数对象参数
            const T& target )                              // 目标
    {
        for(ITER_TYPE iter = begin; iter!=end; iter++)     // 遍历迭代器区间
        {
        if(funObj(*iter, target))                          // 应用算法策略
        {
              return iter;
            }
        }
        return end;
    }
    int main(int argc, char *argv[])                       // 主函数
    {
        int ary[5] = {1,2,3,4,5};                          // 定义数组
        vector vec(ary, ary+5);                       // 定义向量
        vector::iterator iter;                        // 定义迭代器
        iter = find_if_fun_obj(vec.begin(), vec.end(), equal2(), 3);
                                                           // 使用函数对象,查找目标
        cout<< *iter <<endl;                               // 输出结果3
        system("PAUSE");
        return EXIT_SUCCESS;
    }
     
  • 相关阅读:
    Golang Web入门(3):如何优雅的设计中间件
    Golang Web入门(2):如何实现一个高性能的路由
    基于MySQL 的 SQL 优化总结
    Redis系列(七)Redis面试题
    Redis系列(六)Redis 的缓存穿透、缓存击穿和缓存雪崩
    Redis系列(五)发布订阅模式、主从复制和哨兵模式
    Redis系列(四)Redis配置文件和持久化
    Redis系列(三)Redis的事务和Spring Boot整合
    Redis系列(二)Redis的8种数据类型
    Redis系列(一)Redis入门
  • 原文地址:https://www.cnblogs.com/tangjunjun/p/11676469.html
Copyright © 2011-2022 走看看