C++23 views::chunk_by (P2443R1) 詳解

文章目錄

    • 引言
    • C++23 范圍庫概述
      • 范圍視圖(Range Views)
      • 范圍算法(Range Algorithms)
      • 范圍適配器(Range Adapters)
    • std::views::chunk_by 介紹
      • 基本概念
      • 特性
      • 使用場景
    • 示例代碼
      • 簡單示例
      • 自定義謂詞示例
    • 總結

引言

在C++的發展歷程中,每一個新版本都會帶來一些令人期待的特性和改進。C++23作為C++20的增量更新,聚焦于簡化代碼、增強類型安全和填補功能缺口。其中,std::views::chunk_by 作為范圍適配器的新成員,為我們處理數據序列提供了更加便捷和高效的方式。本文將詳細介紹 std::views::chunk_by 的基本概念、特性、使用場景以及示例代碼。

C++23 范圍庫概述

在深入了解 std::views::chunk_by 之前,我們先來簡單回顧一下C++20引入的范圍庫(Ranges library)。范圍庫是C++20的一個主要組成部分,它提供了一種新的方法來處理容器中的元素序列,使得代碼更加簡潔和可讀。范圍庫主要包含以下幾個關鍵概念:

范圍視圖(Range Views)

范圍視圖提供了一種不修改原始數據的情況下,對容器進行變換、過濾和切片的能力。常見的視圖包括 std::views::allstd::views::filterstd::views::transform 等。例如:

#include <iostream>
#include <vector>
#include <ranges>int main() {std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};auto even_numbers = vec | std::views::filter([](int x) { return x % 2 == 0; });auto squared = even_numbers | std::views::transform([](int x) { return x * x; });auto first_three = squared | std::views::take(3);for (int x : first_three) {std::cout << x << " ";}// 輸出: 4 16 36 return 0;
}

范圍算法(Range Algorithms)

C++20引入了新的范圍版本的算法,這些算法可以直接在范圍對象上操作,而不需要顯式循環。例如 std::ranges::sortstd::ranges::find 等。示例如下:

#include <iostream>
#include <vector>
#include <ranges>int main() {std::vector<int> vec = {5, 3, 1, 4, 2};std::ranges::sort(vec);std::cout << "Sorted vector: ";for (int x : vec) {std::cout << x << " ";}// 輸出: Sorted vector: 1 2 3 4 5 auto min_val = std::ranges::min(vec);std::cout << "\nMinimum value: " << min_val << std::endl;// 輸出: Minimum value: 1 return 0;
}

范圍適配器(Range Adapters)

范圍適配器類似于視圖,但它們通常用于創建新的范圍對象。常見的適配器包括 std::ranges::views::joinstd::ranges::views::chunk_by_size 等。

std::views::chunk_by 介紹

基本概念

std::views::chunk_by 是C++23中引入的一個范圍適配器,它接受一個視圖和一個可調用對象(二元謂詞),并通過在每對相鄰元素之間拆分底層視圖來生成一個子范圍(塊)的視圖。對于這些元素,謂詞返回 false。每對元素中的第一個元素屬于前一個塊,第二個元素屬于下一個塊。

在標題 <ranges> 中定義如下:

template< ranges::forward_range V, std::indirect_binary_predicate<iterator_t<V>, ranges::iterator_t<V>> Pred >requires ranges::view<V> && std::is_object_v<Pred>
class chunk_by_view: public ranges::view_interface<chunk_by_view<V, Pred>> (since C++23)
namespace views {inline constexpr /* unspecified */ chunk_by = /* 未指定 */ ;
} (since C++23)

特性

  • 謂詞而非等價關系:與D語言的 chunkBy 不同,std::views::chunk_by 不要求謂詞是一個等價關系。例如,D的 chunkBy 要求謂詞滿足自反性、對稱性和傳遞性,而 std::views::chunk_by 則沒有這個限制。
  • 不支持輸入范圍:由于 chunk_by 需要對相鄰元素計算謂詞,因此它要求底層范圍是前向范圍(forward range)。緩存元素不是一種可行的方法,主要原因在 [P2321R2] 的第4.3.4節中有討論。
  • 范圍屬性:如果底層范圍是雙向范圍(bidirectional range),則 chunk_by 也是雙向范圍;否則,它是前向范圍。如果底層范圍是通用范圍(common range),則 chunk_by 也是通用范圍。它永遠不會是借用范圍(borrowed range)或有大小范圍(sized range)。
  • 緩存機制:類似于 splitchunk_by 在其 begin 中計算第一個范圍的末尾并進行緩存,以滿足攤銷的 O ( 1 ) O(1) O(1) 要求。這意味著它不支持常量迭代。

使用場景

std::views::chunk_by 適用于需要將一個序列按照某種規則進行分組的場景。例如,將一個整數序列按照奇偶性進行分組,或者將一個字符串序列按照長度進行分組等。

示例代碼

簡單示例

