门户网站建设美丽,广州联享网站建设公司怎么样,nas做网站需要备案吗,男女做羞羞的事网站#x1f436;博主主页#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️#x1f525;专栏系列#xff1a;线性代数#xff0c;C初学者入门训练#xff0c;题解C#xff0c;C的使用文章#xff0c;「初学」C #x1f525;座右铭#xff1a;“不要等到什么都没有了#xff0c;才下… 博主主页ᰔᩚ. 一怀明月ꦿ ❤️专栏系列线性代数C初学者入门训练题解CC的使用文章「初学」C 座右铭“不要等到什么都没有了才下定决心去做” 大家觉不错的话就恳求大家点点关注点点小爱心指点指点 c11中的lambda表达式 lambda表达式的基本格式 [capture list] (parameters) - return_type {// 函数体
} * capture-list用于捕获外部变量可以省略。捕获方式有三种 * []以引用方式捕获所有外部变量。 * []以值的方式捕获所有外部变量。 * [var1, var2, ...]指定需要捕获的外部变量列表可以使用 或 来指定捕获方式。 * parameter-list函数参数列表类似于普通函数的参数列表可以省略。 * return-type返回类型可以省略编译器可以自动推断。 * bodyLambda 函数体类似于普通函数体包含了执行的语句。 下面是一个简单的示例展示了如何在 C11 中使用 Lambda 表达式 不使用捕捉列表 capture-list #include iostreamint main() {// Lambda 表达式示例计算两个数的和//参数列表有两个整数auto add [](int a, int b) - int {return a b;};// 调用 Lambda 表达式int result add(3, 4);std::cout Result of add function: result std::endl;// Lambda 表达式示例打印 Hello World//参数列表为空auto printHello []() {std::cout Hello, World! std::endl;};// 调用 Lambda 表达式printHello();return 0;
}使用捕捉列表 capture-list int main()
{int x119,y120;coutxx:yyendl;//参数列表为空调用时不需要传递参数auto f1[x,y](){int temp;tempx;xy;ytemp;};//[]就是捕捉列表可以捕捉lambda表达式所在函数这里是main函数里的变量提供自己使用这里采用的是引用捕捉x,y因为我们要在lambda的函数体里修改x,y如果不需要修改x,y的值时可以采用值捕捉[x,y](){}f1();coutxx:yyendl;return 0;
} 使用捕捉列表 capture-list的其他用法 int main()
{int x 1,y 2,z 3;//以值的方式捕捉所有的变量auto f1[](){coutxyzendl;};//[]是捕捉所有变量的意思f1();//以引用的方式捕捉所有的变量auto f2[](){coutxyzendl;};//[]是捕捉所有变量的意思f2();//以值的方式捕捉所有的变量指定x,y以引用捕捉auto f3[,x,y](){coutxyzendl;};f3();return 0;
} lambda的底层其实是一个仿函数 包装器 function function 是 C 标准库中的一个模板类用于封装可调用对象包括函数指针、函数对象、lambda 表达式等等使用时需要functional头文件。 function 的定义如下 templateclass R, class... Args class functionR(Args...);其中 R 是返回类型Args 是参数类型。通过这个定义你可以创建一个 function 对象它可以接受参数为 Args 类型返回类型为 R 类型的可调用对象。 事例1 void swap_func(int r1,int r2)
{int temp;tempr1;r1r2;r2temp;
}struct swap_2
{void operator()(int r1,int r2){int temp;tempr1;r1r2;r2temp;}
};
int main()
{int x119;int y120;auto lambdaswap[](int r1,int r2){int temp;tempr1;r1r2;r2temp;};//包装器指向swap_func函数functionvoid(int,int) f1swap_func;f1(x,y);coutx:x y:yendl;//包装器指向仿函数functionvoid(int,int) f2swap_2();//swap_2() 是一个函数调用操作符 operator() 被重载的类 swap_2 的匿名对象。在 C 中类的对象也可以被当作函数使用如果该类定义了一个函数调用操作符 operator()就可以像调用函数一样使用这个对象。在这种情况下swap_2() 返回的匿名对象会被当作函数使用具体来说它会被当作一个函数对象使用。f2(x,y);coutx:x y:yendl;//包装器指向lambda表达式functionvoid(int,int) f3lambdaswap;f3(x,y);coutx:x y:yendl;return 0;
} 事例2 class Test
{
public:int add(int x,int y){return xy;}static int add_s(int x,int y){return xy;}
};
int main()
{//包装器指向静态成员函数//需要加域名functionint(int,int) f1Test::add_s;int sumf1(1,2);coutsumendl;//包装器指向普通成员函数//1.需要加域名//2.需要取地址//3.function需要多加一个类的指针因为成员函数的参数列表中隐含一个this指针functionint(Test*,int,int) f2Test::add;Test t1;int numf2(t1,1,2);coutnumendl;
} function封装可调用对象包括函数指针、函数对象、lambda 表达式时一定保证参数类型是相同的 bind 在C中std::bind 是一个函数模板用于创建一个可调用对象该对象可以绑定到函数、成员函数、函数对象或者其他可调用对象并且可以指定部分或全部参数的值。std::bind 允许你在调用时提供缺少的参数或者在调用时提供额外的参数。 bind 的基本语法如下 template class F, class... Args
/*unspecified*/ bind( F f, Args... args ); 其中 F 是可调用对象的类型args 是可调用对象的参数。bind 返回一个可调用对象该对象可以通过调用其 operator() 来调用绑定的函数或函数对象并传递给它们参数。 事例 class Test
{
public:int add(int x,int y){return xy;}static int add_s(int x,int y){return xy;}
};int sub(int x,int y)
{return x-y;
}int main()
{//调整参数顺序functionint(int,int) f1bind(sub,placeholders::_2,placeholders::_1);//bind第一个参数是函数名placeholders::_2,placeholders::_1可用来改变参入参数的顺序的int numf1(2,0);//顺序变为sub(0,2)coutnumendl;//调整参数个数functionint(int) f2bind(sub,100,placeholders::_1);//我们也可以在绑定的时候提前加入指定的参数例如这里的100这样我们调用sub时就只需要传一个参数int num1f2(1);coutnum1endl;//调整参数个数functionint(int,int)f3bind(Test::add,Test(),placeholders::_1,placeholders::_2);//绑定的Test是一个自定义类型的普通成员函数传函数名时需要加域名和这个Test()是Test的匿名对象需要传递给this指针int num2f3(2,3);coutnum2endl;return 0;
}如果大家还有不懂或者建议都可以发在评论区我们共同探讨共同学习共同进步。谢谢大家