C++中Ranges庫的基本用法,如何簡化和增強對集合的操作。

Ranges庫的基本用法

什么是Ranges庫?

C++20引入的Ranges庫(<ranges>)是一個強大的工具集,旨在簡化和增強對集合(如數組、向量等序列容器)的操作。它提供了一套用于操作序列的功能性接口,使得代碼更具可讀性和表達力。

Ranges庫的核心組件

  1. Views(視圖):可以看作是懶惰求值的序列操作,它們不改變底層容器,而是提供一種延遲計算的方式,直到實際需要結果時才執行計算。
  2. Actions(動作):類似于視圖,但它們是即時操作,會直接改變底層數據。
  3. Adaptors(適配器):用于將基本操作組合起來,生成復雜的操作序列。
  4. Range Factories(范圍工廠):用于生成新的范圍,例如std::views::iota可以生成一個從某個起點到終點的數值序列。

基本用法

1. 視圖(Views)

視圖是一種懶惰的、非變更性的操作,允許對序列進行篩選、轉換和組合。常見的視圖包括:

  • std::views::filter:過濾視圖,根據給定的條件過濾序列中的元素。
  • std::views::transform:變換視圖,對序列中的每個元素應用一個變換函數。
示例:過濾和轉換
#include <iostream>
#include <vector>
#include <ranges>int main() {std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};// 使用filter視圖過濾出偶數auto even_numbers = numbers | std::views::filter([](int n) { return n % 2 == 0; });// 使用transform視圖將每個數平方auto squared_numbers = even_numbers | std::views::transform([](int n) { return n * n; });// 輸出結果for (int n : squared_numbers) {std::cout << n << " ";}return 0;
}

在這個示例中,even_numbers視圖過濾出了偶數,squared_numbers視圖將每個偶數平方。最終輸出結果是過濾和轉換后的序列。

2. 動作(Actions)

動作是即時執行的操作,會直接改變序列內容。在標準庫中,動作的支持較少,通常需要使用第三方庫(如Range-v3)才能看到完整的動作集合。

示例:排序和去重
#include <iostream>
#include <vector>
#include <ranges>
#include <algorithm>int main() {std::vector<int> numbers = {4, 2, 5, 1, 3, 2, 4, 5};// 使用std::ranges::sort進行排序std::ranges::sort(numbers);// 使用std::ranges::unique去重auto end_it = std::ranges::unique(numbers);numbers.erase(end_it.begin(), numbers.end());// 輸出結果for (int n : numbers) {std::cout << n << " ";}return 0;
}

在這個示例中,std::ranges::sort對序列進行了排序,而std::ranges::unique則移除了重復的元素。

3. 適配器(Adaptors)

適配器是組合多個操作的工具。例如,我們可以將過濾和轉換操作組合成一個適配器。

示例:組合過濾和轉換
#include <iostream>
#include <vector>
#include <ranges>int main() {std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};// 組合過濾和轉換操作auto even_squared = numbers | std::views::filter([](int n) { return n % 2 == 0; })| std::views::transform([](int n) { return n * n; });// 輸出結果for (int n : even_squared) {std::cout << n << " ";}return 0;
}

在這個示例中,我們將過濾和轉換操作組合成了一個視圖適配器,這使得代碼更簡潔。

4. 范圍工廠(Range Factories)

范圍工廠可以生成新的范圍。例如,std::views::iota可以生成一個從起點到終點的數值序列。

示例:生成數值范圍
#include <iostream>
#include <ranges>int main() {// 使用std::views::iota生成一個從0到9的序列auto numbers = std::views::iota(0, 10);// 輸出結果for (int n : numbers) {std::cout << n << " ";}return 0;
}

這個示例中,std::views::iota生成了一個從0到9的數值序列。

Ranges庫的優勢

  1. 代碼簡潔:通過使用視圖和適配器,代碼可以更簡潔地表達復雜的操作。
  2. 懶惰求值:視圖操作是惰性求值的,只有在實際需要結果時才會進行計算,這可以提高性能,尤其是在處理大型數據集時。
  3. 更高的表達力:Ranges庫的操作更具表達力,能更直觀地表達數據操作的意圖。
  4. 組合性:操作可以通過適配器進行組合,簡化了復雜的操作鏈。

