Functional C++ for Fun Profit

Lambda Conf上有人講C++函數式編程。

在Functional Conf 2019上,就有主題為“Lambdas: The Functional Programming Companion of Modern C++”的演講。

演講者介紹了現代C++中函數式編程相關內容,講解了如何使用Lambda表達式編寫符合函數式編程原則的C++代碼,以及C++語言的演變等內容。

NDC Conferences上也有相關演講,主題為“Functional C++ for Fun & Profit”。

演講探討了函數式編程與C++的交集,從C++11中Lambda表達式的引入開始,研究了函數式編程的核心原則,以及如何在C++開發中有效應用這些原則。

?

函數式編程

?

函數式編程是一種編程范式,核心思想是將計算過程視為數學函數的組合,強調函數的純粹性和數據的不可變性,避免副作用(如修改外部狀態、改變變量值等)。

特點包括:

- 不可變數據:數據一旦創建就不能被修改,若需變更,需生成新的數據副本,減少狀態混亂。


- 純函數:輸入決定輸出,不依賴外部狀態,也不產生副作用(如修改全局變量、IO操作等),相同輸入始終返回相同結果,便于測試和并行計算。


- 函數是一等公民:函數可以像變量一樣被傳遞、賦值、作為參數或返回值,支持高階函數(如接收或返回其他函數)。


- 避免狀態變化:通過函數組合而非循環或狀態修改來實現邏輯,常用遞歸代替迭代。

例如,在處理列表時,函數式編程會用?map?(映射)、?filter?(過濾)等純函數組合操作,而非通過循環修改列表元素。

常見的函數式編程語言有Haskell、Scala、Erlang等,現代主流語言(如Java、C++、Python)也逐漸引入了函數式特性(如Lambda表達式、不可變集合)。

?

代碼示例

?

用現代C++特性(Lambda、算法庫)處理數據,體現“用函數組合實現邏輯”“避免修改狀態”的特點:

#include <iostream>
#include <vector>
#include <algorithm> // 提供函數式算法
#include <numeric> ? // 提供accumulate

int main() {
// 原始數據(不可修改,體現不可變性)
const std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

? ? // 1. 過濾:保留偶數(用lambda作為篩選條件)
std::vector<int> evens;
std::copy_if(numbers.begin(), numbers.end(),?
std::back_inserter(evens),
[](int n) { return n % 2 == 0; }); // 純函數:輸入決定輸出

? ? // 2. 轉換:偶數乘以2(用lambda映射)
std::vector<int> doubled;
std::transform(evens.begin(), evens.end(),
std::back_inserter(doubled),
[](int n) { return n * 2; }); // 無副作用的轉換

? ? // 3. 聚合:計算總和(用accumulate組合結果)
int sum = std::accumulate(doubled.begin(), doubled.end(),
0, // 初始值
[](int total, int n) { return total + n; });

? ? // 輸出結果:2+4+6+8+10的兩倍之和 → (2+4+6+8+10)*2 = 60
std::cout << "結果: " << sum << std::endl; // 僅此處有副作用(IO)
return 0;
}


函數式特點說明:

- 不可變數據:?numbers?被聲明為?const?,全程不修改原始數據。
- 純函數:所有Lambda表達式(如?n%2==0?、?n*2?)都只依賴輸入,無外部狀態。


- 函數作為參數:?copy_if?、?transform?等算法接收Lambda函數作為參數,體現“函數是一等公民”。


- 無顯式循環:用標準庫算法替代?for?循環,邏輯更接近“做什么”而非“怎么做”。

運行結果為?60?,整個過程通過函數組合完成數據處理,避免了手動修改變量狀態。

?


優缺點

?

好處

?

1.?代碼更易理解和維護

純函數無副作用,邏輯獨立,相同輸入始終返回相同結果,代碼意圖更清晰,減少了因狀態變化導致的“隱藏邏輯”。

2.?天然支持并發和并行

不可變數據避免了多線程中的“資源競爭”(無需加鎖),純函數可安全地在多線程中并行執行,適合分布式和高性能場景。

3.?便于測試和調試

純函數不依賴外部狀態,單元測試時無需復雜的環境準備,只需驗證輸入輸出;調試時也無需追蹤變量的狀態變化歷史。

4.?代碼復用性強

函數作為“一等公民”可被靈活組合(如通過?map?/?filter?/?reduce?),形成新的功能,減少重復代碼。

5.?減少錯誤

不可變性避免了意外修改數據導致的bug(如“一個地方改了,別處跟著錯”),尤其在復雜系統中更明顯。

?

壞處

?

1.?學習曲線較陡

