C++系列十:日常學習-範圍庫Ranges

来源:https://www.cnblogs.com/zhouyitty/archive/2023/10/09/17753039.html
-Advertisement-
Play Games

目錄前言介紹舉例: 前言 不錯麼 內容參考 https://zh.cppreference.com/w/cpp/ranges Chatjpt 總結註意點: 確保你的C++編譯器支持C++20標準 包含 ranges 頭文件 views的操作是惰性的,它們不會立即執行,而是在需要時計算。這意味著你可以 ...


目錄

前言

不錯麼

內容參考

  1. https://zh.cppreference.com/w/cpp/ranges
  2. Chatjpt

總結註意點:

  1. 確保你的C++編譯器支持C++20標準
  2. 包含 ranges 頭文件
  3. views的操作是惰性的,它們不會立即執行,而是在需要時計算。這意味著你可以構建複雜的管道,而不必擔心性能問題。提供性能優勢,因為它們避免了不必要的數據拷貝和臨時存儲。在處理大型數據集時,這種優化尤為重要。
  4. 使用views不會修改原始數據,它們只是提供了對數據的查看和操作方式。因此,原始數據保持不變,不會被修改。
  5. 要小心處理可能的異常情況,例如範圍越界或無效的操作。可以使用try-catch塊來處理異常。
  6. 管道操作符 |(豎線符號)=>數據處理操作可以從左到右依次執行,

介紹

C++20引入了Ranges庫,其中的views是該庫的一個關鍵組成部分。views提供了一種現代化的、功能強大的方法來處理數據序列,它基於"range-based"編程範式,允許你以聲明性的方式對數據序列進行操作,而無需手動編寫迴圈。以下是關於views的詳細介紹:

  1. 什麼是views

    views是C++20中Ranges庫的一部分,它代表了一個數據序列的虛擬視圖。這個視圖允許你以一種便捷和現代的方式訪問和操作數據,同時不需要實際地拷貝或修改原始數據。views的操作是惰性的,只有在需要的時候才會執行。

  2. 視圖的創建:

    你可以通過調用標準容器的views成員函數或使用適配器來創建視圖。例如,可以使用std::vector創建一個視圖:

    std::vector<int> numbers = {1, 2, 3, 4, 5};
    auto view = numbers | std::views::transform([](int x) { return x * 2; });
    

    在這裡,std::views::transform是一個視圖適配器,它將一個函數應用於容器中的每個元素,創建一個新的視圖。

  3. 視圖的操作:

    一旦創建了視圖,你可以對其執行各種操作,這些操作包括但不限於:

    • 篩選(filtering):篩選出滿足特定條件的元素。

    • 映射(mapping):將函數應用於序列中的每個元素。

    • 切片(slicing):選擇範圍內的元素。

    • 排序(sorting):對元素進行排序。

    你可以將多個操作組合在一起來創建複雜的數據處理管道,而這些操作都是惰性執行的。

  4. 遍歷視圖:

    一旦創建了視圖,你可以使用for迴圈或範圍for迴圈來遍歷它。視圖會在遍歷時動態計算元素,而不會一次性生成所有元素。

    for (int num : view) {       std::cout << num << " ";   }
    
  5. 性能優勢:

    views具有優化的性能。它們避免了不必要的數據拷貝和臨時存儲,使得在處理大型數據集時非常高效。

  6. 自定義視圖:

    你還可以創建自定義的視圖,通過實現必要的迭代器和操作符來定義你自己的數據序列操作。

  7. views的應用場景:

    views適用於各種應用場景,包括數據轉換、篩選、數據流處理、映射、集合操作等。它們可以使你的代碼更加清晰、可讀和高效。

總之,views是C++20引入的一個重要特性,它使得序列處理變得更加簡單和現代化。它們提供了一種優雅的方式來處理數據序列,避免了繁瑣的手動迭代和數據操作。在使用時,請確保你的編譯器支持C++20標準並瞭解如何正確使用Ranges庫以發揮其強大的功能。

舉例:

std::vector<int> numbers = {1, 2, 3, 4, 5};
// 使用views::transform將每個元素翻倍=>2 4 6 8 10
auto doubled = numbers | std::views::transform([](int x) { return x * 2; });
// 使用views::filter篩選偶數 =>2 4
auto evenNumbers = numbers | std::views::filter([](int x) { return x % 2 == 0; });
// 使用views::slice選擇範圍[1, 3)=> 2 3 4
auto slicedRange = numbers | std::views::slice(1, 4);
// 鏈式操作:篩選偶數,然後翻倍=>4 8
auto result = numbers | std::views::filter([](int x) { return x % 2 == 0; })
                      | std::views::transform([](int x) { return x * 2; });
