精华内容
下载资源
问答
  • C++ 匿名函数

    万次阅读 多人点赞 2019-09-20 13:38:59
    1.定义 所谓匿名函数,其实类似于python中的lambda函数,其实就是没有名字的函数。使用匿名函数,可以免去函数的...C++中的匿名函数通常为[capture](parameters)->return-type{body},当parameters为空的时候,...

    1.定义

    所谓匿名函数,其实类似于python中的lambda函数,其实就是没有名字的函数。使用匿名函数,可以免去函数的声明和定义。这样匿名函数仅在调用函数的时候才会创建函数对象,而调用结束后立即释放,所以匿名函数比非匿名函数更节省空间

    2.详解

    C++中的匿名函数通常为[capture](parameters)->return-type{body},当parameters为空的时候,()可以被省去,当body只有“return”或者返回为void,那么”->return-type“可以被省去,下面将将对其中的参数一一解释

    • capture:
    1. []        //未定义变量.试图在Lambda内使用任何外部变量都是错误的.
    2. [x, &y]   //x 按值捕获, y 按引用捕获.
    3. [&]       //用到的任何外部变量都隐式按引用捕获
    4. [=]       //用到的任何外部变量都隐式按值捕获
    5. [&, x]    //x显式地按值捕获. 其它变量按引用捕获
    6. [=, &z]   //z按引用捕获. 其它变量按值捕获
    • parameters:存储函数的参数
    • return-type:函数的返回值
    • body:函数体

    3.举个例子

    • 我们可以将匿名函数做函数指针使用
    #include<iostream>
    void main()
    {
    	int Featurea = 7;
    	int Featureb = 9;
    	auto fun = [](size_t Featurea, size_t Featureb){return Featurea<Featureb ? Featurea : Featureb; };
    	int i = fun(Featurea, Featureb);
    	std::cout << i << std::endl;
    }
    • 对一些STL容器函数sort,find等,其最后的一个参数时函数指针,我们也可以使用匿名函数来完成
    #include<vector>
    #include<algorithm>
    #include<iostream>
    
    void main()
    {
    	std::vector<int> a(5);
    	a[0] = 3;
    	a[1] = 4;
    	a[2] = 5;
    	a[3] = 6;
    	a[4] = 7;
    	std::for_each(std::begin(a), std::end(a), [](int Feature){std::cout << Feature << std::endl; });
    }
    
    • 我们可以直接调用函数指针
    #include<iostream>
    template <class Callback>
    int CollectFeatures(Callback CB)
    {
    	int count = 0;
    	for (int i = 0; i < 10; i++)
    	{
    		if (CB(i))
    		{
    			count++;
    		}
    	}
    	return count;
    }
    bool AddFeature(size_t Feature)
    {
    	return Feature % 2;
    }
    void main()
    {
    	
    	int i = CollectFeatures([](size_t Feature) -> bool { return AddFeature(Feature); });
    	std::cout << i << std::endl;
    }

     

     

     

     

    展开全文
  • C++匿名函数

    2021-02-05 14:12:52
    匿名函数lambda表达式 一.匿名函数的简单使用 匿名函数(英文名:lambda)就是没有名字的函数。最简单的匿名函数是[](){},它没有参数也没有返回值。在匿名函数中,[]里面用来捕获函数外部的变量,而()里面就是匿名...

    匿名函数lambda表达式

    一.匿名函数的简单使用

    • 匿名函数(英文名:lambda)就是没有名字的函数。最简单的匿名函数是[](){},它没有参数也没有返回值。在匿名函数中,[]里面用来捕获函数外部的变量,而()里面就是匿名函数的参数,{}里面就是函数的执行代码。

    1.1一个简单的示例:

    #include<iostream>
    using namespace std;
    int main(){
    	// 注:
    	/**
    		[=]表示值传递方式捕捉所有父作用域的变量包, 括this
    		[&s]表示引用传递捕捉变量s
    		[&]表示引用传递方式捕捉所有父作用域的变量, 包括this
    		[this]表示值传递方式捕捉当前的this指针
    		可以连用如:[=,&a,&b]表示以引用传递的方式捕捉变量a和b,以值传递方式捕捉其它所有变量
    		注意:捕捉列表不允许变量重复传递比如[&,&a]
    	*/
    	// 匿名函数 - ->返回值类型 - lambda表达式
    	auto fun = [](int a)->int{ // 定义匿名函数 并引用
            cout << a << endl;
            return 1;
    	};
    	int num = fun(10);// 调用
    	cout << num << endl;// 测试返回值
    	return 0; 
    }
    

    1.2基础示例

    #include <algorithm> // std::sort()
    #include <string> // std::string
    #include <iostream> // std::cout std::endl
    
    int main(void)
    {
        std::string text = "banana";
        std::sort(text.begin(), text.end(),[](char x, char y)
        {
            return x > y;
        });
        std::cout << "从大到小排序:" << text << std::endl;
        return 0;
    }
    

    输出结果:

    从大到小排序:nnbaaa
    

    之前的教程中,我们是直接声明定义了一个less()函数来改变std::sort()的排序方式。使用匿名函数的好处就是不需要费时间去思考函数的名字,那么也因此少了一个标识符,就少了冲突的风险。而且如果定义less()函数,那么查看代码时std::sort(text.begin(), text.end(), less);,有可能还需要去找函数less()定义,而使用匿名函数就可以不需要去其他地方找函数定义了。

    注意:一般匿名函数里的语句只有一条或者少数的几条,当匿名函数里的语句太多时,可能会影响代码的阅读。

    1.3基础拓展 1

    如果编译器推导出的返回类型并不是你期望的,可以使用后置返回类型来指定返回类型:

    auto to_double = [](float value) -> double
    {
        return value;
    }
    

    上面代码如果不指定返回类型double,那么它的返回类型就是float

    1.4基础拓展 2

    std::sort(text.begin(), text.end(), [](char x, char y)
    {
        return x > y;
    });
    

    对于匿名函数的形式参数,如果你觉得它太长,可以改写成以下形式:

    std::sort(text.begin(), text.end(), [](auto x, auto y)
    {
        return x > y;
    });
    

    编译器可以根据实际情况,推导出参数x和参数y的数据类型

    二.匿名函数的捕获

    2.1基础示例

    匿名函数[]里面是用来捕获的。下面是如何使用[]捕获的简单例子:

    #include <iostream> // std::cout std::endl
    #include <string> // std::string std::to_string
    
    int main(void)
    {
        std::string text = "大家好,我是小帅坤。";
        int laugh = 2333;
        // 创建函数add_to_back用来将2333转成字符串后添加到text末尾
        // 当然只为了教学才这样写
        auto add_to_back = [&text, laugh](void)
        {
            text += std::to_string(laugh);
        }; // 匿名函数的大括号后面需要加分号。
        
        // 调用函数
        add_to_back();
        // 输出
        std::cout << text << std::endl;
        return 0;
    }
    

    2.2基础讲解

    上面代码中,使用变量add_to_back保存匿名函数。

    匿名函数捕获的多个变量可以用,隔开写在[]里面。

    如果在[]里面直接写外部变量名称如laugh,那么匿名函数所做的操作是复制,也就是说,变量内存很大的话,复制数据很多,速度慢;而且这个laugh在匿名函数里面是不能被赋值的。

    如果在[]里面写外部变量名称并且在前面加&&text,那么它不会复制数据,而是传递的数据的引用。所以数据大的话就应该用这个;而且再匿名函数中对text进行修改,外部的变量text也会随之改变。所以代码中输出字符串text是改变后的字符串。

    如果需要为捕获的变量起个别名,上面代码中匿名函数可以这样写:

    auto add_to_back = [&t = text, l = laugh](void)
    {
        t += std::to_string(l);
    };
    

    2.3基础拓展

    []是不捕获,[=]就是lambda所用到的外部变量都会直接复制捕获,[&]就是lambda所用到的外部变量都会直接引用捕获,[this]以引用捕获当前对象(用于类内部)。

    匿名函数作为默认实参

    当匿名函数作为默认实参时,匿名函数是不能捕获任何内容的,否则编译将会报错。

    展开全文
  • c++匿名函数

    2020-04-16 14:26:27
    class Solution { public: vector<vector<int>> merge(vector<vector<int>>& intervals) { sort(intervals.begin(),intervals.end(),[](vector<... a,vector&l...
    class Solution {
    public:
        vector<vector<int>> merge(vector<vector<int>>& intervals) {
            sort(intervals.begin(),intervals.end(),[](vector<int>& a,vector<int>& b){return a[0]<b[0];});
            vector<vector<int>> ans;
            for(auto& val:intervals){
                if(ans.empty()||val[0]>ans.back()[1]){
                    ans.push_back(val);
                }
                else{
                    int t0=ans.back()[0];
                    int t1=ans.back()[1];
                    ans.pop_back();
                    ans.push_back({t0,max(val[1],t1)});
                }
            }
            return ans;
        }
    
    };
    
    展开全文
  • c++ 匿名函数

    2014-12-02 16:52:00
    #include<iostream> #include <cstdlib> using namespace std; int main() { //为了在以后便于区分,我这段main()代码叫做main1 auto func = [] { printf("%d\n",1989);......
    #include<iostream>
    #include <cstdlib>
    using namespace std;
    
    int main()
    {
        //为了在以后便于区分,我这段main()代码叫做main1
        auto
        func = [] 
        { 
            printf("%d\n",1989); 
        };
    
        func();
        system("pause");
        return 0;
    }

     

    转载于:https://www.cnblogs.com/yufenghou/p/4137922.html

    展开全文
  • C++匿名函数的使用c++匿名函数使用方法1、匿名函数的使用2、什么是捕获列表?3、一些“废话”3.1 介绍Lambda3.2、Lambda捕获列表 c++匿名函数使用方法 1、匿名函数的使用 匿名函数的基本语法为: //[捕获列表](参数...
  • C++匿名函数Lambda

    2019-08-01 10:48:26
    Lambda表达式称为匿名函数,所谓匿名函数,有以下两方面的含义 Lambda表达式是函数的一种,从功能上看,Lambda表达式和函数的作用完全一样(虽然Lambda表达式实质是一个类),使用Lambda表达式完成的功能,也可以...
  • C++匿名函数的使用

    2020-04-08 23:03:59
    匿名函数 匿名函数,通俗的说就是没由函数的名字。   匿名函数和sort()一起使用 可以在sort()函数中,用匿名函数自定义排序方法。   匿名函数和auto语句一起使用 关于auto语句大家可以自行查找,在此不...
  • 递归函数:递归指由一种(或多种)简单的基本情况定义的一类对象或方法,并规定其他所有情况都能被还原为其基本情况。(说白了就是函数自己调用自己) 我们应该都听过下面这一段话: “从前有座山,山里有座庙,庙里有...
  • C++匿名函数Lambda使用

    2020-12-09 09:44:46
    文章目录:1、匿名函数的使用2、什么是捕获列表?3、附加3.1、介绍Lambda3.2、Lambda捕获列表 1、匿名函数的使用 匿名函数的基本语法为: //[捕获列表](参数列表)->返回类型{函数体} int main() { auto Add = []...
  • C++匿名函数使用方法

    2020-08-07 16:42:24
    文章目录1、匿名函数的使用2、什么是捕获列表?3、一些”废话“3.1、介绍Lambda3.2、Lambda捕获列表 1、匿名函数的使用 匿名函数的基本语法为: //[捕获列表](参数列表)->返回类型{函数体} int main() { auto ...
  • c++匿名函数考察点

    2021-01-27 11:52:21
    首先是匿名函数形式 []//捕获列表 默认是按值捕获 ()//参数列表 ->int //函数返回值 int c2 = [](int a, int b) -> int { return a + b; }(1,2); //为了能够复用lamba表达式 auto f= [](int a, int b...
  • C++ 11 中的 Lambda 表达式用于定义并创建匿名函数对象,以简化编程工作。 Lambda 的语法形式如下: [函数对象参数] (操作符重载函数参数) mutable 或 exception 声明 -> 返回值类型 {函数体} 可以看到,Lambda...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,344
精华内容 937
关键字:

c++匿名函数

c++ 订阅