当前位置: 首页 > news >正文

南京做网站好的公司网站推广目标是什么

南京做网站好的公司,网站推广目标是什么,公司品牌策划设计,贵州网站建设深入理解C Lambda表达式#xff1a;语法、用法与原理及其包装器的使用 lambda表达式C98中的一个例子lambda表达式语法lambda表达式各部分说明捕获列表说明 函数对象与lambda表达式 包装器function包装器 bind #x1f30f;个人博客主页#xff1a; 个人主页 本文深入介绍了… 深入理解C Lambda表达式语法、用法与原理及其包装器的使用 lambda表达式C98中的一个例子lambda表达式语法lambda表达式各部分说明捕获列表说明 函数对象与lambda表达式 包装器function包装器 bind 个人博客主页 个人主页 本文深入介绍了C中的Lambda表达式的语法、用法、捕获列表以及其底层原理强调了其作为函数对象的功能。还探讨了标准库中std::function包装器和std::bind函数的应用通过它们可以灵活地封装、绑定和简化可调用对象的处理提升代码的简洁性和可读性。 lambda表达式 C98中的一个例子 在C98中如果想要对一个数据集合中的元素进行排序可以使用std::sort方法。 #include algorithm #include functional int main() {int array[] {4,1,8,5,3,7,0,9,2,6};// 默认按照小于比较排出来结果是升序std::sort(array, arraysizeof(array)/sizeof(array[0]));// 如果需要降序需要改变元素的比较规则std::sort(array, array sizeof(array) / sizeof(array[0]), greaterint());return 0; }如果待排序元素为自定义类型需要用户自己定义排序时的比较规则 struct Goods {string _name; //名字double _price;//价格int _ecaluate;//评价//...Goods(const char* str,double price,int evaulate):_name(str),_price(price),_ecaluate(evaulate){} }; 如果我们用运算符重载的方法控制比较逻辑只能控制一种比较方法但是如果我们希望希望按照价格或者评价名字来排序就没办法实现所以我们可以通过仿函数来完成。 例如我们如果希望按照价格比较就提供对应的仿函数 struct ComparePriceLess {bool operator()(const Goods gl, const Goods gr){return gl._price gr._price;} };struct ComparePriceGreater {bool operator()(const Goods gl, const Goods gr){return gl._price gr._price;} };int main() {vectorGoods v { {苹果,2.1,5},{香蕉,3,4},{橙子,2.2,3},{菠萝,1.5,4} };sort(v.begin(), v.end(), ComparePriceGreater());sort(v.begin(), v.end(), ComparePriceLess());return 0; }但是这里还是有的不方便每次为了实现一个algorithm算法都要重新去写一个类如果每次比较的逻辑不一样还要去实现多个类特别是相同类的命名这些都给编程者带来了极大的不便。因此在C11语法中出现了Lambda表达式。 lambda表达式语法 lambda表达式书写格式 [capture-list] (parameters) mutable - return-type { statement }lambda表达式各部分说明 [capture-list] (不能省略): 捕捉列表该列表总是出现在lambda函数的开始位置编译器根据[ ]来判断接下来的代码是否为lambda函数捕捉列表能够捕捉上下文中的变量供lambda函数使用。(parameters)参数列表。与普通函数的参数列表一致如果不需要参数传递则可以连同( )一起省略mutable默认情况下lambda函数总是一个const函数mutable可以取消其常量性。使用该修饰符时参数列表不可省略(即使参数为空)。值时此部分可省略。返回值类型明确情况下也可省略由编译器对返回类型进行推导。{statement}不可省略函数体。在该函数体内除了可以使用其参数外还可以使用所有捕获到的变量。 注意 在lambda函数定义中参数列表和返回值类型都是可选部分而捕捉列表和函数体可以为空。因此C11中最简单的lambda函数为[ ] { }; 该lambda函数不能做任何事情。 如果我们要用lamba表达式写一个两个变量相加的函数可以这么写。 [](int x, int y)-int {return x y; };这个表达式就是一个lamba对象可以像函数一样直接调用但是对这个lamba表达式直接调用不太方便我们通常都是赋值给一个lamba对象这个对象的类型可以使用auto进行推导。 int main() {auto add1 [](int x, int y)-int {return x y; };cout add1(1, 2) endl; }auto add1 [ ](int x, int y) - int { return x y; }; 这行代码会先生成一个 lambda 对象并将其赋值给 add1。 int main() {auto add1 [](int x, int y)-int {return x y; };cout add1(1, 2) endl;auto func1 []{//返回值可自动推导类型,所以可以省略//无参数可以省略cout hello world endl;return 0;};func1();return 0; }如果我们不想用仿函数来完成比较逻辑就可以这样写 int main() {vectorGoods v { { 苹果, 2.1, 5 }, { 香蕉, 3, 4 }, { 橙子, 2.2, 3 }, { 菠萝, 1.5, 4 } };// 价格升序sort(v.begin(), v.end(), [](const Goods g1, const Goods g2)-bool{return g1._price g2._price;});sort(v.begin(), v.end(), [](const Goods g1, const Goods g2)-bool{return g1._price g2._price;});sort(v.begin(), v.end(), [](const Goods g1, const Goods g2)-bool{return g1._evaluate g2._evaluate;});sort(v.begin(), v.end(), [](const Goods g1, const Goods g2)-bool{return g1._evaluate g2._evaluate;});return 0; }捕获列表说明 捕捉列表描述了上下文中那些数据可以被lambda使用以及使用的方式传值还是传引用。 [var]表示值传递方式捕捉变量var[]表示值传递方式捕获所有父作用域中的变量(包括this)[var]表示引用传递捕捉变量var[]表示引用传递捕捉所有父作用域中的变量(包括this)[this]表示值传递方式捕捉当前的this指针 注意 父作用域指包含lambda函数的语句块语法上捕捉列表可由多个捕捉项组成并以逗号分割。 [, a, b]以引用传递的方式捕捉变量a和b值传递方式捕捉其他所有变量。[a, this]值传递方式捕捉变量a和this引用方式捕捉其他变量。 捕捉列表不允许变量重复传递否则就会导致编译错误。 [, a]已经以值传递方式捕捉了所有变量捕捉a重复。 在块作用域以外的lambda函数捕捉列表必须为空。在块作用域中的lambda函数仅能捕捉父作用域中局部变量捕捉任何非此作用域或者非局部变量都会导致编译报错但是可以使用全局域的。lambda表达式之间不能相互赋值即使看起来类型相同因为编译器生成的类名不同。 int x 0;int main() {// 只能用当前lambda局部域和捕捉的对象和全局对象int a 0, b 1, c 2, d 3;// 所有值传值捕捉auto func1 []{int ret a b c d x;return ret;};// 所有值传引用捕捉auto func2 []{a;b;c;d;int ret a b c d;return ret;};// 混合捕捉auto func3 [a, b]{a;// b;int ret a b;return ret;};// 混合捕捉// 所有值以引用方式捕捉d用传值捕捉auto func4 [, d]{a;b;c;//d;int ret a b c d;};// 混合捕捉// 所有值以传值方式捕捉d用传引用捕捉auto func5 [, d](){//a;//b;//c;d;int ret a b c d;};return 0; }因为捕获列表只能捕捉父作用域的对象因为成员函数默认传的是this指针所在这里应该捕捉的应该this指针。 class AA { public:void func(){//auto f1 [this]auto f1 []{cout _a1 endl;cout _a2 endl;};} private:int _a1 1;int _a2 2; };函数对象与lambda表达式 函数对象又称为仿函数即可以像函数一样使用的对象就是在类中重载了operator()运算符的类对象。 int main() {double rate 0.03;Rate r1(rate);cout r1(10000, 2) endl;//600auto r2 [rate](double money, int year)-double{return rate * money * year;};cout r2(10000, 2) endl;//600 }从使用方式上来看函数对象与lambda表达式完全一样。 函数对象将rate作为其成员变量在定义对象时给出初始值即可然后再调用重载的operator()。 在C中lambda表达式通过捕获列表捕获外部变量并将这些变量作为成员变量存储在lambda对象中。lambda对象的调用本质上是调用其 operator() 成员函数。 捕获列表和成员变量 捕获列表 捕获列表用于指定 lambda 表达式可以访问哪些外部变量。捕获列表中的变量会被存储为 lambda 对象的成员变量。 成员变量 捕获的变量在 lambda 对象内部被存储为成员变量。捕获列表中的变量可以通过值捕获或引用捕获。 构造函数的初始化参数 构造函数 lambda 对象的构造函数会使用捕获列表中的变量来初始化成员变量。 调用 operator() 成员函数 调用 当你调用 lambda 对象时实际上是调用了其 operator() 成员函数。operator() 成员函数包含了 lambda 表达式的主体代码。 实际在底层编译器对于lambda表达式的处理方式完全就是按照函数对象的方式处理的即如果定义了一个lambda表达式编译器会自动生成一个类这个类的名字是lamba uuid 并且会在在该类中重载operator()。 包装器 function包装器 template class T function; // undefined template class Ret, class... Args class functionRet(Args...); //模板参数说明 //Ret: 被调用函数的返回类型 //Args…被调用函数的形参function包装器 也叫作适配器。C中的function本质是一个类模板也是一个包装器。 包装器包装的是可调用对象可调用对象一般有三类函数指针类型不好写仿函数需要单独写一个类lamba没办法写类型。 //普通函数 int f(int a, int b) {return a b; } //仿函数 struct Functor { public:int operator()(int a, int b){return a b;} };int main() {//function包装可调用对象,可以统一类型functionint(int, int) f1 f;functionint(int, int) f2 Functor();functionint(int, int) f3 [](int a, int b)-int {return a b; };return 0; }通过一个命令就对应一个动作也就是说一个字符串对应一个函数可调用对象这里我们会通常使用map实现但是map的第二个参数可能是函数指针仿函数对象lamba对象。 如果第二个参数个函数指针的话虽然可以实现但是函数指针类型写起来太麻烦如果用仿函数的类型实现的话就只能固定死一种类型lamba表达式没有类型所以这里就可以使用function来实现可接受各种类型。 int main() {functionint(int, int) f1 f;functionint(int, int) f2 Functor();functionint(int, int) f3 [](int a, int b)-int {return a b; };map string, functionint(int, int) opFuncMap;opFuncMap[函数指针] f1;opFuncMap[仿函数] f2;opFuncMap[lamba] f3;cout opFuncMap[函数指针](2, 3) endl; //5cout opFuncMap[仿函数](2, 3) endl; // 5cout opFuncMap[lamba](2, 3) endl; //5return 0; }function包装器简化代码求解逆波兰表达式的步骤如下 class Solution { public:int evalRPN(vectorstring tokens) {stackint st; // 创建一个栈用于存储中间结果// 定义一个映射将字符串操作符映射到对应的 lambda 表达式mapstring, functionint(int, int) op {{, [](int a, int b) { return a b; }},{-, [](int a, int b) { return a - b; }},{*, [](int a, int b) { return a * b; }},{/, [](int a, int b) { return a / b; }}};// 遍历输入的逆波兰表达式for (const auto str : tokens) {// 如果当前字符串是操作符if (op.count(str)) {// 从栈中弹出两个操作数int right st.top();st.pop();int left st.top();st.pop();// 应用对应的操作符并将结果压入栈中st.push(op[str](left, right));} else {// 如果当前字符串是数字将其转换为整数并压入栈中st.push(stoi(str));}}// 栈顶元素即为最终结果return st.top();} };function还可以包装成员函数。 class Plus { public://静态成员函数static int plusi(int a, int b){return a b;}//普通成员函数double plusd(double a, double b){return a b;} };int main() {//包装静态成员函数functionint(int, int) f1 Plus::plusi;//包装普通成员函数Plus p;functiondouble(Plus* ,double, double) f2 Plus::plusd;cout f2(p, 1.1, 2.0) endl;functiondouble(Plus, double, double) f3 Plus::plusd;cout f3(p, 1.1, 2.0) endl;return 0; }注意 规定类的成员函数名取地址才是成员函数的地址。成员函数的第一个默认的参数是this指针这里为什么这里的第一个参数用对象也可以呢 其实包装器包装对象的本质也是一个仿函数实际要包装的对象作为自己的成员变量这样的方式存起来然后调用operator()operator()函数里面再去要包装的可调用对象所以这里的第一个参数只是为了调用operator()所以这里使用指针对象都可以调用成员函数。 bind std::bind函数定义在头文件中是一个函数模板它就像一个函数包装器(适配器)接受一个可调用对象callable object生成一个新的可调用对象来“适应”原对象的参数列表。一般而言我们用它可以把一个原本接收N个参数的函数fn通过绑定一些参数返回一个接收M个M可以大于N但这么做没什么意义参数的新函数。同时使用std::bind函数还可以实现参数顺序调整等操作。 // 原型如下 template class Fn, class... Args /* unspecified */ bind (Fn fn, Args... args); // with return type (2) template class Ret, class Fn, class... Args /* unspecified */ bind (Fn fn, Args... args);可以将bind函数看作是一个通用的函数适配器它接受一个可调用对象生成一个新的可调用对象来“适应”原对象的参数列表。 调用bind的一般形式auto newCallable bind(callable,arg_list); 其中newCallable本身是一个可调用对象arg_list是一个逗号分隔的参数列表对应给定的callable的参数。当我们调用newCallable时newCallable会调用callable,并传给它arg_list中的参数。 arg_list中的参数可能包含形如_n的名字其中n是一个整数这些参数是“占位符”表示newCallable的参数它们占据了传递给newCallable的参数的“位置”。数值n表示生成的可调用对象中参数的位置_1为newCallable的第一个参数_2为第二个参数以此类推。 int Sub(int a ,int b) {return a - b; }int SubX(int a, int b,int c) {return a - b - c; }using placeholders::_1; using placeholders::_2; using placeholders::_3;int main() {//调整参数顺序auto sub1 bind(Sub, _1, _2);cout sub1(10, 5) endl;//绑定本质返回是防函数//调整参数顺序//_1代表第一个实参//_2代表第二个实参auto sub2 bind(Sub, _2, _1);cout sub2(10, 5) endl;//调整参数个数auto sub3 bind(Sub, 100, _1);cout sub3(5) endl;auto sub4 bind(Sub, _1, 100);cout sub3(5) endl;auto sub5 bind(SubX, 100, _1, _2);cout sub5(5, 10);auto sub6 bind(SubX, _1,100, _2);cout sub6(5, 10);auto sub7 bind(SubX, _1, _2, 100);cout sub7(5, 10);}function在包装成员函数的时候第一个参数显示传比较麻烦这里就可以使用bind进行绑定。 //bind一般用于绑定一些固定参数 functiondouble(double, double) f3 bind(Plus::plusd, Plus(), _1, _2);int main() {auto func [](double rate, double money, int year)-double{int ref 0;for (size_t i 0; i year; i){ref money * rate;money money * rate;}return ref;};functiondouble(double) func_3_1_5 bind(func, 0.015, _1, 3);functiondouble(double) func_5_1_5 bind(func, 0.015, _1, 5);functiondouble(double) func_30_1_5 bind(func, 0.015, _1, 30);cout func_3_1_5(100000) endl;cout func_3_1_5(100000) endl;cout func_3_1_5(100000) endl;return 0; }
文章转载自:
http://www.morning.yrjfb.cn.gov.cn.yrjfb.cn
http://www.morning.lkgqb.cn.gov.cn.lkgqb.cn
http://www.morning.wfdlz.cn.gov.cn.wfdlz.cn
http://www.morning.rtjhw.cn.gov.cn.rtjhw.cn
http://www.morning.cwskn.cn.gov.cn.cwskn.cn
http://www.morning.mgtmm.cn.gov.cn.mgtmm.cn
http://www.morning.jfcbz.cn.gov.cn.jfcbz.cn
http://www.morning.rhzzf.cn.gov.cn.rhzzf.cn
http://www.morning.frsbf.cn.gov.cn.frsbf.cn
http://www.morning.wxgd.cn.gov.cn.wxgd.cn
http://www.morning.yunease.com.gov.cn.yunease.com
http://www.morning.muniubangcaishui.cn.gov.cn.muniubangcaishui.cn
http://www.morning.wfttq.cn.gov.cn.wfttq.cn
http://www.morning.krswn.cn.gov.cn.krswn.cn
http://www.morning.mfnjk.cn.gov.cn.mfnjk.cn
http://www.morning.hhrpy.cn.gov.cn.hhrpy.cn
http://www.morning.dongyinet.cn.gov.cn.dongyinet.cn
http://www.morning.mbmh.cn.gov.cn.mbmh.cn
http://www.morning.kwjyt.cn.gov.cn.kwjyt.cn
http://www.morning.ldqrd.cn.gov.cn.ldqrd.cn
http://www.morning.sgrdp.cn.gov.cn.sgrdp.cn
http://www.morning.pjftk.cn.gov.cn.pjftk.cn
http://www.morning.pcxgj.cn.gov.cn.pcxgj.cn
http://www.morning.tkrdg.cn.gov.cn.tkrdg.cn
http://www.morning.rjfr.cn.gov.cn.rjfr.cn
http://www.morning.gynls.cn.gov.cn.gynls.cn
http://www.morning.kyfnh.cn.gov.cn.kyfnh.cn
http://www.morning.wschl.cn.gov.cn.wschl.cn
http://www.morning.qmqgx.cn.gov.cn.qmqgx.cn
http://www.morning.przc.cn.gov.cn.przc.cn
http://www.morning.fnxzk.cn.gov.cn.fnxzk.cn
http://www.morning.ljcf.cn.gov.cn.ljcf.cn
http://www.morning.rntby.cn.gov.cn.rntby.cn
http://www.morning.jzkqg.cn.gov.cn.jzkqg.cn
http://www.morning.knnhd.cn.gov.cn.knnhd.cn
http://www.morning.yxbrn.cn.gov.cn.yxbrn.cn
http://www.morning.zqmdn.cn.gov.cn.zqmdn.cn
http://www.morning.mgskc.cn.gov.cn.mgskc.cn
http://www.morning.sjbty.cn.gov.cn.sjbty.cn
http://www.morning.pqcbx.cn.gov.cn.pqcbx.cn
http://www.morning.rlbfp.cn.gov.cn.rlbfp.cn
http://www.morning.kwksj.cn.gov.cn.kwksj.cn
http://www.morning.zbmcz.cn.gov.cn.zbmcz.cn
http://www.morning.xkyfq.cn.gov.cn.xkyfq.cn
http://www.morning.xkppj.cn.gov.cn.xkppj.cn
http://www.morning.mwlxk.cn.gov.cn.mwlxk.cn
http://www.morning.wjtwn.cn.gov.cn.wjtwn.cn
http://www.morning.jrwbl.cn.gov.cn.jrwbl.cn
http://www.morning.rbkl.cn.gov.cn.rbkl.cn
http://www.morning.yqfdl.cn.gov.cn.yqfdl.cn
http://www.morning.wrwcf.cn.gov.cn.wrwcf.cn
http://www.morning.rwzmz.cn.gov.cn.rwzmz.cn
http://www.morning.dpjtn.cn.gov.cn.dpjtn.cn
http://www.morning.mdpkf.cn.gov.cn.mdpkf.cn
http://www.morning.sqmlw.cn.gov.cn.sqmlw.cn
http://www.morning.smnxr.cn.gov.cn.smnxr.cn
http://www.morning.jrlgz.cn.gov.cn.jrlgz.cn
http://www.morning.zztmk.cn.gov.cn.zztmk.cn
http://www.morning.grbgn.cn.gov.cn.grbgn.cn
http://www.morning.dansj.com.gov.cn.dansj.com
http://www.morning.ctpfq.cn.gov.cn.ctpfq.cn
http://www.morning.rqhn.cn.gov.cn.rqhn.cn
http://www.morning.pycpt.cn.gov.cn.pycpt.cn
http://www.morning.trsfm.cn.gov.cn.trsfm.cn
http://www.morning.yrqb.cn.gov.cn.yrqb.cn
http://www.morning.pqktp.cn.gov.cn.pqktp.cn
http://www.morning.ttdbr.cn.gov.cn.ttdbr.cn
http://www.morning.bqdgr.cn.gov.cn.bqdgr.cn
http://www.morning.zwtp.cn.gov.cn.zwtp.cn
http://www.morning.pmptm.cn.gov.cn.pmptm.cn
http://www.morning.fdrb.cn.gov.cn.fdrb.cn
http://www.morning.nuejun.com.gov.cn.nuejun.com
http://www.morning.jqbmj.cn.gov.cn.jqbmj.cn
http://www.morning.lmfmd.cn.gov.cn.lmfmd.cn
http://www.morning.cjnfb.cn.gov.cn.cjnfb.cn
http://www.morning.tkzrh.cn.gov.cn.tkzrh.cn
http://www.morning.wjhnx.cn.gov.cn.wjhnx.cn
http://www.morning.mxhys.cn.gov.cn.mxhys.cn
http://www.morning.nynlf.cn.gov.cn.nynlf.cn
http://www.morning.nmhpq.cn.gov.cn.nmhpq.cn
http://www.tj-hxxt.cn/news/258721.html

