C++ STL Lambda

Lambda的语法

所谓的Lambda是一份功能定义式,可被定义于语句或表达式内部。因此你可以拿Lambda当做inline函数使用。

最小型的Lambda函数没有参数,什么也不做,如下例子:

[]{std::cout << "hello Lambda" << std::endl;}

可以直接调用它:

[]{std::cout << "hello Lambda" << std::endl;}();

或者把它传递给对象,使之能被调用:

auto l = []{std::cout << "hello Lambda" << std::endl;};
l();
如你所见,lambda总是由一个所谓lambda introducer引入;那是一组方括号,你可以在其内指明一个所谓的capture,用来在lambda内部访问非静态外部对象,如果无序访问外部数据,方括号可以为空。
Lambda可以拥有参数,指明于小括号内,就像任何函数一样:
auto l = [](const std::string & s){std::cout << s << std::endl;};
l("hello lambda");
lambda也可以返回某物,但你不需要指明返回类型,返回类型会根据返回值被推导出来,如:
[]{return 42;}
如果一定想指明一个返回类型,可以使用新式C++语法,如:
[]()->double{return 42;}
这样一来就必须指明返回类型

Capture(用以访问外部作用域)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Lambda的类型

在这里插入图片描述
在这里插入图片描述

Lambda vs Binder

int main()
{
	auto plus10 = [](int i) {return i + 10; };
	cout << "+10:	" << plus10(7) << endl;
	auto plus10times2 = [](int i) {return (i + 10) * 2; };
	cout << "+10 *2: " << plus10times2(7) << endl;
	auto pow3 = [](int i) {return i * i*i; };
	cout << "x*x*x: " << pow3(7) << endl;
	auto inversDivide = [](double d1, double d2) {return d2 / d1; };
	cout << "invdiv: " << inversDivide(49, 7) << endl;
}

Lambda调用全局函数和成员函数

char myToupper(char c)
{
	locale loc;
	return use_facet<ctype<char>>(loc).toupper(c);
}
int main()
{
	string s("Internationalization");
	string sub("Nation");
	string::iterator pos;
	pos = search(s.begin(), s.end(), sub.begin(), sub.end(), [](char c1, char c2) {return myToupper(c1) == myToupper(c2); });
	if (pos != s.end())
	{
		cout << "\"" << sub << "\" is part of \"" << s << "\"" << endl;
	}
}

在这里插入图片描述

class Person
{
private:
	string name;
public:
	Person(const string& n) :name(n) {}
	void print()const
	{
		cout << name << endl;
	}
	void print2(const string& prefix)const
	{
		cout << prefix << name << endl;
	}
};
int main()
{

	vector<Person>coll{ Person("Tick"), Person("Trick"),Person{"Track"} };
	for_each(coll.begin(), coll.end(), [](const Person & p) {p.print(); });
	cout << endl;
	for_each(coll.begin(), coll.end(), [](const Person & p) {p.print2("Person: "); });
	cout << endl;

	bind(&Person::print2, _1, "This is: ")(Person("nico"));

}

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值