zoukankan      html  css  js  c++  java
  • c++11新标准for循环和lambda表达式

    1 for

    在C++11中for扩展了一个新的用法,类似于c#中的foreach.可以用来遍历容器,输出和关联容器等。配合另外的c++11新关键字auto能够很方便的实现遍历。用法如下:

    #include <iostream>
     
    int main()
    {
      std::string myStr = "hello!";
      for(auto ch : myStr)
        std::cout<<ch<<std::endl;
    }

    上面函数的作用是遍历 string 然后输出其每一个元素。

    2 lambda表达式

    关于lambda表达式在 C++ Lambda表达式用法C++11 lambda表达式解析 这两篇文章中已经有了比较详细的介绍了。其完整表达式为:

    [ capture ] ( params ) mutable exception attribute -> ret { body }

    这里对 capture 进行补充说明一下,上面的第二篇文章将这个翻译为捕获,第一遍看到的时候比较困惑。后来才发现这个其实就是指定了lambda表达式作为函数对象其构造函数传递进来的参数是什么,只有传递进来的参数lambda表达式才可以使用, 即lambda表达式会生成一个重载了()操作的函数对象,该对象的构造函数参数由[]内参数指定 。其他的没有什么好补充的。可以在支持c++11标准的编译器上运行下面代码感受一下:

    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <functional>
     
    class LessFunction
    {
    public:
        LessFunction(int threshold) :Threshold(threshold) {}
     
        bool operator () (int n)
        {
            return n < Threshold;
        }
    private:
        int Threshold;
     
    };
     
    int main()
    {
        //使用普通的函数对象
        std::vector<int> a { 1,2,3,4,5,6,7 };
        LessFunction myFun(5);
        a.erase(std::remove_if(a.begin(), a.end(), myFun), a.end());
        std::cout << "a:" ;
        for (auto i : a)
            std::cout << i << " ";
        std::cout << std::endl;
     
        //使用lambda表达式,以值传递的方式将x作为函数对象的构造函数参数
        std::vector<int> b{ 1,2,3,4,5,6,7 };
        int x = 5;
        b.erase(std::remove_if(b.begin(), b.end(), [x](int n) {return n < x; }), b.end());
        std::cout << "b:" ;
        for (auto i : b)
            std::cout << i << " ";
        std::cout << std::endl;
     
        //保存lambda表达式生成的函数对象
        auto func1 = [](int i) {return i + 4; };
        std::cout << "func1: 6+4=" << func1(6) << std::endl;
     
        //进一步说明lambda表达式生成的是函数对象,用函数对象保存
        std::function<int(int)> func2 = [](int i) {return i + 4; };
        std::cout << "func2: 6+4=" << func2(6) << std::endl;
     
        system("pause");
    }

    这里lambda表达式返回类型的值有return语句推导出。只要明确函数对象构造函数的参数和函数调用参数的不同,对于lambda表达式的[]和()理解也就更加清晰了。

  • 相关阅读:
    为什么要使用 npm?
    scrapy框架使用.Request使用meta传递数据,以及deepcopy的使用,这种三层for循环,就会有deepcopy的问题,
    scrapy download delay, CONCURRENT_REQUESTS
    分布式爬虫部署,爬虫需要什么样的服务器配置,现在爬虫岗位都要会这个
    爬虫的难点不在爬虫,而在对抗
    scrapy框架使用-下载视频,使用you-get模块来下载视频
    scrapy框架使用-爬虫中间件
    4-06python语法基础-内置模块-urllib模块,以及第三方模块requests的使用,cookie字典生成式,切url的末尾字符串
    scrapy框架使用-下载图片,使用urllib,使用requests,使用imagepipeline,
    4-05python语法基础-内置模块-json模块
  • 原文地址:https://www.cnblogs.com/yabin/p/7777835.html
Copyright © 2011-2022 走看看