std::ranges::views::common, std::ranges::common_view

std::ranges::views::common,?std::ranges::common_view

C++20 引入的用于將范圍適配為“通用范圍”的工具,主要解決某些算法需要傳統迭代器對(如?begin?和?end?類型相同)的問題。

基本概念

1.?功能
  • 適配傳統算法:將范圍(range)的迭代器和哨兵(sentinel)類型統一,使其適配需要“迭代器對”的舊式算法(如 C++17 之前的算法)。
  • 類型一致性:確保?begin()?和?end()?返回的迭代器類型相同。
  • 零開銷原則:僅在必要時添加類型轉換,無額外內存分配。

以下是詳細說明和示例:


核心概念

  • 問題背景:C++20 的某些范圍(如?split_view)的?begin?和?end?返回的迭代器類型可能不同,但傳統算法(如 C++17 前的算法)需要它們類型相同。
  • 解決方案common_view?將范圍適配為?begin?和?end?迭代器類型相同的“通用范圍”。

std::ranges::common_view

  • 定義template<std::ranges::view V> class common_view : public std::ranges::view_interface<common_view<V>>
  • 適用場景
    • 當原始范圍的迭代器和哨兵類型不同,但需要轉換為相同類型時。
    • 需要將范圍傳遞給傳統算法(如接受?int*?和?int*?的算法)。

語法與參數

1. 語法
auto common_view = range | std::ranges::views::common;
  • range:輸入范圍(如容器、視圖)。

示例 1:適配?split_view
#include <ranges>
#include <vector>
#include <algorithm>
#include <iostream>int main() {std::string str = "hello,world,cpp20";auto split = str | std::views::split(',');// split 的迭代器和哨兵類型不同,無法直接傳遞給傳統算法// 使用 common_view 適配auto common_range = split | std::views::common;// 現在可以像傳統范圍一樣使用for (const auto& part : common_range) {for (char c : part) std::cout << c;std::cout << '\n';}
}

示例 2:傳遞給傳統算法

某些傳統算法(如?std::sort)要求?begin()?和?end()?的迭代器類型嚴格一致,但 C++20 的某些范圍(如?std::ranges::iota_view)可能返回不同類型的哨兵:

示例 2:處理子范圍
#include <ranges>
#include <vector>
#include <algorithm>
#include <iostream>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};auto reversed = vec | std::views::reverse;// 傳統算法需要 begin 和 end 類型相同// 使用 common_view 適配auto common_reversed = reversed | std::views::common;// 使用 std::sort(僅示例,反轉后排序可能無意義)std::ranges::sort(common_reversed); // 需要迭代器類型相同for (int x : common_reversed) {std::cout << x << ' '; // 輸出:1 2 3 4 5(排序后的反轉)}
}

std::ranges::views::common

  • 定義:范圍適配器對象,可通過管道操作符?|?簡化?common_view?的創建。
  • 等效操作views::common(r)?等價于?common_view<views::all_t<decltype(r)>>{r}
示例 3:結合管道操作符
#include <ranges>
#include <iostream>
#include <list>
#include <algorithm> // 必須包含此頭文件以使用 std::findint main() {std::list<int> lst = {1, 2, 3, 4, 5};auto even = lst | std::views::filter([](int x) { return x % 2 == 0; });// 使用 views::common 適配auto common_even = even | std::views::common;// 傳遞給傳統算法 std::findif (std::find(common_even.begin(), common_even.end(), 4) != common_even.end()) {std::cout << "Found 4\n";}
}

注意事項

  1. 性能common_view?可能引入額外開銷(如緩存迭代器),需謹慎使用。
  2. 適用性:僅在需要傳統迭代器對時使用,現代算法(如?std::ranges::sort)通常不需要。
  3. 生命周期:確保底層范圍的生命周期長于?common_view

總結

  • common_view:將?begin?和?end?迭代器類型不同的范圍適配為類型相同的通用范圍。
  • views::common:通過管道操作符簡化?common_view?的創建。
  • 典型場景:與傳統算法交互,或需要迭代器類型一致的操作。

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

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

相關文章

