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

博客网站推广法平顶山专业做网站公司

博客网站推广法,平顶山专业做网站公司,上海智能网站建设设计,常用的网站推广lambda来源于函数式编程的概念。C11这次终于把lambda加进来了。 lambda表达式有如下优点#xff1a; 1、声明式编程风格#xff1a;就地匿名定义目标函数或函数对象#xff0c;不需要额外写一个命名函数或者函数对象。以更直接的方式去写程序#xff0c;好的可读性和可维护…        lambda来源于函数式编程的概念。C11这次终于把lambda加进来了。 lambda表达式有如下优点 1、声明式编程风格就地匿名定义目标函数或函数对象不需要额外写一个命名函数或者函数对象。以更直接的方式去写程序好的可读性和可维护性。 2、简洁不需要额外再写一个函数或者函数对象避免了代码膨胀和功能分散让开发者更加集中精力在手边的问题同时也获取了更高的生产率。 3、在需要的时间和地点实现功能闭包使程序更灵活。 lambda表达式的概念和基本用法 lambda表达式定义了一个匿名函数并且可以捕获一定范围内的变量。lambda表达式的语法形式可简单归纳如下 [capture]params opt - ret { body; }; 其中capture是捕获列表params是参数表opt是函数选项ret是返回值类型body是函数体。 因此一个完整的lambda表达式看起来像这样   auto f [](int) - int { return a 1;};cout f(1) endl;                //输出2 可以看到上面通过一行代码定义了一个小小闭包用来输入加1并返回。 在C11中lambda表达式的返回值是通过前面介绍的返回值后置语法来定义的。其实很多时候lambda表达式的返回值是非常明显的比如上例。因此C11中运行省略lambda表达式的返回值定义 auto f [](int a) {return a 1; }; 这样编译器就会根据return语句自动推导出返回值类型。 需要注意的是初始化列表不能用于返回值的自动推导。   auto x1 [](int i){ return i; };         //OKreturn type is intauto x2 [](){ return {1, 2};};        // error无法推导出返回值类型 这时我们需要显示给出具体的返回值类型。 另外lambda表达式在没有参数列表时参数列表是可以省略的。因此像下面的写法都是正确的   auto f1 [] () { return 1; };auto f2 [] { return 1; };         //省略空参数表 lambda表达式可以通过捕获列表捕获一定范围的变量 1、[]不捕获任何变量。 2、[]捕获外部作用域中所有变量并作为引用在函数体中使用按引用捕获。 3、[]捕获外部作用域中所有变量并作为副本在函数体中使用按值捕获。 4、[, foo]按值捕获外部作用域中所有变量并按引用捕获foo变量。 5、[bar]按值捕获bar变量同时不捕获其他变量。 6、[this]捕获当前类中的this指针让lambda表达式拥有和当前类成员函数同样的访问权限。如果已经使用了或者就默认添加此选项。捕获this的目的是可以在lambda中使用当前类的成员函数和成员变量。 lambda表达式基本用法 #include iostream using namespace std;class A { public:int i_ 0;void func(int x, int y){///auto x1 [] { return _i; }; ///error没有捕获外部变量auto x2 [] { return i_ x y; }; ///OK捕获所有外部变量auto x3 [] { return i_ x y; }; ///OK捕获所有外部变量auto x4 [this] { return i_; }; ///OK捕获this指针///auto x5 [this] { return i_ x y; }; ///error没有捕获xyauto x6 [this, x, y] { return i_ x y; }; ///OK捕获this指针xyauto x7 [this]{ return i_ ; }; ///OK捕获this指针并修改成员的值}};int main() {int a 0, b 1;auto f1 [] { return a; }; ///error没有捕获外部变量auto f2 [] { return a; }; ///OK捕获所有外部变量并对a执行自加运算auto f3 [] { return a; }; ///OK捕获所有外部变量并返回aauto f4 [] { return a; }; ///errora是以复制方式捕获的无法修改auto f5 [a] { return a b; }; ///error没有捕获变量bauto f6 [a, b] { return a (b); }; ///OK捕获a和b的引用并对b做自加运算auto f7 [, b] { return a (b); }; ///OK捕获所有外部变量和b的引用并对b做自加运算return 0; }从上例中可以看到lambda表达式的捕获列表精细的控制了lambda表达式能够访问的外部变量以及如何访问这些变量。 需要注意的是默认状态下lambda表达式无法修改通过复制方式捕获的外部变量。如果希望修改这些变量的话我们需要使用引用方式进行捕获。 int a 0;auto f [] { return a; };a 1;cout f() endl; 在这个例子中lambda表达式按值捕获了所有外部变量。在捕获的一瞬间a的值就已经被复制到f中了。之后a被修改了但此时f中存储的a仍然还是捕获时的值因此最终输出结果是0。 如果希望lambda表达式在调用时能够及时访问外部变量我们应当使用引用方式捕获。 如果希望去修改按值捕获的外部变量需要显示指明lambda表达式为mutable int main() {int a 0;///auto f1 [](){ return a; }; ///error修改按值捕获的外部变量auto f2 []()mutable { return a; }; ///OKmutablereturn 0; } 需要注意的一点是被mutable修改的lambda表达式就算没有参数也要写明参数列表。 lambda表达式的类型在C11中被称为“闭包类型”。它是一个特殊的匿名的非nunion的类型。因此我们可以认为它是一个带有operator的类即仿函数。因此我们可以使用std::function和std::bind来存储和操作lambda表达式 std::functionint(int) f1 [] (int a) { return a; }; std::functionint(void) f2 std::bind( [] (int a) { return a; }, 123); 另外对于没有捕获任何变量的lambda表达式还可以被转换成一个普通的函数指针 using func_t int(*)(int); func_t f [] (int a) { return a; }; f(123); lambda表达式可以说是就地定义仿函数闭包的“语法糖”。它的捕获列表捕获住的任何外部变量最终均会变成闭包类型的成员变量。而一个使用了成员变量的类的operator如果能直接被转换为普通的函数指针那么lambda表达式本身的this指针就会丢失掉。而没有捕获任何外部变量的lambda表达式则不存在这个问题。 这里也可以很自然的解释为何按值捕获无法修改捕获的外部变量。因为按照C标志lambda表达式的operator默认是const的。一个const成员函数是无法修改成员变量的值的。而mutable的作用就在于取消operator的const。 声明式的编程风格简洁的代码 就地定义匿名函数不再需要定义函数对象大大简化了标准库算法的调用。在C11之前我们要调用for_each函数将vector中的偶数打印出来代码如下所示 #include iostream #include vector #include functional #include algorithm using namespace std;class CountEven { public:CountEven(int c):count(c){}void operator()(int val){if (!(val 1)){count;}}private:int count; };int main() {int count 0;vectorint v {1, 2, 3, 4, 5, 6, 7, 8};for_each(v.begin(), v.end(), CountEven(count));cout The number of even is count endl;return 0; } 这样写既繁琐又容易出错。有了lambda表达式以后我们可以使用真正的闭包概念来替换这里的仿函数代码如下所示 #include iostream #include vector #include functional #include algorithm using namespace std;class CountEven { public:CountEven(int c):count(c){}void operator()(int val){if (!(val 1)){count;}}private:int count; };int main() {int count 0;vectorint v {1, 2, 3, 4, 5, 6, 7, 8};for_each(v.begin(), v.end(), CountEven(count));cout The number of even is count endl;count 0;for_each(v.begin(), v.end(), [count](int val){if (!(val 1)){ count;}});cout The number of even is count endl;return 0; } lambda表达式的价值在于就地封装短小的功能闭包可以及其方便的表达出我们希望执行的具体操作并让上下文结合得更加紧密。
http://www.w-s-a.com/news/931570/