思維方式與常見的命令式編程(如用?for?循環、修改變量)差異大,理解遞歸、函數組合、Monad等概念需要時間。

2.?性能開銷可能更高

不可變數據每次修改需創建副本,對于大型數據(如大列表)可能增加內存占用和計算成本(盡管現代語言有優化)。

3.?處理IO等副作用時較繁瑣

純函數禁止IO(如讀寫文件、網絡請求),需通過特殊機制(如Haskell的IO Monad)封裝副作用,代碼可能更復雜。

4.?不適合所有場景

對于需要頻繁修改狀態的場景(如GUI交互、游戲幀更新),函數式的“不可變”思路可能反直覺,實現效率低。

5.?調試棧可能更復雜

大量函數組合和遞歸可能導致調用棧較深,調試時追蹤問題源頭相對麻煩。

?

總結

?

函數式編程適合復雜業務邏輯、高并發、分布式系統等場景,能提升代碼可靠性和可維護性;但在性能敏感、IO密集、狀態頻繁變化的場景中,可能不如命令式編程直接高效。現代主流語言(如C++、Python)多采用“混合范式”,兼顧兩者優勢。

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

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

相關文章

Python基礎理論與實踐:從零到爬蟲實戰

引言Python如輕舟&#xff0c;載你探尋數據寶藏&#xff01;本文從基礎理論&#xff08;變量、循環、函數、模塊&#xff09;啟航&#xff0c;結合requests和BeautifulSoup實戰爬取Quotes to Scrape&#xff0c;適合零基礎到進階者。文章聚焦Python基礎&#xff08;變量、循環、…

ThingJS開發從入門到精通:構建三維物聯網可視化應用的完整指南

文章目錄第一部分&#xff1a;ThingJS基礎入門第一章 ThingJS概述與技術架構1.1 ThingJS平臺簡介1.2 技術架構解析1.3 開發環境配置第二章 基礎概念與核心API2.1 核心對象模型2.2 場景創建與管理2.3 對象操作基礎第三章 基礎開發實戰3.1 第一個ThingJS應用3.2 事件系統詳解3.3 …

關于list

1、什么是listlist是一個帶頭結點的雙向循環鏈表模版容器&#xff0c;可以存放任意類型&#xff0c;需要顯式定義2、list的使用有了前面學習string和vector的基礎&#xff0c;學習和使用list會方便很多&#xff0c;因為大部分的內容依然是高度重合的。與順序表不同&#xff0c;…

Mysql 查看當前事務鎖

在 MySQL 中查看事務鎖&#xff08;鎖等待、鎖持有等&#xff09;&#xff0c;可以使用以下方法&#xff1a; 一、查看當前鎖等待情況&#xff08;推薦&#xff09; SELECTr.trx_id AS waiting_trx_id,r.trx_mysql_thread_id AS waiting_thread,r.trx_query AS waiting_query,b…

【Keil5-map文件】

Keil5-map文件■ map文件■ map文件

k8s 基本架構

基于Kubernetes(K8s)的核心設計&#xff0c;以下是其關鍵基本概念的詳細解析。這些概念構成了K8s容器編排系統的基石&#xff0c;用于自動化部署、擴展和管理容器化應用。### 一、K8s核心概念概覽 K8s的核心對象圍繞容器生命周期管理、資源調度和服務發現展開&#xff0c;主要包…

Bell不等式賦能機器學習:微算法科技MLGO一種基于量子糾纏的監督量子分類器訓練算法技術

近年來&#xff0c;量子計算&#xff08;Quantum Computing&#xff09; 和 機器學習&#xff08;Machine Learning&#xff09; 的融合成為人工智能和計算科學領域的重要研究方向。隨著經典計算機在某些復雜任務上接近計算極限&#xff0c;研究人員開始探索量子計算的獨特優勢…

Edge瀏覽器設置網頁自動翻譯

一.瀏覽網頁自動翻譯設置->擴展->獲取Microsoft Edge擴展->搜索“沉浸式翻譯”->獲取 。提示&#xff1a;如果采用其他的翻譯擴展沒找自動翻譯功能&#xff0c;所以這里選擇“沉浸式翻譯”二.基于Java WebElement時自動翻譯Java關鍵代碼&#xff1a;提示&#xff1…

TCP/UDP協議深度解析(四):TCP的粘包問題以及異常情況處理

&#x1f50d; 開發者資源導航 &#x1f50d;&#x1f3f7;? 博客主頁&#xff1a; 個人主頁&#x1f4da; 專欄訂閱&#xff1a; JavaEE全棧專欄 本系列往期內容~ TCP/UDP協議深度解析&#xff08;一&#xff09;&#xff1a;UDP特性與TCP確認應答以及重傳機制 TCP/UDP協議深…

