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()根据迭代器删除不需要的元素。

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

原文地址:https://www.cnblogs.com/LLBoy/p/15664912.html