c++ lambda函數_C++11 之 lambda函數的詳細使用


1. lambda 函數概述

lambda 表達式是一種匿名函數,即沒有函數名的函數;該匿名函數是由數學中的λ演算而來的。通常情況下,lambda函數的語法定義為:
[capture] (parameters) mutable ->return-type {statement}
其中:
[capture] :捕捉列表。捕捉列表總是作為lambda的開始,即出現于lambda的開始處。它是lambda的引出符(即開始標志)。編譯器可以根據該“標志”來作出判斷出該函數是否為lambda函數。同時“捕捉列表”能夠捕捉上下文中的變量以作為lambda函數使用。


(parameters):參數列表。和C/C++中的普通函數參數意義一樣。該部分是可選的,意味著如果我們不需要進行參數傳遞時,可以連同括號“()”一起省略掉。


mutable:該關鍵字為一個修飾符。在默認的情況下,lambda函數總是返回一個const,而當我們在參數列表后面注明了“mutable”關鍵字之后,則可以取消其常量性質。若在lambda中使用了mutable修飾符,則“參數列表”是不可省略掉的(即使是參數為空)。


->return-type: 函數的返回值類型。和C/C++中的普通函數返回值類型的性質一樣。主要目的是用來追蹤lambda函數(有返回值情況下)的返回類型。若lambda函數不需要返回值,則可以直接將這部分省略掉。


{statement}:函數體。在該函數體中,除了可以使用參數列表中的變量外,還可以使用所有捕獲到的變量(即[capture] 中的變量)。
見下圖:

99c09ff79a9e37d5962b70c7cb9700c8.png

1.1. lambda 函數中“捕捉列表”詳解

C++11中的lambda函數,其中的“捕捉列表”是由0個或多個“捕捉項”組成,并以逗號“,”分隔。捕捉列表有如下幾種形式:
(1)[var] 表示值傳遞方式捕捉變量var。

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int main()
{int a = 1,b =2, c =3;auto retVal = [=,&a,&b](){printf("inner c[%d]n",c);a = 10;b = 20;return a+b;};printf("sum[%d]n",retVal());printf("a[%d] b[%d] c[%d]n",a,b,c);return 0;
}打印結果:
inner c[3]
sum[30]
a[10] b[20] c[3]

上面的代碼中,“捕捉列表”由3項組成。以引用傳遞的方式捕捉變量a、b,以值傳遞的方式捕捉變量c。因此在lambda表達式的函數體中修改了變量a和b之后,父作用域中的a、b值也改變。而即使是在lambda函數內部修改了變量c的值,父作用域中的c仍然不會受到影響,因為是值傳遞的方式。(需在參數列表后面加上 mutable 關鍵字(修飾符))。同時

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int main()
{int a = 1,b =2, c =3;auto retVal = [=,&a,&b]() mutable->int{printf("inner c[%d]n",c);a = 10;b = 20;c = 30;printf("inner c2[%d]n",c);return a+b;};printf("sum[%d]n",retVal());printf("a[%d] b[%d] c[%d]n",a,b,c);return 0;
}打印結果:
inner c[3]
inner c2[30]
sum[30]
a[10] b[20] c[3]

(2)[=] 表示值傳遞方式捕捉所有父作用域的變量(包括this)。
(3)[&var] 表示引用傳遞捕捉變量var。
(4)[&] 表示引用傳遞捕捉所有父作用域的比哪里(2020-02-18 09:36:12 修改) 的變量(包括this)。

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int main()
{int a = 1,b =2, c =3;auto retVal = [&]() mutable->int{printf("inner a[%d] b[%d] c[%d]n",a,b,c);a = 10;b = 20;c = 30;return a+b;};printf("sum[%d]n",retVal());printf("a[%d] b[%d] c[%d]n",a,b,c);return 0;
}打印結果:
inner a[1] b[2] c[3]
sum[30]
a[10] b[20] c[30]

(5)[this] 表示值傳遞方式捕捉當前的this指針。

同理(2),(3),(5)可以參考上面的兩個例子。

2. lambda 函數特點

(1)在C++11中,lambda函數是inline(內聯函數)。

3. lambda 函數使用

代碼一

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int main()
{int a = 6;int b = 8;auto sum = [](int a,int b) ->int{return a + b;};printf("sum[%d]n",sum(a,b));return 0;
}//打印結果:sum[14]

在代碼一中,定義了一個簡單的lambda函數,該函數的函數列表能夠接收兩個int類型的數據,而且返回值為int類型。