通過C++20的Ranges庫,我們能夠更加優雅和高效地處理集合操作,使得代碼更加清晰、易讀和易于維護。

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

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

相關文章

獨立站新風口:TikTok達人帶貨背后的雙贏合作之道

TikTok以其龐大的用戶基礎、高度互動性和創新的內容形式&#xff0c;為獨立站帶來了前所未有的發展機遇。獨立站與TikTok達人的合作&#xff0c;不僅能夠幫助獨立站快速提升品牌知名度和銷售額&#xff0c;還能為TikTok達人帶來更多商業機會和影響力。本文Nox聚星將和大家探討獨…

Android sdk 安裝已經環境配置

&#x1f34e;個人博客&#xff1a;個人主頁 &#x1f3c6;個人專欄&#xff1a;Android ?? 功不唐捐&#xff0c;玉汝于成 目錄 正文 一、下載 二、安裝 三、環境配置 我的其他博客 正文 一、下載 1、大家可去官網下載 因為需要魔法 所以就不展示了 2、去下面這…

經典shell運維實用腳本~

以下腳本可謂日常工作常用到的經典腳本案例。希望可以幫助大家提升提升自動化能力&#xff01; 1、監控100臺服務器磁盤利用率腳本 #!/bin/bashHOST_INFOhost.infofor IP in $(awk /^[^#]/{print $1} $HOST_INFO); do USER$(awk -v ip$IP ip$1{print $2} $HOST_INFO) P…

【JS】純web端使用ffmpeg實現的視頻編輯器-視頻合并

純前端實現的視頻合并 接上篇ffmpeg文章 【JS】純web端使用ffmpeg實現的視頻編輯器 這次主要添加了一個函數&#xff0c;實現了視頻合并的操作。 static mergeArgs(timelineList) {const cmd []console.log(時間軸數據,timelineList)console.log("文件1",this.readD…

常用目標檢測的格式轉換腳本文件txt,json等

常用目標檢測的格式轉換腳本文件txt,json等 文章目錄 常用目標檢測的格式轉換腳本文件txt,json等前言一、json格式轉yolo的txt格式二、yolov8的關鍵點labelme打的標簽json格式轉可訓練的txt格式三、yolo的目標檢測txt格式轉coco數據集標簽的json格式四、根據yolo的目標檢測訓練…

Vue+ElementUi實現錄音播放上傳及處理getUserMedia報錯問題

1.Vue安裝插件 npm install --registryhttps://registry.npmmirror.com 2.Vue頁面使用 <template><div class"app-container"><!-- header --><el-header class"procedureHeader" style"height: 20px;"><el-divid…

vue2 接口文檔

const assetmanagementIndex (params) > getAction("/asset/assetmanagementsystem/page", params); //資產管理制度表分頁列表 const assetmanagementPost (params) > postAction("/asset/assetmanagementsystem", params); //資產管理制度表新增…

維護Nginx千字經驗總結

Hello , 我是恒 。 維護putty和nginx兩個項目好久了&#xff0c;用面向底層的思路去接觸 在nginx社區的收獲不少&#xff0c;在這里談談我的感悟 Nginx的奪冠不是偶然 高速:一方面&#xff0c;在正常情況下&#xff0c;單次請求會得到更快的響應&#xff1b;另一方面&#xff0…

從零開始學量化~Ptrade使用教程——安裝與登錄

PTrade交易系統是一款高凈值和機構投資者專業投資軟件&#xff0c;為用戶提供普通交易、籃子交易、日內回轉交易、算法交易、量化投研/回測/實盤等各種交易工具&#xff0c;滿足用戶的各種交易需求和交易場景&#xff0c;幫助用戶提高交易效率。 運行環境及安裝 操作系統&…

昇思25天學習打卡營第3天 | 數據集 Dataset

數據是深度學習的基礎&#xff0c;高質量的數據輸入將在整個深度神經網絡中起到積極作用。MindSpore提供基于Pipeline的數據引擎&#xff0c;通過數據集&#xff08;Dataset&#xff09;和數據變換&#xff08;Transforms&#xff09;實現高效的數據預處理。其中Dataset是Pipel…

