C++20 中 `constexpr` 的強大擴展:算法、工具與復數庫的變革

文章目錄

    • 一、`constexpr` 在 `<algorithm>` 中的應用
      • 1. 編譯時排序
      • 2. 編譯時查找
    • 二、`constexpr` 在 `<utility>` 中的應用
      • 1. 編譯時交換
      • 2. 編譯時條件交換
    • 三、`constexpr` 在 `<complex>` 中的應用
      • 1. 編譯時復數運算
    • 四、總結

C++20 對 constexpr 的增強是其最引人注目的特性之一,它極大地擴展了編譯時計算的能力。這一特性不僅提升了代碼的性能,還為開發者提供了更靈活的編程方式。本文將重點探討 C++20 中 constexpr<algorithm><utility><complex> 頭文件中的應用,以及它們如何改變我們的編程方式。

一、constexpr<algorithm> 中的應用

在 C++20 之前,<algorithm> 中的大多數函數(如 std::sortstd::find_if 等)只能在運行時執行。C++20 將這些函數標記為 constexpr,這意味著它們可以在編譯時完成計算,從而減少運行時的開銷。

1. 編譯時排序

constexpr int maxElement() {std::vector<int> myVec{1, 4, 5, 7, 23, 4};std::sort(myVec.begin(), myVec.end());return myVec.back();
}

在上述代碼中,std::sort 被標記為 constexpr,因此可以在編譯時對 myVec 進行排序,并返回最大值。

2. 編譯時查找

std::find_if 也支持 constexpr,允許在編譯時對容器進行查找操作。例如:

constexpr int findValue() {std::vector<int> myVec{1, 2, 3, 4, 5};auto it = std::find_if(myVec.begin(), myVec.end(), [](int x) { return x > 3; });return it != myVec.end() ? *it : -1;
}

這段代碼在編譯時查找第一個大于 3 的元素,并返回其值。

二、constexpr<utility> 中的應用

<utility> 頭文件中包含了許多工具函數,如 std::swapstd::exchange 等。在 C++20 中,這些函數也被標記為 constexpr,從而可以在編譯時執行。

1. 編譯時交換

constexpr int swapExample() {int a = 1, b = 2;std::swap(a, b);return a + b;
}

在上述代碼中,std::swap 在編譯時交換了 ab 的值。

2. 編譯時條件交換

std::exchange 也支持 constexpr,允許在編譯時進行條件交換操作。例如:

constexpr int exchangeExample() {int a = 1, b = 2;a = std::exchange(b, a + b);return a + b;
}

這段代碼在編譯時將 b 的值賦給 a,并將 a + b 的值賦給 b

三、constexpr<complex> 中的應用

<complex> 頭文件中的復數類 std::complex 現在也支持 constexpr。這意味著可以在編譯時創建和操作復數對象。

1. 編譯時復數運算

constexpr std::complex<double> complexExample() {std::complex<double> c1(1.0, 2.0);std::complex<double> c2(3.0, 4.0);return c1 + c2;
}

在上述代碼中,std::complex 的構造函數和加法運算符都被標記為 constexpr,因此可以在編譯時完成復數的創建和加法運算。

四、總結

C++20 中 constexpr 的增強為 <algorithm><utility><complex> 等頭文件中的函數和類提供了編譯時計算的能力。這不僅提高了代碼的性能,還使得開發者可以在編譯時完成更復雜的邏輯。通過利用這些特性,我們可以編寫出更高效、更安全的代碼,同時減少運行時的開銷。

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

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

相關文章

【ELK】節省存儲 之 壓縮存儲方式調整

目錄 集群版本&#xff1a; 7.17.6 解釋幾個概念&#xff1a; 段&#xff08;Segment&#xff09; 合并(Merge) 索引設置&#xff1a; 壓縮方式(index.codec)&#xff1a; 測試設置前提條件 對比 在創建的時候指定壓縮類型&#xff08;index.codec&#xff09; 對比 在…

conda create之后,以前的conda env list 只能看到環境路徑 沒有環境名稱了