注意:lambda函數中,參數列表和返回類型都是可選的部分,而且捕捉列表和函數也可以為空。因此,在某種情況下,C++11中的簡略版本的lambda函數可以是這樣的:

// 完整語法
[ capture-list ] ( params ) mutable(optional) constexpr(optional)(c++17) exception attribute -> ret { body } // 可選的簡化語法
[ capture-list ] ( params ) -> ret { body }     
[ capture-list ] ( params ) { body }

最為簡潔的版本如下, 多謝讀者「-兮」 的指正。已將[]()修改為了[]{}

[ capture-list ] { body }

代碼二
在C++開發中,

4. lambda 函數與 STL


更多技術干貨見個人微信公眾號: 雅俗不共賞 掃碼關注不迷路~

http://weixin.qq.com/r/NhIjOz-EnWLirXtY90ck (二維碼自動識別)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260455.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260455.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260455.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

zabbix監控 openstack 的實例的資源使用情況

領導提出的需求&#xff1a;在不給云主機安裝客戶端的情況下&#xff0c;監控云主機的 cpui 內存 網絡 io&#xff0c;并且能出圖。想了幾個方案&#xff1a;1、ceilometer取數據&#xff0c;存入mangodb&#xff0c;用zabbix來讀mangodb數據繪圖2 ceilometer 取數據 &#xff…

pytorch 正向與反向傳播的過程 獲取模型的梯度(gradient),并繪制梯度的直方圖

記錄一下怎樣pytorch框架下怎樣獲得模型的梯度 文章目錄引入所需要的庫一個簡單的函數模型梯度獲取先定義一個model如下定義兩個獲取梯度的函數定義一些過程與調用上述函數的方法可視化一下梯度的histogram引入所需要的庫 import os import torch import torch.nn as nn impor…

2012-9

響應式設計的典范 http://www.bostonglobe.com/ 網站測試頁面 http://www.webpagetest.org/ 編程算法 http://blog.sina.com.cn/s/articlelist_1647038822_1_1.html C Programmers Cookbook http://www.cppblog.com/mzty/category/7609.html Blade 是一個現代構建系統&#xff…

PV操作 (轉載)

PV操作與信號量的處理相關&#xff0c;P表示通過的意思&#xff0c;V表示釋放的意思。信號量是最早出現的用來解決進程同步與互斥問題的機制&#xff0c;包括一個稱為信號量的變量及對它進行的兩個原語操作。 信號量&#xff08;semaphore&#xff09;的數據結構為一個值和一個…

ubuntu升級python_Ubuntu 升級python3為更高版本【已實測】

2020-04-13 更新安裝步驟&#xff1a; 1. 先update一下 sudo apt update 2. 安裝依賴庫 sudo apt-get install zlib1g-dev libbz2-dev libssl-dev libncurses5-dev libsqlite3-dev libreadline-dev tk-dev libgdbm-dev libdb-dev libpcap-dev xz-utils libexpat1-dev liblzma-d…

mysql5.0 java連接_Java連接mysql5.0

網上的資料真爛&#xff0c;千篇一律的拷貝的&#xff0c;根本不能用&#xff0c;鄙視&#xff01; 正題&#xff1a; 到MYSQL網站下載mysql-connector-java-5.0.4.zip文件&#xff0c;解壓&#xff1b; 解壓后有一個文件&#xff1a;mysql-connector-java-5.0.4-bin.jar 把這個…

Framework打包

2019獨角獸企業重金招聘Python工程師標準>>> iOS app需要在許多不同的CPU架構下運行&#xff1a; arm7: 在最老的支持iOS7的設備上使用 arm7s: 在iPhone5和5C上使用 arm64: 運行于iPhone5S的64位 ARM 處理器 上 i386: 32位模擬器上使用 x86_64: 64為模擬器上使用…

windows 10 下利用WSL的Linux環境實現vscode C/C++環境的配置

本文主要結合二個工具&#xff0c;介紹如何在windows搭建Linux開發環境&#xff1a; WSL(Windows Subsystem for Linux)VSCode(Visual Studio Code) 文章目錄WSL安裝VSCode安裝配置Linux下的C/C環境1. 打開WSL的控制臺2. 更新ubuntu軟件3. 安裝GCC和GDB4. 配置VSCode(1). 打開…

java類初始化順序

轉自&#xff1a;http://zangweiren.iteye.com/blog/208122 對于靜態變量、靜態初始化塊、變量、初始化塊、構造器&#xff0c;它們的初始化順序以此是&#xff08;靜態變量、靜態初始化塊&#xff09;>&#xff08;變量、初始化塊&#xff09;>構造器。我們也可以通過下…