#include <iostream>
#include <vector>
#include <ranges>
#include <fmt/core.h>int main() {std::vector<int> v = {1, 2, 2, 3, 0, 4, 5, 2};fmt::print("{}\n", v | std::views::chunk_by(std::ranges::less_equal{}));   // [[1, 2, 2, 3], [0, 4, 5], [2]]return 0;
}

在這個示例中,我們使用 std::views::chunk_bystd::ranges::less_equal{} 謂詞將整數序列 v 進行分組。當相鄰元素不滿足小于等于關系時,就會進行分組。

自定義謂詞示例

#include <iostream>
#include <vector>
#include <ranges>
#include <fmt/core.h>int main() {std::vector<int> v = {1, 3, 5, 2, 4, 6, 7, 9};auto is_odd = [](int x) { return x % 2 == 1; };auto chunked = v | std::views::chunk_by([&is_odd](int a, int b) { return is_odd(a) == is_odd(b); });for (const auto& chunk : chunked) {for (int x : chunk) {std::cout << x << " ";}std::cout << std::endl;}return 0;
}

在這個示例中,我們自定義了一個謂詞 is_odd 來判斷一個數是否為奇數。然后使用 std::views::chunk_by 將整數序列按照奇偶性進行分組。

總結

std::views::chunk_by 是C++23范圍庫中一個非常實用的范圍適配器,它為我們處理數據序列提供了更加靈活和高效的方式。通過使用 std::views::chunk_by,我們可以輕松地將一個序列按照某種規則進行分組,而不需要手動編寫復雜的循環和邏輯。同時,范圍庫的惰性求值特性也使得代碼更加高效,避免了不必要的計算和內存消耗。在實際開發中,我們可以根據具體的需求靈活運用 std::views::chunk_by 來簡化代碼,提高開發效率。

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

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

相關文章

零碳園區能源系統-多能互補體系

構建以可再生能源為核心的零碳園區能源系統&#xff0c;需整合光儲直柔、光伏發電、微電網、氫能與儲能技術&#xff0c;通過多能協同與智能調控實現能源生產、存儲、消費全鏈條優化。以下是系統性實施方案&#xff1a; 一、系統架構設計 1. 多能互補體系 &#xff08;圖示&a…

elastic search學習

首先在自己電腦上安裝elastic search。安裝成功后&#xff0c;查看ES是否啟動成功。 安裝過程參考&#xff1a;ElasticSearch入門1: mac 安裝 - 霜井 - 博客園 安裝完成后&#xff0c;直接執行bin目錄中的elastic search命令后&#xff0c;就可以啟動成功&#xff01; 在網頁…

mysql8常用sql語句

查詢結果帶行號 -- 表名為 mi_user&#xff0c; 假設包含列 id &#xff0c;address SELECT ROW_NUMBER() OVER (ORDER BY id) AS row_num, t.id, t.address FROM mi_user t ; SELECT ROW_NUMBER() OVER ( ) AS row_num, t.id, t.address FROM mi_user t ; 更新某列數…

Memcached 服務搭建和集成使用的詳細步驟示例

以下是 Memcached 服務搭建和集成使用的詳細步驟示例&#xff1a; 一、搭建 Memcached 服務 安裝 Memcached Linux 系統 yum 安裝&#xff1a;執行命令 yum install -y memcached memcached-devel。源碼安裝 下載源碼&#xff1a;wget http://www.memcached.org/files/memcach…

2. 盒模型/布局模塊 - 響應式產品展示頁_案例:電商產品網格布局

2. 盒模型/布局模塊 - 響應式產品展示頁 案例&#xff1a;電商產品網格布局 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><style type"text/css">:root {--primary-color…

Go基于plugin的熱更新初體驗

背景 對于一個部署在生產環境的項目來說&#xff0c;我們希望當代碼出現bug的時候&#xff0c;可以不用重啟進程而達到動態修改代碼的目的—— 這就是代碼熱部署&#xff01; 使用java做游戲服務器&#xff0c;最大的好處是&#xff0c;當代碼出現bug&#xff0c;可以直接熱…

【RabbitMQ】工作隊列和發布/訂閱模式的具體實現

文章目錄 建立連接工作隊列模式實現創建隊列和交換機生產者代碼消費者代碼運行程序啟動消費者啟動生產者 發布/訂閱模式實現創建隊列和交換機生產者代碼創建交換機聲明兩個隊列綁定隊列和交換機發送消息完整代碼 消費者代碼完整代碼 運行程序啟動生產者啟動消費者 建立連接 我…

Codeforces Round 998 (Div. 3)

A. Fibonacciness 題目大意 給你四個數字abde&#xff0c;讓你找到一個中間值c&#xff0c;問 a b c a b c abc &#xff0c; b c d b c d bcd &#xff0c; c d e c d e cde 最多能有幾個式子成立 解題思路 顯然最多就六種情況&#xff0c;暴力枚舉即可 代…

