仿函数
仿函数是一种只定义了括号运算(重载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()
根据迭代器删除不需要的元素。
二元仿函数类似于一元仿函数,当对二元仿函数返回他两个参数的某些运算,称此仿函数为二元运算符,若返回布尔值用于测试,则称为二元谓词。