c++ function &n lamda表达式简单使用

function 定义一个可调用实体

lamda相当于闭包,匿名函数,OC中的block

下面是简答使用的一个demo

function <int(int, int)> myfunc;//入参是int,int,出参是int
myfunc = [](int x,int y)->int{
return x + y;
};//给func赋值
cout << myfunc(10, 20) << endl;//调用

#include "stdafx.h"

#include <iostream>
#include <map>
#include <functional>
using namespace std;

// 普通函数
int add(int i, int j) { return i + j; }
// lambda表达式
auto mod = [](int i, int j) {return i % j; };
// 函数对象类
struct divide
{
    int operator() (int denominator, int divisor)
    {
        return denominator / divisor;
    }
};

///////////////////////////SubMain//////////////////////////////////
int main(int argc, char *argv[])
{
    // 受限的map
    map<char, int(*)(int, int)> binops_limit;
    binops_limit.insert({ ‘+‘, add });
    binops_limit.insert({ ‘%‘, mod });
    // 错误    1    error C2664: “void std::_Tree<std::_Tmap_traits<_Kty,_Ty,_Pr,_Alloc,false>>::insert(std::initializer_list<std::pair<const _Kty,_Ty>>)”: 无法将参数 1 从“initializer-list”转换为“std::pair<const _Kty,_Ty> &&”
    // binops_limit.insert({ ‘%‘, divide() });

    // 更灵活的map
    map<char, function<int(int, int)>> binops =
    {
        { ‘+‘, add },
        { ‘-‘, minus<int>() },
        { ‘*‘, [](int i, int j) {return i *j; } },
        { ‘/‘, divide() },
        { ‘%‘, mod },
    };
    cout << binops[‘+‘](10, 5) << endl;
    cout << binops[‘-‘](10, 5) << endl;
    cout << binops[‘*‘](10, 5) << endl;
    cout << binops[‘/‘](10, 5) << endl;
    cout << binops[‘%‘](10, 5) << endl;

    function <int(int, int)> myfunc;
    myfunc = [](int x,int y)->int{
        return x + y;
    };
    cout << myfunc(10, 20) << endl;
    system("pause");
    return 0;
}

ps:lamda捕获参数的方法

在Lambda表达式的函数体内,是不能够访问到外部的变量的,如果想要使用函数体外定义的变量,就需要将它们进行"捕获",

capture, [=], [=,&], [&], [this]

[ ]:空捕获列表,即lambda表达式不能够使用所在函数中的变量

[=]:值捕获,即lambda表达式可以以拷贝的方式访问到函数中变量的值

[&]:引用捕获,即lambda表达式中所使用的其所在函数中的变量均是引用方式

当我们不希望在捕获的时候将所有的变量都捕获的时候,我们可以使用如下的方

[=, &foo] 通过变量的拷贝捕获,但是用foo变量的引用捕获
[bar] 通过复制捕获,不要复制其他
[this] 捕获this指针对应成员

时间: 2024-10-10 22:04:54

c++ function &n lamda表达式简单使用的相关文章

C++ function、bind以及lamda表达式

http://blog.csdn.net/augusdi/article/details/11771699 首先说明一点,回调函数按我的理解就是函数名称(即函数的地址)作为函数参数在另一个函数中被使用. function #include < functional> std::function< size_t (const char*) > print_func; //std::function< size_t (const char*) >是类型,print_func

C++ lamda表达式

lamda表达式是C++11中的新特征,说白了就是匿名函数.        lambda表达式的具体形式如下:  [capture](parameters)->return-type{body} 其中, capture是需要用到的外部变量, parameters是函数参数,return-type是返回的类型(可省略),body是函数体. 来个最简单的: [](){}; ”[]"表示不需要使用外部变量,”()"表示形参列表为空,"{}"表示空函数,什么都不干.

代码简洁之道:C++ 11 之auto+ for_each + lamda表达式

摘要:在很多中情况下,我们需要这样的运算:给vector中每个元素进行相似的处理(每个元素+1,或者其他).一般情况下,我们会选用for循环,然后然后对每个元素进行处理.实际上,C++ 11提供了了lamda表达式,结合for_each,可以写出更加简洁和高效的代码. 1.for_each.简介 for_each是C++中的模板,具体用法可以参考这里:http://www.cplusplus.com/reference/algorithm/for_each/ 2.lamda表达式 lamda表达

JAVA8新特性——Lamda表达式

JAVA9都要出来了,JAVA8新特性都没搞清楚,是不是有点掉队哦~ Lamda表达式,读作λ表达式,它实质属于函数式编程的概念,要理解函数式编程的产生目的,就要先理解匿名内部类. 先来看看传统的匿名内部类调用方式: interface MyInterface{ void lMethod(); } public class Main { public static void test(MyInterface myInterface){ myInterface.lMethod(); } publi

[.net 面向对象程序设计进阶] (5) Lamda表达式(二) 表达式树快速入门

[.net 面向对象程序设计进阶] (6) Lamda表达式(二) 表达式树快速入门 本节导读: 认识表达式树(Expression Tree),学习使用Lambda创建表达式树,解析表达式树. 学习表达式在程序设计中的优点:比如构造动态查询.动态构造表达式树完成未知对象属性访问,比反射的性能高出很多.我们可以说表达式树才是Lambda的精髓,是我们必须要熟练掌握并灵活运用的. 1.关于表达式树(Expression Tree) 表达式树以树形数据结构表示代码,其中每一个节点都是一种表达式,比如

C#学习记录(七)LINQ语句及LAMDA表达式

LINQ LINQ是一种集成在计算机语言里的信息查询语句,可以让编写者以代码的方式操作数据库. 在C#中,LINQ语句有两种写法. 这是第一种写法 IEnumerable<Customer> result = from customer in customers where customer.FirstName == "Donna“ select customer; 由于这种写法比较容易和SQL语言混淆,所以我更倾向于使用另一种写法 IEnumerable<Customer&g

java中lamda表达式的应用

lamda表达式主要是为了解决匿名内部类的繁琐过程 范例:简单的lamda表达式 此处使用匿名内部类 package com.java.demo; interface IMessage{ public void print();//抽象方法 } public class TestDemo{ public static void main(String args[]){ //使用给匿名内部类实现print()方法 fun(new IMessage(){ public void print(){ S

什么是lamda表达式?

我们首先来看一下这一片代码: 1 class Solution { 2 public: 3 int singleNumber(int A[], int n) { 4 // Note: The Solution object is instantiated only once and is reused by each test case. 5 int retval = 0; 6 for_each(A, A+n, [&retval](int val){retval ^= val;}); 7 ret

C#中委托,匿名函数,lamda表达式复习

一.委托 1.就给类比较,类用class声明,委托用delegate声明. 2.委托要指向一个真正的方法. 3.委托的签名,要和指向的方法一样. //1.声明一个委托 public delegate void DelSayHi(string name); public static void SayHiChinese(string name) { Console.WriteLine("你好?" + name); } public static void SayHiEnglish(str