相关文章:

  • 建设监理工程公司网站门户网站建设工作总结
  • 企业标准型手机网站公司单位名称大全
  • 中企动力科技股份有限公司网站官网动态ip代理
  • 龙岗区建设规划网站贵阳网站建设平台
  • 网站开发所需技能seo的外链平台有哪些
  • 网站分为哪些类型制作网站的程序
  • 做一小说网站要花多钱苏州一建建筑集团有限公司
  • 苏州吴江太湖新城建设局网站优秀vi设计网站
  • wordpress能做手机站么上海网站建设特点
  • 做招商加盟做得比较好的网站网站模板但没有后台如何做网站
  • 网站建设的有什么需求广东网站制作公司排名
  • 完爆网站开发经典实例企业大型网站开发建站教程详解
  • PHP做网站案例教程免费企业cms
  • 网站添加邮件发送怎么做湖南网络优化服务
  • discuz做电影网站wordpress 艺术品主题
  • 电影网站制作教程好不好.vip域名的网站排名
  • 山西孝义网站开发黄陌陌网站怎么做
  • 网站建设公司的业务范围怎么给网站做手机端
  • 做加盟的网站建设响应式企业网站后台管理系统
  • 模板网站建设服务商网站备案快速
  • 网站顶部下拉广告代码厦门互联网公司排名
  • 做网站起什么名字比较好大连鼎信网站建设
  • 怎么删除建站网站程序网站后台初始密码
  • 网站的优化怎么做长宁区网站建设设计
  • 网站制作_做网站_耐思智慧wordpress恶意验证码
  • 一个网站上面有名优cpa项目推广联盟
  • 营销网站特点采集文章留在网站
  • 学做网站培训班要多少钱网络营销专业的就业方向
  • 常州市建设局网站6陕西网站建站
  • 深圳市国外网站建设服务机构电子商务未来发展趋势前景