將數據切分成N份,采用NCCL異步通信,讓all_gather+matmul盡量Overlap

將數據切分成N份,采用NCCL異步通信,讓all_gathermatmul盡量Overlap 一.測試數據二.測試環境三.普通實現四.分塊實現 本文演示了如何將數據切分成N份,采用NCCL異步通信,讓all_gathermatmul盡量Overlap 一.測試數據 1.測試規模:8192*8192 world_size22.單算子:all_gather:0.035…

代理IP的10大誤區:區分事實與虛構

在當今的數字時代&#xff0c;代理已成為在線環境不可或缺的一部分。它們的用途廣泛&#xff0c;從增強在線隱私到繞過地理限制。然而&#xff0c;盡管代理無處不在&#xff0c;但仍存在許多圍繞代理的誤解。在本博客中&#xff0c;我們將探討和消除一些最常見的代理誤解&#…

人腦網絡的多層建模與分析

摘要 了解人類大腦的結構及其與功能的關系&#xff0c;對于各種應用至關重要&#xff0c;包括但不限于預防、處理和治療腦部疾病(如阿爾茨海默病或帕金森病)&#xff0c;以及精神疾病(如精神分裂癥)的新方法。結構和功能神經影像學方面的最新進展&#xff0c;以及計算機科學等…

OBS 免費的錄屏軟件

一、下載 obs 【OBS】OBS Studio 的安裝、參數設置和錄屏、攝像頭使用教程-CSDN博客 二、使用 obs & 輸出無黑屏 【OBS任意指定區域錄屏的方法-嗶哩嗶哩】 https://b23.tv/aM0hj8A OBS任意指定區域錄屏的方法_嗶哩嗶哩_bilibili 步驟&#xff1a; 1&#xff09;獲取區域…

012-GeoGebra基礎篇-構造圓的切線

前邊文章對于基礎內容已經悉數覆蓋了&#xff0c;這一篇我就不放具體的細節&#xff0c;若有需要可以復刻一下 目錄 一、成品展示二、算式內容三、正確性檢查五、文章最后 一、成品展示 二、算式內容 A(0,0) B(3,0) c: Circle(A,B) C(5,4) sSegment(A,C) DMidpoint(s) d: Circ…

k8s部署單節點redis

一、configmap # cat redis-configmap.yaml apiVersion: v1 kind: ConfigMap metadata:name: redis-single-confignamespace: redis data:redis.conf: |daemonize nobind 0.0.0.0port 6379tcp-backlog 511timeout 0tcp-keepalive 300pidfile /data/redis-server.pidlogfile /d…

全網小視頻去水印接口使用說明

一、請求地址&#xff1a; https://www.lytcreate.com/api/qsy/ 二、請求方式&#xff1a;POST 三、請求體&#xff1a;JSON body {"token": "個人中心的token","url": "視頻分享地址"} token獲取地址&#xff0c;訪問&#xff…

uniapp微信小程序使用xr加載模型

1.在根目錄與pages同級創建如下目錄結構和文件&#xff1a; // index.js Component({properties: {modelPath: { // vue頁面傳過來的模型type: String,value: }},data: {},methods: {} }) { // index.json"component": true,"renderer": "xr-frame&q…

Element-plus點擊當前行之后獲取數據顯示跟隨行數據

要實現點擊當前行后&#xff0c;在當前行的下方顯示數據&#xff0c;可以通過以下步驟來實現&#xff1a; 在表格的行點擊事件中獲取當前點擊行的位置信息。根據位置信息動態計算并設置需要顯示數據區域的位置。 下面是一個更新后的示例代碼&#xff0c;演示如何在 Element-P…

Unity 引擎收費模式變革:游戲開發者的挑戰與機遇

Unity 引擎作為游戲開發領域中的重要工具&#xff0c;近日宣布將在 2024 年 1 月 1 日起根據游戲安裝量對開發者進行收費。這一決定引起了業界的廣泛關注和討論。據 Unity 技術博客發布的《Unity 收費模式和配套服務更新》一文&#xff0c;他們選擇這種計費方式是基于每次游戲被…