R 基礎語法

R 基礎語法 R 語言是一種針對統計計算和圖形表示而設計的編程語言&#xff0c;廣泛應用于數據分析、統計學習、生物信息學等領域。本文將為您介紹 R 語言的基礎語法&#xff0c;幫助您快速入門。 1. R 語言環境搭建 在開始學習 R 語言之前&#xff0c;您需要安裝并配置 R 語言環…

語義熵怎么增強LLM自信心的

語義熵怎么增強LLM自信心的 一、傳統Token熵的問題(先理解“痛點”) 比如模型回答“阿司匹林是否治療頭痛?”→ 輸出“是” 傳統Token熵:只看“詞的概率”,比如“是”這個詞的概率特別高(Token熵0.2,數值低說明確定性強 )。 但實際風險:醫學場景里,“是”的字面肯定…

javaweb的幾大常見漏洞

CTF javaweb中幾大常見漏洞(基于java-security靶場) 對于CTF而言&#xff0c;java類型的題目基本都是白盒代碼審計&#xff0c;在java類型的web題目增長的今天&#xff0c;java代碼審計能力在ctf比賽中尤為重要。 這篇博客主要是給大家介紹一下一些常見漏洞在java代碼里面大概是…

【設計模式C#】外觀模式(用于解決客戶端對系統的許多類進行頻繁溝通)

一種結構性設計模式。特點是將復雜的子系統調用邏輯封裝到一個外觀類&#xff0c;從而使客戶端更容易與系統交互。優點&#xff1a;簡化了接口的調用&#xff1b;降低了客戶端與子系統的耦合度&#xff1b;封裝了子系統的邏輯。缺點&#xff1a;引入了額外的類&#xff0c;可能…

【PTA數據結構 | C語言版】二叉堆的快速建堆操作

本專欄持續輸出數據結構題目集&#xff0c;歡迎訂閱。 文章目錄題目代碼題目 請編寫程序&#xff0c;將 n 個順序存儲的數據用快速建堆操作調整為最小堆&#xff1b;最后順次輸出堆中元素以檢驗操作的正確性。 輸入格式&#xff1a; 輸入首先給出一個正整數 c&#xff08;≤1…

【數據結構初階】--雙向鏈表(二)

&#x1f525;個人主頁&#xff1a;草莓熊Lotso &#x1f3ac;作者簡介&#xff1a;C研發方向學習者 &#x1f4d6;個人專欄&#xff1a; 《C語言》 《數據結構與算法》《C語言刷題集》《Leetcode刷題指南》 ??人生格言&#xff1a;生活是默默的堅持&#xff0c;毅力是永久的…

vue-cli 模式下安裝 uni-ui

目錄 easycom 自定義easycom配置的示例 npm安裝 uni-ui 準備 sass 安裝 uni-ui 注意 easycom 傳統vue組件&#xff0c;需要安裝、引用、注冊&#xff0c;三個步驟后才能使用組件。easycom將其精簡為一步。 只要組件路徑符合規范&#xff08;具體見下&#xff09;&#…

JavaSE-接口

概念在Java中&#xff0c;接口可以被看成是一種公共規范&#xff0c;是一種引用數據類型。語法1.接口的定義格式與類的定義格式基本相同&#xff0c;將class關鍵字替換為interface關鍵字&#xff1a;public interface IShape {}2.類與接口之間使用implements關鍵字來實現接口&a…

常用類學習

文章目錄字符串相關的類String的特性String對象的創建字符串相關的類String類與其他結構之間的轉換StringBuffer,StringBuilderStringBuffer類的常用方法JDK8之前日期時間APIjava.lang.System類java.util.Date類java.text.SimpleDateFormat類java.util.Calendar類JDK8中新日期時…

【Python庫包】Gurobi-Optimize (求解 MIP) 安裝

目錄Step1&#xff1a;注冊賬號Step2&#xff1a;獲取Licence另&#xff1a;完整安裝 Gurobi軟件參考本博客簡介Gurobi-Optimizer的安裝&#xff08;Python 環境&#xff09;。 Step1&#xff1a;注冊賬號 官網-Gurobi-Optimizer ??注意&#xff1a; Gurobi 是商業軟件&…

【滲透測試】NmapScanHelper 掃描輔助工具

目錄NmapScanHelper 掃描輔助工具一、功能特性二、文件說明三、使用方法1. 安裝依賴macOSUbuntu/DebianCentOS/RHEL2. 配置網段3. 運行掃描基本用法常用端口掃描示例掃描模式特殊環境模式選擇性掃描自定義文件4. 查看結果四、掃描模式說明標準模式特殊環境模式五、支持的 Nmap …