zoukankan      html  css  js  c++  java
  • cleanc++07_01 仿函数

    仿函数

    仿函数是一种只定义了括号运算(重载operate())的、使用形式类似函数的类的对象。根据operator()包含的参数个数,可以分为 生成器一元仿函数二元仿函数

    无参仿函数/生成器:

    class IncreasingNumberGenerator{
    public:
    	int operator()() noexcept {return number++;}
    private:
        int number{0};
    }
    

    用法示例——初始化一个自增数组:

    #include <algorithm>
    #include<vector>
    
    using Numbers = std::vector<int>;
    
    int main(){
        
        Numbers numbers(100,1);
        std::generate(std::begin(numbers),std::end(numbers),
                      IncreasingNumberGenerator());
        return 0;
        
    }
    

    一元仿函数:

    class ToSquare{
    public:
        constexpr int operator(const int value) const noexcept
        {
            return value*value;
        }
    }
    

    用法示例——1.初始化一个做平方运算的自增数组

    #include <algorithm>
    #include<vector>
    
    using Numbers = std::vector<int>;
    
    int main(){
        
        Numbers numbers(100,1);
        std::generate(std::begin(numbers),std::end(numbers),
                      IncreasingNumberGenerator());
        //std::transform,将给定的函数对象(第四个参数)应用于某一范围(前两个参数,并将结果放置在另一范围(第三个参数)。
        // transform中对函数对象的调用:   *_UDest =_Func(*_UFirst);
        // *_UDest 第三个参数 ,_Func 第四个参数,_UFirst第一个参数
        std::transform(std::begin(numbers),std::end(numbers),
                      std::begin(numbers),ToSquare());
        
        return 0;
        
    }
    

    用法示例——2.谓词

    当一元仿函数返回布尔值用于指示某些测试结果时,称这个一元仿函数为谓词。

    class IsAnOddNumber{
    public:
        constexpr bool operator()( const int value) const noexcept { return(value%2) != 0; }    
    }
    

    应用——Erase-remove法去除vector中的奇数:

    #include <algorithm>
    #include <vector>
    
    using Numbers = std::vector<int>;
    
    int main(){
        
        Numbers numbers(100,1)
        std::generate(std::begin(numbers),std::end(numbers),
                      IncreasingNumberGenerator());
        std::transform(std::begin(numbers),std::end(numbers),
                      std::begin(numbers),ToSquare());
        numbers.erase(
            std::remove_if(          std::begin(numbers),std::end(numbers),IsAnOddNumber()
                          ),
            std::end(numbers),
        );
        
        return 0;
    }
    

    std::remove_if将指定范围内,把要删除的元素移到容器末尾并返回要被删除元素的迭代器;

    std::vector::erase()根据迭代器删除不需要的元素。

    二元仿函数类似于一元仿函数,当对二元仿函数返回他两个参数的某些运算,称此仿函数为二元运算符,若返回布尔值用于测试,则称为二元谓词。

  • 相关阅读:
    大厂面试高频Redis,记不住的多操作几次吧
    自动化测试系列之jenkins配置搭建环境
    关于linux服务器的磁盘监控的相关知识
    前端常见一些安全问题及解决方案
    如何使用PM2部署前端项目
    vuex状态管理器本地持久化
    关于在Vue中Typescript的写法
    websocket快速重连机制
    如何使用selenium打开多个浏览器
    运维人员踩坑记录之netplan遇坑,配置临时IP巧妙解决
  • 原文地址:https://www.cnblogs.com/LLBoy/p/15664912.html
Copyright © 2011-2022 走看看