// 使用views::iota生成範圍[1, 10)=>1~9
auto sequence = std::views::iota(1, 10);
// 生成無限遞增序列~~~
auto infiniteSequence = std::views::iota(1);   
// 使用views::reverse反向迭代容器=>5 4 3 2 1
auto reversed = numbers | std::views::reverse;    
// 使用views::concat合併兩個容器
std::vector<int> numbers1 = {1, 2, 3};
std::vector<int> numbers2 = {4, 5, 6};
auto combined = std::views::concat(numbers1, numbers2);
for (int num : doubled) {
  std::cout << num << " "; 
//拆分字元串
std::string text = "Hello,World,C++,Ranges";
auto splitView = text | std::views::split(',');
for (const auto& range : splitView) {
    std::string token(range.begin(), range.end());
    std::cout << token << std::endl;
} 

//對比:
auto const ints = {0,1,2,3,4,5};
auto even = [](int i) { return 0 == i % 2; };
auto square = [](int i) { return i * i; };
// 組合視圖的“管道”語法:
for (int i : ints | std::views::filter(even) | std::views::transform(square)) {
    std::cout << i << ' ';
}
std::cout << '\n';
// 傳統的“函數式”組合語法:
for (int i : std::views::transform(std::views::filter(ints, even), square)) {
    std::cout << i << ' ';
}


還有許多適配器就不一一舉例說明瞭。
高深的就不探究了,會使用好工具就得了。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • three.js、webgl、3D煤礦隧道、三維井下人員定位、掘進面三維可視化、縱採面可視化、採集面可視化展示、設備檢測、數字孿生、物聯網3D、3d建築、3d庫房,bim管理系統 ...
  • 導讀 VTable: 不只是高性能的多維數據分析表格,更是行列間創作的方格藝術家! VTable是位元組跳動開源可視化解決方案 VisActor 的組件之一。 在現代應用程式中,表格組件是不可或缺的一部分,它們能夠快速展示大量數據,並提供良好的可視化效果和交互體驗。VTable是一款基於可視化渲染引擎 ...
  • 單例模式 一個類只有一個實例,並提供一個全局訪問此實例的點,哪怕多線程同時訪問。 單例模式主要解決了一個全局使用的類被頻繁的創建和消費的問題。 單例模式的案例場景 資料庫的連接池不會反覆創建 spring中一個單例模式bean的生成和使用 在我們平常的代碼中需要設置全局的一些屬性保存 七種單例模式的 ...
  • 本文介紹了一種基於線上流量實現對重構系統進行功能和性能驗證的實踐方案。針對線上流量如何攔截、如何錄製、如何存儲、如何回放以及如何發壓均作了詳細說明,為具有類似需求的讀者提供了一種可供參考的思路。 ...
  • 一起學習下架構的視角。 架構的視角 在筆者的知識體系中,實際上將架構分為業務架構、應用架構、雲基礎架構這幾大類,業務架構主要著眼於控制業務的複雜性,基礎架構著眼於解決分散式系統中存在的一系列問題。無論何種架構,都希望能實現系統的可變的同時保障業務的高可用。 很多時候架構的視角/分類沒有明顯的邊界,通 ...
  • 一、項目地址 https://github.com/LinFeng-BingYi/DailyAccountBook 二、新增 1. 在表格中設置選項列表,讓用戶更快地編輯動賬記錄 1.1 功能詳述 為表格中以下欄位設置選項列表: 1. 需求強度(由"基本需求"更名) 溫飽:基本維持生存且不鋪張浪費的 ...
  • Python裝飾器是一種語法糖,用於在不改變原有函數代碼的情況下,為函數添加額外的功能。裝飾器本質上是一個函數,它接收一個函數作為參數,並返回一個新的函數,通常使用@語法糖來應用裝飾器。 1.裝飾器本質是一個函數,可稱之為函數裝飾器; 2.裝飾器也是一個閉包,即在非全局範圍內定義的函數可以引用其外圍... ...
  • Java網路編程基於TCP/UDP協議的基礎之上,TCP/IP協議是一個協議簇。裡面包括很多協議的,UDP只是其中的一個, 之所以命名為TCP/IP協議,因為TCP、IP協議是兩個很重要的協議,就用他兩命名了。那麼首先我們先介紹一下TCP和UDP的特點: 1.TCP(Transmission Con ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...