4.3 數組和集合的初始及賦值

版權聲明&#xff1a;本文為博主原創文章&#xff0c;轉載請在顯著位置標明本文出處以及作者網名&#xff0c;未經作者允許不得用于商業目的 版權聲明&#xff1a;本文為博主原創文章&#xff0c;轉載請在顯著位置標明本文出處以及作者網名&#xff0c;未經作者允許不得用于商…

分布式光伏發電的發展現狀與前景

分布式光伏發電的發展現狀與前景 1、分布式光伏發電的背景2、分布式光伏發電的分類2.1、集中式光伏發電2.1.1、特點、原則2.1.2、優點2.1.3、缺點 2.2、分布式光伏發電2.2.1、特點、原則2.2.2、優點2.2.3、缺點 2.3、對比 3、分布式光伏發電的現狀4、分布式光伏發電的應用場景4…

13 | 實現統一的錯誤返回

提示&#xff1a; 所有體系課見專欄&#xff1a;Go 項目開發極速入門實戰課&#xff1b;歡迎加入 云原生 AI 實戰 星球&#xff0c;12 高質量體系課、20 高質量實戰項目助你在 AI 時代建立技術競爭力&#xff08;聚焦于 Go、云原生、AI Infra&#xff09;&#xff1b;本節課最終…

DeepSeek結合Mermaid繪圖(流程圖、時序圖、類圖、狀態圖、甘特圖、餅圖)轉載

思維速覽&#xff1a; 本文將詳細介紹如何利用DeepSeek結合Mermaid語法繪制各類專業圖表&#xff0c;幫助你提高工作效率和文檔質量。 ▍DeepSeek入門使用請看&#xff1a;deepseek保姆級入門教程&#xff08;網頁端使用 本地客戶端部署 使用技巧&#xff09; DeepSeek官網…

Java靜態變量與PHP靜態變量的對比

Java的靜態變量在多線程并發的情況下是線程共有的。以下是關鍵點總結&#xff1a; 存儲位置&#xff1a;靜態變量屬于類&#xff0c;存儲在方法區&#xff08;或元空間&#xff09;&#xff0c;這是所有線程共享的內存區域。因此&#xff0c;所有線程訪問的都是同一個靜態變量實…

c++20 Concepts的簡寫形式與requires 從句形式

c20 Concepts的簡寫形式與requires 從句形式 原始寫法&#xff08;簡寫形式&#xff09;等效寫法&#xff08;requires 從句形式&#xff09;關鍵區別說明&#xff1a;組合多個約束的示例&#xff1a;兩種形式的編譯結果&#xff1a;更復雜的約束示例&#xff1a;標準庫風格的約…

上下分層、左右分離的驅動設計思想

之前了解了最簡單的驅動程序、但是不易擴展、現在繼續學習、上下分層、左右分離的驅動設計思想。 1、led_dev.c函數 上層函數&#xff0c;①定義一個結構體&#xff0c;存儲函數用來接應app的函數。②定義一個入口函數&#xff0c;將我們接應的函數告訴內核&#xff0c;給這個…

人工智能在醫療領域的應用:技術革新與未來展望

人工智能&#xff08;AI&#xff09;技術正在重塑醫療行業的面貌。從輔助診斷到藥物研發&#xff0c;從健康管理到手術機器人&#xff0c;AI的廣泛應用不僅提升了醫療效率&#xff0c;還為精準醫療和個性化治療提供了新可能。根據2025年多份研究報告及政策文件&#xff0c;全球…

《歷史代碼分析》5、動態控制列表的列

?? 本系列《歷史代碼分析》為工作中遇到具有代表性的代碼。今天我們講一下&#xff0c;動態展示列表的列&#xff0c;因為找不到代碼了&#xff0c;所有本篇用圖展示。 舉個栗子 ?? 我們希望能夠動態的控制列表的列&#xff0c;例如&#xff0c;英語老師只想知道自己學…

Windows HD Video Converter Factory PRO-v27.9.0-

