lambda表达式 mutable 仿函数

仿函数

template<class _Arg1,class _Arg2,class _Result>
struct my_binary_function
{
	typedef _Arg1 first_argument_type;
	typedef _Arg2 second_argument_type;
	typedef _Result result_type;
}
template <class _Tp>
struct my_plus : public my_binary_function<_Tp,_Tp,_Tp>
{
	_Tp operator()(const _Tp& _x,const _Tp& _y) const
	{
		return _x+_y;
	}
};
int main()
{
	int x=my_plus<int>()(12,23);//先是创建一个无名对象,然后传了俩个参数
}
lambda表达式

在这里插入图片描述

很像仿函数

类似于函数里面的函数

里面的变量不能改变,都是加了const的,加了mutable的变量,后面即使加了const也是可以改变的

里面的变量是重新拷贝出来的和外面的变量不一样

全局变量不需要捕获

[] 不捕获变量

[=]全部捕获按照值捕获

[&]以引用的方式捕获,他的变量是可以改变的,因为以你引用的底层就是指针

[=,&a]a是引用捕获,
[this]

uto x0=[]()->int {return g_max;}

函数中this指针可以捕获,但是不可以捕获this指针所指之物

this指针不可变,但是this指针所指之物可以变

int main()
{
	auto f=[](int a,int b)->int {return a+b;};
	int x=f(12,23);
	cout<<x<<endl;
}
int fun()
{
	Object objx(10);
	auto f1=[&]()->void
	{
		objx.Value()=100;
	};
	auto f2=[=]()->int
	{
		int a=objx.Value();//objx是重新构造的
		return a;
	};
	int x=f2;

mutable

class Object
{
	int value;
	mutable int num;//有了这个关键字,即使fun方法加了const,num也是可以修改
public:
	Object(int x=0,int y=0)value{x},num{y}{}
	int fun()const
	{
		int a=10;
		a+=10;
		this->num+=10;
		return num;
	}
};
template<class _BI _first,_BI last,_Fn _func)
{
	cout << typeid(_Fn).name()<<endl;
	for(;_first!=_last;++_first)
	{
		_func(*_first);
	}
}
void Print_Ar(int x)
{
	printf("%d",x);
}
struct Print
{
	void operator()(int x)const
	{
		printf("%d ",x);
	}
};
int main()
{
	std::vector<int> ar={12,23,34,45,56,67,78};
	my_for_each(ar.begin(),ar.end(),Print_Ar);//函数指针
	cout<<endl;
	my_for_each(ar.begin(),ar,end(),Print());//仿函数,函数对象
	cout<<endl;
	my_for_each(ar.begin(),ar.end(),[](int a)->void{printf("%d ",a);});//lambda表达式
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值