1.命令 conda env list 看到的顯示如下&#xff1a; 左邊這列的"base"&#xff0c;指向的路徑和其它環境變量安裝的路徑不一致。 這時需要通過"activate [anaconda的環境路徑]"和"source activate"回到anaconda&#xff1a; 2.執行切換命令 …

夸克網盤任務腳本——進階自動版

腳本是用于自動管理和更新夸克云盤(Quark Cloud Drive)上的文件和目錄的Python腳本。其主要功能包括自動下載、更新、重命名、刪除文件和文件夾,以及處理和發送通知,可以在特定的時間間隔內運行,根據配置文件進行操作。 主要功能 1. Quark 類: __init__:初始化類,設置…

AsyncHttpClient使用說明書

[[toc]] AsyncHttpClient(AHC)是一個高性能、異步的 HTTP 客戶端庫,廣泛用于 Java 和 Scala 應用中,特別適合處理高并發、非阻塞的 HTTP 請求。它基于 Netty 或 Java 原生的異步 HTTP 客戶端實現,支持 HTTP/1.1 和 HTTP/2 協議,適用于微服務、API 調用、爬蟲等場景。 1.…

Powershell、Windows Shell、CMD 的區別與聯系

Powershell、Windows Shell、CMD 的區別與聯系 一、核心概念 名稱 全稱 類型 發布時間 CMD Command Prompt 命令行解釋器&#xff08;CLI&#xff09; 1985&#xff08;DOS&#xff09; Powershell Windows PowerShell 任務自動化腳本環境 2006 Windows Shell Wi…

vulnhub-Tr0ll ssh爆破、wireshark流量分析,exp、尋找flag。思維導圖帶你清晰拿到所以flag

vulnhub-Tr0ll ssh爆破、wireshark流量分析&#xff0c;exp、尋找flag。思維導圖帶你清晰拿到所以flag 1、主機發現 arp-scan -l 2、端口掃描 nmap -sS -sV 192.168.66.185 nmap -sS -A -T4 -p- 192.168.66.185 nmap --scriptvuln 192.168.66.185經典掃描三件套&#xff0c;…

強化學習(趙世鈺版)-學習筆記(8.值函數方法)

本章是算法與方法的第四章&#xff0c;是TD算法的拓展&#xff0c;本質上是將狀態值與行為值的表征方式&#xff0c;從離散的表格形式&#xff0c;拓展到了連續的函數形式。 表格形式的優點是直觀&#xff0c;便于分析&#xff0c;缺點是數據量較大或者連續性狀態或者行為空間時…

[特殊字符] 2025藍橋杯備賽Day7——B2117 整理藥名

&#x1f50d; 2025藍橋杯備賽Day7——B2117 整理藥名 題目難度&#xff1a;?? 適合掌握字符串基礎操作 考察重點&#xff1a;大小寫轉換、字符串遍歷、邊界條件處理 B2117 整理藥名 題目描述 醫生在書寫藥品名的時候經常不注意大小寫&#xff0c;格式比較混亂。現要求你…

笛卡爾軌跡規劃之齊次變換矩陣與歐拉角、四元數的轉化

一、笛卡爾軌跡規劃需求 笛卡爾軌跡規劃本質就是我們對機械臂的末端位置和姿態進行規劃&#xff0c;其實也就是對末端坐標系的位姿進行規劃。我們清楚末端坐標系的位姿是可以用齊次變換矩陣T來表示的&#xff0c;但這樣表示的話&#xff0c;并不利于我們去做規劃&#xff0c;所…

【PCIe 總線及設備入門學習專欄 3.1 -- PCIe 中為何只有 TLP 會被 Switch 和 RC 進行路由?】

文章目錄 Overview為什么 DLLP 不需要路由呢?總結Overview 這里介紹些為什么在 PCIe 中只有 TLP(事務層數據包)會被 Switch 和 Root Complex(RC) 路由,而 DLLP(數據鏈路層數據包)和 Ordered Set 不會被路由。這是因為 TLP 起始于源端口的事務層,結束于目的端口的事務…