火山引擎發展初始

火山引擎是字節跳動旗下的云計算服務品牌&#xff0c;其云服務業務的啟動和正式商業化時間線如下&#xff1a; 1. **初期探索&#xff08;2020年之前&#xff09;** 字節跳動在早期為支持自身業務&#xff08;如抖音、今日頭條等&#xff09;構建了強大的基礎設施和技術中…

【認知思維】光環效應:第一印象的持久力量

什么是光環效應 光環效應&#xff08;Halo Effect&#xff09;是指人們傾向于讓對某人或某物的一個顯著特質的印象影響對其他特質的評價的認知偏差。簡單來說&#xff0c;當我們對某人的一個特質&#xff08;如外表、智力或某項技能&#xff09;形成積極印象時&#xff0c;我們…

Java Solon v3.3.0 發布(國產優秀應用開發基座)

Solon 框架&#xff01; Solon 是新一代&#xff0c;Java 企業級應用開發框架。從零開始構建&#xff08;No Java-EE&#xff09;&#xff0c;有靈活的接口規范與開放生態。采用商用友好的 Apache 2.0 開源協議&#xff0c;是“杭州無耳科技有限公司”開源的根級項目&#xff…

力扣-104.二叉樹的最大深度

題目描述 給定一個二叉樹 root &#xff0c;返回其最大深度。 二叉樹的 最大深度 是指從根節點到最遠葉子節點的最長路徑上的節點數。 class Solution { public:int maxDepth(TreeNode* root) {if(!root){return 0;}return max(maxDepth(root->left), maxDepth(root->…

單反和無反(私人筆記)

① 單反相機&#xff1a; 定義&#xff1a; 單反相機&#xff08;Single-Lens Reflex&#xff0c;SLR&#xff09;是一種帶有反光鏡結構的數碼相機。光線通過鏡頭進入后&#xff0c;先被反光鏡反射到五棱鏡/五面鏡&#xff0c;再通過取景器進入人眼。按下快門時&#xff0c;反…

超詳細講解C語言轉義字符\a \b \r \t \? \n等等

轉義字符 C語言有一組字符很特殊&#xff0c;叫做轉義字符&#xff0c;顧名思義&#xff0c;改變原來的意思的字符。 1 \? ??)是一個三字母詞&#xff0c;在以前的編譯器它會被編譯為] (??會被編譯為[ 因此在以前輸入(are you ok ??)就會被編譯為are you ok ] 解決這個…

Java Spring MVC -01

SpringMVC 是一種基于 的實現 MVC 設計模式的請求驅動類型的輕量級 Web 框架&#xff0c;屬于 Spring FrameWork 的后續產品&#xff0c;已經融合在 Spring Web Flow 中。 First:SpringMVC-01-SpringMVC 概述 SpringMVC 是 Spring 框架的一個模塊&#xff0c;用于構建 Web 應…

Spring MessageSource 詳解:如何在國際化消息中傳遞參數

在開發多語言應用程序時,Spring 的 MessageSource 是處理國際化(i18n)文本的核心組件。它允許我們根據用戶的 Locale (區域設置) 顯示不同的消息。然而,很多時候我們的消息并不是靜態的,而是需要包含動態數據,比如用戶名、數量、文件名等。這時,我們就需要在獲取國際化消…

Datawhale 5月llm-universe 第1次筆記

課程地址&#xff1a;GitHub - datawhalechina/llm-universe: 本項目是一個面向小白開發者的大模型應用開發教程&#xff0c;在線閱讀地址&#xff1a;https://datawhalechina.github.io/llm-universe/ 難點&#xff1a;配置conda環境變量 我用的vscode github方法 目錄 重要…

基于Java的家政服務平臺設計與實現(代碼+數據庫+LW)

摘 要 現代經濟快節奏發展以及不斷完善升級的信息化技術&#xff0c;讓傳統數據信息的管理升級為軟件存儲&#xff0c;歸納&#xff0c;集中處理數據信息的管理方式。本家政服務平臺就是在這樣的大環境下誕生&#xff0c;其可以幫助管理者在短時間內處理完畢龐大的數據信息&a…

Android中LinearLayout線性布局使用詳解

Android中LinearLayout線性布局使用詳解 LinearLayout&#xff08;線性布局&#xff09;是Android中最基礎、最常用的布局之一&#xff0c;它按照水平或垂直方向依次排列子視圖。 基本特性 方向性&#xff1a;可以設置為水平(horizontal)或垂直(vertical)排列權重&#xff1…

LVS+keepalived實戰案例

目錄 部署LVS 安裝軟件 創建VIP 創建保存規則文件 給RS添加規則 驗證規則 部署RS端 安裝軟件 頁面內容 添加VIP 配置系統ARP 傳輸到rs-2 客戶端測試 查看規則文件 實現keepalived 編輯配置文件 傳輸文件給backup 修改backup的配置文件 開啟keepalived服務 …