谓词与lambda表达式

来源:互联网 发布:阿里云vpn搭建openvpn 编辑:程序博客网 时间:2024/05/22 14:15

谓词

谓词是一个可调用的表达式,其返回结果是一个能用作条件的值,一般作为算法重载的参数使用。STL中所使用的谓词分为两类:
一元谓词:只接受一个函数;
二元谓词:可以接受两个参数。
接受谓词参数的算法对输入序列中的元素调用谓词。因此,元素类型必须能转换为谓词参数类型。
例如:
//比较函数,用来按长度排序单词bool isShorter(const string &s1,const string &s2){    return s1.size()<s2.size();}//按长度由短至长排序vector<string>:words  isShorter即被称为谓词sort(words.begin(),words.end(),isShorter);

根据算法接受一元谓词还是二元谓词,我们传递给算法的谓词必须严格按照接受一个或两个参数。但是,如果在一个算法使用中,需要更多的参数,超出了对谓词的限制。则可以考虑lambda表达式。

lambda

对于一个对象或一个表达式,如果可以对其使用调用运算符(即圆括号“()”),则称它为可调用的。一个lambda(音译为:兰布达)表达式表示一个可调用的代码单元。我们可以将其理解为一个未命名的内联函数。lambda表达式具有如下形式:
 [capture list] (parameter list) -> return type {function body}
capture list(捕获列表):一个lambda所在函数中定义的局部变量列表,只用于函数体内局部非static变量,lambda可以直接使用局部static变量和在它函数之外声明的名字;
parameter list(参数列表)、return type(返回类型)、function body(函数体)。我们可以忽略参数列表和返回类型,但必须永远包含捕获列表和函数体,示例如下:
#include<iostream>using namespace std;int main(){    auto f=[] {return 43;};    cout<<f()<<endl;    return 0;}
运行结果如下:


注:如果lambda的函数体包含任何单一return语句之外的内容,且未指定返回类型,则返回void。


参考书籍:《C++ Primer》 第五版  P344

0 1
原创粉丝点击