相关文章:

  • 备案中又需要建设网站网站信息组织优化
  • 做网站推广需要什么asp响应式h5网站源码下载
  • 柳州建设网官方网站免费自助建站哪个平台好
  • 论坛网站模板源码下载网站建设与网页设计是什么
  • 跑流量的网站淘宝网站的建设目标是
  • 网站计费系统怎么做九一制作网站
  • 网红营销推广温州seo博客
  • 临沂网站制作定制现在比较流行的软件开发模型
  • 南宁企业建站系统做问卷调查哪个网站好
  • 能打开各种网站的浏览器推荐建设部的网站首页
  • 苏州高端网站建设开发wordpress 删除图片
  • saas网站开发外贸网站设计风格
  • c 手机网站开发湘阴网页定制
  • 阿里云虚拟主机搭建wordpressWordPress优化手机端
  • 湖北长安建设网站衡阳市做网站
  • 灯饰网站建设图片深圳做网站哪家公司好
  • 网站的构造有什么网站做生鲜配送的
  • 怎么在手机上做微电影网站小马厂网站建设
  • 网络广告投放网站中山网
  • 保定网站制作专业网页设计模板html代码运行
  • 中国专利申请网官网杭州seo优化
  • 杭州低价做网站网站系统功能流程图
  • 档案室建设网站名贵中药材初加工平台
  • 怎么做优惠券的网站wordpress加载速度
  • 手机网站 分辨率如何创建网站挣钱
  • 网站建设工作标准做模版网站
  • 免费注册微信网站怎样做天猫网站视频
  • 青海建设厅网站通知wordpress如何改文章id
  • 国外搜索网站建设支付网站备案
  • 合肥建站公司有哪家招聘的拼车平台网站开发