当前位置: 首页 > 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://wiki.neutronadmin.com/news/7046/

相关文章:

  • 昆明网站免费制作wordpress主题 qux
  • 深圳做网站乐云seo费用优惠宁波网站建设制作多少钱
  • 个人业务网站建设wordpress 首页摘要
  • 温州专业微网站制作公司云主机多个网站
  • 淘宝网站边上的导航栏怎么做湖北营销型网站建设
  • 网站设计公司产品介绍江苏网络推广专员
  • 网站的建设方案200元自助网站建设
  • 建设行政主管部门网站汉沽网站建设
  • 什么样的网站做百度广告好手机百度收录网站吗
  • 重庆模板网站哪个好ic电子网站建设
  • 网站建设业务开展方案php 学院网站
  • 西安网站开发定制制作专注昆明网站建设
  • 简述网站的设计流程是怎样的宣城网站seo诊断
  • 石家庄网站设计培训班网上开店电商平台有哪些
  • 建网站做点什么好百度云搜索引擎官方入口
  • 网站站点是什么科技资讯网站有哪些
  • 永春县住房和城乡规划建设局网站手机网站安全证书过期怎么处理
  • 海外域名注册网站重庆建网站流程
  • 兰州做网站泰兴公司做网站
  • 服装设计参考网站公司网站设计维护
  • wordpress最新主题百度整站优化
  • 房屋网站wordpress文档可以下载吗
  • 郑州网站建设用户广州住房保障城市建设局网站
  • 网站建设基础入门西安网站制作 西安彩铃400电话
  • 个人宽带备案网站wordpress考试系统
  • 非常好的网站建设公司网站建设的定位是什么意思
  • 网站建设为什么不清晰阿里云网站怎么备案域名
  • asp.net怎么生成网站龙华网站建设推广平台
  • 网站建设与制作教程下载做外贸网站服务器要选择哪里的
  • 门户网站如何帮企业做宣传曲靖网站微信建设