C++学习笔记6 函数对象

C++学习笔记6

对于一个运算符函数来说,它或者是类的成员,或者至少含有一个类类型的参数。

//错误: 不能为int重定义内置的运算符
int operator+(int, int);

1. lambda是函数对象

sort(words.begin(), words.end(), [](const string &a, const string &b){
    return a.size() < b.size();
});

class ShorterString{
public:
    bool perator()(const string &s1, const string &s2) const
    {
        return s1.size() < s2.size();
    }
};
//ShorterString定义了函数运算符(), 使得ShorterString可以想函数一样调用
//我们可以用这个类替代lambda表达式
sort(words.begin(), words.end(), ShorterString());


//表示lambda及相应捕获行为的类
class SizeComp{
private:
    size_t	sz;
public:
    SizeComp(size_t n): sz(n) { }	//该形参对应捕获的变量
    //该调用运算符的返回类型,形参和函数体都与lambda一致
    bool operator()(const string &s) const
    {
        return s.size() >= sz;
    }
};
find_if(words.begin(), words.end(), SizeComp(sz));

2. 可调用对象与function

// 普通函数
int add(int i, int j)	{	return i + j; }
//lambda	其产生一个未命名的函数对象类
auto mod = [](int i, int j)	{	return i % j; };
//函数对象类
struct divide{
	int operator()(int denominator, int divisor){
		return denominator / divisor;
	}
};
#include <functional>
function<int(int, int)> f1 = add;
function<int(int, int)> f2 = divide();
function<int(int, int)> f3 = [](int i, int j) { return i * j; };
cout<<f1(4, 2)<<endl;
cout<<f2(4, 2)<<endl;
cout<<f3(4, 2)<<endl;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值