Java 8 - Interface Default Method接口默認方法

Java 8 相比于Java 7 推出了幾大特色&#xff08;features&#xff09;(接口默認方法)default methods in interface, &#xff08;接口靜態方法&#xff09;static method in interface, 函數編程(functional programming)&#xff0c; lamda expression, stream API.這里首先…

Windows 11下 WSL使用 jupyter notebook

這里寫目錄標題前言在WSL下的配置測試運行更優雅的啟動方法配置jupyter生成默認配置文件生成秘鑰修改配置文件nohup啟動前言 一直都使用jupyter notebook&#xff0c;不管做數據分析&#xff0c;還是調試代碼&#xff0c;還有寫文章都是。但是好像在WSL下又不好使。看了網上有…

sql2000導出mysql_如何將sql2000的數據庫導入到mysql中?

展開全部先用SQl2000導出e68a843231313335323631343130323136353331333262373366文本文件&#xff0c;把后綴名改為CSv&#xff0c;再從Mysql中一導入OK參考&#xff1a;第一種是安裝mysql ODBC&#xff0c;利用sql server的導出功能&#xff0c;選擇mysql數據源&#xff0c;進…

實現日、周、月排行統計 sql

在如今很多系統中&#xff0c;都需要進行日、周、月排行統計&#xff0c;但是在網上尋找 了一番&#xff0c;發現很多都是相對的周、月排行&#xff0c;即周排行則用當前時間減去7天。這樣我個人認為并不恰當。如月排行中&#xff0c;假設今天是4月22日,則從3月22日至4月22日之…

產品運行所需的信息檢索失敗_為服務業注入新活力,華北工控推出服務機器人專用計算機產品方案...

近年來&#xff0c;隨著人口老齡化趨勢加快和信息科技革命的持續推進&#xff0c;服務機器人已經被當作社會勞動力的一部分在醫療、教育、餐飲等行業廣泛應用&#xff0c;市場潛力巨大。01、需求帶動消費&#xff0c;科技改變服務服務機器人是國內智能機器人產業發展最快的分支…

Windows更新沒有更新提示:從windows 10升級到Windows 11,并WSL下配置cuda

文章目錄從windows 10 升級到Windows 11安裝WSL的安裝配置cuda從windows 10 升級到Windows 11 升級的方法有很多種&#xff0c;各大網站都有。有更新提示的按更新提示操作即可。我的是一直都沒有更新提示&#xff0c;也搜索過網上的一些方法&#xff0c;但都不行。還是沒法更新…

js修改css樣式屬性_這個筆記《CSS樣式的常見屬性及值》,讓菜鳥輕松學會包粽子...

常見樣式屬性及值字體:font-family-size-style: normal(正常)|italic(傾斜)|oblique-weight: normal|bold(粗體)如果組合起來編寫: font: style weight size family字體大小的單位可以是 px, em, rem, pt, cm, mm, in, pc文本:colortext-align(水平對齊方式): left|center|righ…

7.java.lang.IllegalAccessException

java.lang.IllegalAccessException 沒有訪問權限 當應用程序要調用一個類&#xff0c;但當前的方法即沒有對該類的訪問權限便會出現這個異常。對程序中用了Package的情況下要注意這個異常

在 VirtualBox 中 CentOS 網絡設置

轉自&#xff1a;本文發表于水景一頁。永久鏈接&#xff1a;<http://cnzhx.net/blog/minimal-centos-in-virtualbox/>。轉載請保留此信息及相應鏈接。 4. 設置 按照上面的方法安裝之后&#xff0c;還需要一些簡單的設置&#xff0c;比如網絡訪問。然后既然是做網頁服務器…

mysql 熱塊_mysql 優化

數據庫層面&#xff1a;應用系統層面優化SQL優化SQL優化一般通過分析慢查詢日志來抓取長事務高消耗的sql&#xff0c;通過結合具體業務&#xff0c;對sql邏輯進行分析and精簡&#xff0c;or重寫sql。通過配置slow_query_log1和log_queries_not_using_indexes1啟動慢查詢日志記錄…

vscode C++ 分文件、文件夾編譯配置與錯誤解決

文章目錄問題includesourceout配置過程遇到的問題與解決遇到的問題1解決步驟1. ctrl shift p2. 配置json文件修改task.json文件修改launch.json可能遇到的錯誤1. collect2: error: ld returned 1 exit status2. /mnt/d/tmp/c/source/add.cpp:3:10: fatal error: add.h: No su…