C++之lambda

       C++比C灵活性之一便是C++函数的可重在性,即同个函数根据传递给函数参数类型和个数的区别实现不同的功能,这种区分是依靠编译器利用参数和函数名来确认用户需要的是哪个函数,所以函数的重载性不包括返回值的不同。


看下面两个例子:

1.sort(data.begin(),data.end());         根据字符串的大小排序
2.sort(data.begin(),data.end(),fun); 根据字符串长度排序
int fun(string s1,string s2)
{
return s1.size()>s2.size();
}

虽然函数名都是sort,但是传递给它们的形参却是不同的,所以一个是对字符串大小排序,对字符串长度排序。

第2个例子中,第三个形参是个函数,这个函数可以自定义,实现按照指定的顺序对字符串排序,即让返回值为真的形式排序。所以例中函数sort根据函数fun返回的结果为真来排序,长度大到小排序。


那么fun的形参可否自定义呢?

系统规定fun的形参称之为谓词,谓词个数是固定的,不能自定义个数。只有一个参数则是一元谓词,两个参数是二元谓词。

但是因为编程需要传递多于规定个数的参数,怎么办?

使用lambda可调用对象。

lambda格式

[捕获值列表](形参)->返回值类型{函数体}; 这里的返回值类型指定使用了尾置返回值形式。

这里的形参是遵循规定的谓词个数,如果需要更多的参数,可以在捕获值列表传递。捕获值列表以逗号隔开,捕获值列表可由全局变量,局部变量,调用函数的形参组成。如果lambda没有指定返回类型,那么它的返回类型依赖于函数体,如果函数体不包含任何语句除了return语句,那么返回类型根据return 表达式的类型推断。如果函数体包含其他语句,那么返回类型为void。

例:

int SortTest()
{
vector<string> data = {"qwe","123a","wqe","sdfsdf","qw","w","q","z"};
sort(data.begin(),data.end());
for (auto tmp : data)
{
cout << tmp.c_str()<< endl;
}
return 0;
}

结果:

C++之lambda

利用sort函数来对存储在vector中的字符串进行按字符大小排序。


对上例进行修改,依据字符串长度进行排序:

int fun(string s1, string s2)
{
return s1.size() > s2.size();
}


int SortTest()
{
vector<string> data = {"qwe","123a","wqe","sdfsdf","qw","w","q","z"};
sort(data.begin(), data.end(), fun);
for (auto tmp : data)
{
cout << tmp.c_str()<< endl;
}
return 0;
}

结果:

C++之lambda


使用lambda,只对长度超过3的进行排序

int SortTest()
{
vector<string> data = {"qwe","123a","wqe","sdfsdf","qw","w","q","z"};
int len = 3;
auto test = [len](string s1,string s2)->BOOL{
if ((s1.size() >= len) && (s2.size() >= len))
{
return s1.size() > s2.size();
}
return FALSE;
};
sort(data.begin(), data.end(), test);
for (auto tmp : data)
{
cout << tmp.c_str()<< endl;
}
return 0;
}

结果如图:

C++之lambda

;