茶叶公司网站建设策划书,seo关键字排名优化,qt开发安卓app,龙岗外贸网站制作目录
一#xff0c;模板函数sort
二#xff0c;lambda表达式 一#xff0c;模板函数sort 在C98中#xff0c;如对一个数据集合中的元素进行排序#xff0c;可使用模板函数sort#xff0c;如元素为自定义类型#xff0c;需定义排序时的比较规则#xff1b;随着C的发展…目录
一模板函数sort
二lambda表达式 一模板函数sort 在C98中如对一个数据集合中的元素进行排序可使用模板函数sort如元素为自定义类型需定义排序时的比较规则随着C的发展人们开始觉的上面的写法太复杂了为了实现一个算法algorithm都要重新写一个类如每次比较的逻辑不一样还要去实现多个类特别是相同类的命名都会非常不方便 //模板函数sort元素为内置类型
int arr[] { 4,1,5,3,8,7 };
std::sort(arr, arr sizeof(arr) / sizeof(arr[0]));
std::sort(arr, arr sizeof(arr) / sizeof(arr[0]), greaterint());
//模板函数sort元素为自定义类型
struct Goods
{string _name;double _price;
};
struct Compare
{bool operator()(const Goods gl, const Goods gr){ return gl._price gr._price; }
};
int main()
{Goods gds[] { { 苹果, 2.1 }, { 相交, 3 }, { 橙子, 2.2 }, {菠萝, 1.5} };sort(gds, gds sizeof(gds) / sizeof(gds[0]), Compare());return 0;
} 二lambda表达式 C11引入了lambda表达式又称匿名函数在传递给函数参数的位置快捷定义匿名函数对象其实际是一个仿函数编译器会生成一个匿名类此类重载了()运算符
//lambda表达式实际是一个匿名函数
Goods gds[] { { 苹果, 2.1 }, { 相交, 3 }, { 橙子, 2.2 }, {菠萝, 1.5} };
sort(gds, gds sizeof(gds) / sizeof(gds[0]),
[](const Goods l, const Goods r)-bool{return l._price r._price;});语法[capture-list] (parameters) mutable - return-type { statement } [capture-list]捕捉列表 该列表总是在lambda函数的开始位置编译器根据其来判断接下来的代码是否为lambda函数捕捉列表能够捕捉上下文中的变量来供lambda函数使用(parameters)参数列表 与普通函数的参数列表一致如不需要参数传递可连同()一起省略mutable取消其常量性 默认情况下lambda总是一个const函数mutable可取消其常量性使用该修饰符时参数列表不可省略(即使参数为空)- return-type返回值类型 用追踪返回类型形式声明函数的返回值类型没有返回值时此部分可省略返回值类型明确情况下也可省略由编译器对返回类型进行推导{ statement }函数体 该函数体内除了可以使用参数外还可以使用所有捕获到的变量 注在lambda函数定义中参数列表和返回值类型都是可选部分而捕捉列表和函数体可以为空因此C11中最简单的lambda函数为[]{}该函数不能做任何事 lambda表达式实际上可以理解为无名函数该函数无法直接调用如想直接调用可借助auto将其赋值给一个变量
[] {};
int a 3, b 4, x 10;
[] {return a 3; };
[](int c) {b a c; };
auto fun1 [, b](int c)-int {return b a c; };
fun1(10);
auto fun2 [x](int a) mutable { x * 2; return a x; };
fun2(10); [capture-list] 捕捉列表 捕捉列表描述了上下文中那些数据可被lambda使用及使用的方式(传值、传引用)
[var]表示值传递方式捕捉变量var[]表示值传递方式捕捉所有父作用域的变量(包括this)[var]表示引用传递捕捉变量var[]表示引用传递捕捉所有父作用域中的变量(包括this)[this]表示值传递方式捕捉当前的this指针
注
父作用域指包含lambda函数的语句块语法上捕捉列表可由多个捕捉项组成以逗号隔开捕捉列表不允许变量重复传递否则编译报错在块作用域意外的lambda函数捕捉列表必须为空在块作用域中的lambda函数仅能捕捉父作用域中局部变量捕捉任何非此作用域或非局部变量都会编译报错lambda表达式之间不能相互赋值即使看起来类型相同 函数对象与lambda表达式 函数对象又称仿函数即可以像函数一样使用的类对象就是在类中重载了operator()运算符的类对象实际上底层编译器对于lambda表达式的处理方式完全是按照函数对象的方式处理的即如定义了一个lambda表达式编译器会自动生成一个类该类中重载了operator()
class Rate
{
public:Rate(double rate):_rate(rate){}double operator()(double money, int year){ return money * _rate * year; }
private:double _rate;
};int main()
{//函数对象double rate 0.49;Rate r1 (rate);r1(10000, 2000);//lambda表达式auto r2 [](double money, int year)-double {return money * rate * year; };r2(10000, 2000);return 0;
}