Windows HD Video Converter Factory PRO 鏈接&#xff1a;https://pan.xunlei.com/s/VOL9TaiuS7rXbu-1kEDndoceA1?pwd7qch# 支持300多種視頻格式轉換&#xff0c;在保留視頻質量的同時&#xff0c;壓縮率可達80%&#xff0c;轉換速度可達50X速率&#xff01; 支持畫面剪切、片…

C++程序設計語言筆記——抽象機制:構造、清理、拷貝和移動

0 應該將構造函數、賦值操作以及析構函數設計為一組匹配的操作。 在C中&#xff0c;構造函數、賦值操作符和析構函數共同管理對象的資源生命周期。為確保資源安全且一致地處理&#xff0c;需將它們作為一組匹配的操作設計。以下是關鍵要點&#xff1a; 為何需要協同設計&…

##Hive安裝-初始化元數據報錯 *** schemaTool failed ***

報錯&#xff1a; org.apache.hadoop.hive.metastore.HiveMetaException: Failed to get schema version. Underlying cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException : Communications link failure 解決方案&#xff1a; 嘗試一&#xff1a;javax.jdo.o…

遠程手機遙控開關原理及應用

遠程手機遙控開關的工作原理主要是通過互聯網傳遞無線信號&#xff0c;控制用電器的一種智能家居產品。 遠程手機遙控開關的基本套件包括&#xff1a;手機APP、網線、家用WIFI中轉無服務器或者是工廠提供的自帶網線端口的中轉服務器、連接用電器的接收器。使用時&#xff0c;手…

Mac java全棧開發環境配置

前言 由于最近手中的windows本子壞了,所以搞了一臺m系列的macbookpro 作為一個開發者 面對新設備最先考慮的應該就是各種sdk、中間件服務、環境變量配置和工具了吧!!! 本文將帶你手把手學習Mac搭建屬于自己的本地開發環境 安裝brew 什么是brew? ?Brew(全稱Homebrew)…

Ubuntu conda虛擬環境不同設備之間遷移

Ubuntu conda環境遷移&#xff08;conda-pack&#xff09; 方法一&#xff1a;壓縮拷貝方法二&#xff1a;conda-pack 在一臺電腦配置好conda虛擬環境后&#xff0c;若在其它電腦需要同樣的環境&#xff0c;可通過如下兩種方式進行遷移。 方法一&#xff1a;壓縮拷貝 找到Ubu…

詳細學習 pandas 和 xlrd:從零開始

詳細學習 pandas 和 xlrd&#xff1a;從零開始 前言 在數據處理和分析中&#xff0c;Excel 文件是最常見的數據格式之一。Python 提供了強大的庫 pandas&#xff0c;可以輕松地處理 Excel 文件中的數據。同時&#xff0c;我們還可以使用 xlrd 來讀取 Excel 文件&#xff0c;尤…

HTMLCSS繪制三角形

1.代碼&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>01triangle</title><s…

vue3-element-admin 前后端本地啟動聯調

一、后端環境準備 1.1、下載地址 gitee 下載地址 1.2、環境要求 JDK 17 1.3、項目啟動 克隆項目 git clone https://gitee.com/youlaiorg/youlai-boot.git數據庫初始化 執行 youlai_boot.sql 腳本完成數據庫創建、表結構和基礎數據的初始化。 修改配置 application-dev.y…

C++中error C2027: 使用了未定義類型 問題部分解決方法

在 C 編程中&#xff0c;遇到錯誤 C2027&#xff1a;“使用了未定義類型”通常意味著在代碼中使用了某種類型&#xff0c;但是編譯器無法識別這個類型的定義。這個錯誤通常有幾個常見的原因&#xff1a; 1. 缺少包含頭文件 如果使用了某個庫中的類型&#xff0c;但是沒有包含…

WinForm模態與非模態窗體

1、模態窗體 1&#xff09;定義&#xff1a; 模態窗體是指當窗體顯示時&#xff0c;用戶必須先關閉該窗體&#xff0c;才能繼續與應用程序的其他部分進行交互。 2&#xff09;特點&#xff1a; 窗體以模態方式顯示時&#xff0c;會阻塞主窗體的操作。用戶必須處理完模態窗體上…