大摩閉門會:250321 學習總結報告

如果圖片分辨率不足&#xff0c;可右鍵圖片在新標簽打開圖片或者下載末尾源文件進行查看 本文只是針對視頻做相應學術記錄&#xff0c;進行學習討論使用

深入理解 Spring Boot 應用的生命周期:從啟動到關閉的全流程解析

引言 Spring Boot 是當今 Java 開發中最流行的框架之一&#xff0c;它以簡化配置和快速開發著稱。然而&#xff0c;要真正掌握 Spring Boot&#xff0c;理解其應用的生命周期是至關重要的。本文將深入探討 Spring Boot 應用的生命周期&#xff0c;從啟動到關閉的各個階段&…

期刊分區表2025年名單下載(經濟學、管理學)

2025年期刊分區表包括SCIE、SSCI、A&HCI、ESCI和OAJ&#xff0c;共設置了包括自然科學、社會科學和人文科學在內的21個大類 本次分享的是期刊分區表2025年名單經濟學類、管理學類&#xff0c;一共7631025條 一、數據介紹 數據名稱&#xff1a;期刊分區表2025年名單 數據…

夢回杭州...

她對我說&#xff0c;煙雨中的西湖更別有情趣&#xff0c;我也懷著對‘人間天堂’的憧憬踏上了向往之旅。第一次親密接觸沒有感覺中那么好&#xff0c;現在想起來是那時的人和心情都沒能安靜下來&#xff0c;去慢慢品味它的美。 六下杭州&#xff0c;親歷每一片風景&#xff0c…

深度優先搜索(DFS)完全解析:從原理到 Java 實戰

深度優先搜索&#xff08;DFS&#xff09;完全解析&#xff1a;從原理到 Java 實戰 TOC 作為一名程序員&#xff0c;你是否遇到過需要在復雜的圖結構中尋找路徑、檢測環&#xff0c;或者進行樹遍歷的問題&#xff1f;深度優先搜索&#xff08;Depth-First Search, DFS&#xf…

【人工智能】如何理解transformer中的token?

如何理解transformer中的token? **一、Token在Transformer中的作用****二、文本分詞的常見方法****1. 基于詞典的分詞&#xff08;Dictionary-based Tokenization&#xff09;****2. 子詞分詞&#xff08;Subword Tokenization&#xff09;****(1) WordPiece算法****(2) BPE&a…

AI風向標《AI與視頻制作全攻略:從入門到精通實戰課程》

課程信息 AI風向標《AI與視頻制作全攻略&#xff1a;從入門到精通實戰課程》,夸克網盤和百度網盤課程。 課程介紹 《AI與視頻制作全攻略&#xff1a;從入門到精通實戰課程》是一套全面融合AI技術與視頻制作的實戰課程&#xff0c;旨在幫助創作者從基礎軟件使用到高級視頻剪輯…

mayfly-go開源的一站式 Web 管理平臺

mayfly-go 是一款開源的一站式 Web 管理平臺&#xff0c;旨在通過統一的界面簡化 Linux 服務器、數據庫&#xff08;如 MySQL、PostgreSQL、Redis、MongoDB 等&#xff09;的運維管理。以下從多個維度對其核心特性、技術架構、應用場景及生態進行詳細解析&#xff1a; 一、核心…

車輛模型——運動學模型

文章目錄 約束及系統移動機器人運動學模型&#xff08;Kinematic Model&#xff09;自行車模型含有加速度 a a a 的自行車模型系統偏差模型 在機器人的研究領域中&#xff0c;移動機器人的系統建模與分析是極為關鍵的基礎環節&#xff0c;本文以非完整約束的輪式移動機器人為研…

go命令使用

查看配置信息 go env配置go國內源 export GO111MODULEon export GOPROXYhttps://goproxy.cn測試 go install github.com/jesseduffield/lazydockerlatesthttps://github.com/jesseduffield/lazydocker