std::ranges::views::split, lazy_split, std::ranges::split_view, lazy_split_view

std::ranges::views::split,?std::ranges::split_view

C++20 中引入的用于分割范圍(range)的組件,允許將輸入范圍按特定分隔符或條件分割成多個子范圍。以下是詳細說明和示例:


基本概念

1.?功能
  • 分割范圍:將輸入范圍(如字符串、容器)按指定的分隔符(可以是單個元素、子范圍或謂詞)分割成多個子范圍。
  • 惰性求值split_view?是惰性適配器,只有在遍歷時才會執行分割操作,不會預先分配內存。
  • 返回類型:返回一個?split_view?對象,其元素是?subrange?類型的子范圍。

語法與參數

1. 語法
auto split_view = input_range | std::ranges::views::split(pattern);

?

  • input_range:輸入范圍(如?std::stringstd::vector)。
  • pattern:分隔符,可以是以下類型:
    • 單個元素(如?charint)。
    • 子范圍(如?std::string_viewstd::vector)。
    • 謂詞(需滿足?std::indirect_unary_predicate)。

示例

示例 1:使用字符分割字符串
#include <iostream>
#include <ranges>
#include <string>
#include <vector>using namespace std;int main() {string str = "apple,banana,cherry";// 使用 views::split 替代 views::lazy_splitauto split_view = str | views::split(',');for (auto const& word : split_view) {// 正確轉換子范圍到字符串的兩種方式:// 方式 1:使用 ranges::to(C++23 特性)// cout << ranges::to<string>(word) << endl;// 方式 2:傳統構造方式(兼容 C++20)cout << string{word.begin(), word.end()} << endl;}
}

output:

apple
banana
cherry

示例 2:使用子范圍分割字符串
#include <iostream>
#include <ranges>
#include <string>int main() {std::string str = "apple::banana::cherry";std::string_view delimiter = "::";auto split_view = str | std::ranges::views::split(delimiter);for (const auto& subrange : split_view) {std::string word{subrange.begin(), subrange.end()};std::cout << word << "\n";}
}
示例 3:處理空子范圍

當輸入以分隔符開頭或結尾時,會產生空子范圍:

#include <iostream>
#include <ranges>
#include <string>int main() {std::string str = ",apple,,banana,";auto split_view = str | std::ranges::views::split(',');for (const auto& subrange : split_view) {std::string word{subrange.begin(), subrange.end()};std::cout << (word.empty() ? "[empty]" : word) << "\n";}
}

outpu:

[empty]
apple
[empty]
banana
[empty]

示例 4:分割容器
#include <iostream>
#include <ranges>
#include <vector>int main() {std::vector<int> data = {1, 0, 2, 0, 3, 0, 4};auto split_view = data | std::ranges::views::split(0);for (const auto& subrange : split_view) {std::vector<int> segment{subrange.begin(), subrange.end()};for (int num : segment) std::cout << num << " ";std::cout << "\n";}
}

output:

1?
2?
3?
4

注意事項

  1. 子范圍生命周期

    • split_view?的子范圍是輸入范圍的視圖,確保輸入范圍在子范圍使用時仍然有效。
  2. 性能優化

    • 避免多次遍歷同一子范圍。若需多次使用,可將其轉換為容器(如?std::stringstd::vector)。
  3. C++23 的?ranges::to

    • 若使用 C++23,可用?ranges::to?直接轉換子范圍:
#include <ranges>
std::cout << std::ranges::to<std::string>(subrange) << "\n";

總結

  • 核心用途:高效分割范圍,無需內存拷貝。
  • 適用場景:處理字符串分割、日志解析、數據流分析等。
  • 關鍵接口views::split?和?split_view,結合?subrange?迭代器操作。

std::ranges::views::lazy_split,?std::ranges::lazy_split_view

?C++20 引入的惰性范圍適配器,用于將輸入范圍按指定分隔符分割成多個子范圍。它不會立即執行分割,而是在遍歷時動態生成子范圍,適用于處理大型數據或需要延遲計算的場景。

基本用法

  • 頭文件:?<ranges>

  • 語法:?input_range | views::lazy_split(pattern)

  • 參數:

    • input_range: 要分割的范圍(如字符串、容器等)。

    • pattern: 分隔符,可以是單個元素或一個子范圍。

示例代碼

示例 1:
#include <algorithm>
#include <iostream>
#include <ranges>
#include <string_view>auto print = [](auto const& view)
{// `view` is of std::views::lazy_split_view::__outer_iterator::value_typefor (std::cout << "{ "; const auto element : view)std::cout << element << ' ';std::cout << "} ";
};int main()
{constexpr static auto source = {0, 1, 0, 2, 3, 0, 4, 5, 6, 0, 7, 8, 9};constexpr int delimiter{0};constexpr std::ranges::lazy_split_view outer_view{source, delimiter};std::cout << "splits[" << std::ranges::distance(outer_view) << "]:  ";for (auto const& inner_view: outer_view){print(inner_view);}constexpr std::string_view hello{"Hello C++ 20 !"};std::cout << "\n" "substrings: ";//std::ranges::for_each(hello | std::views::lazy_split(' '), print);const auto substr = hello | std::views::lazy_split(' ');for (auto const& str: substr){print(str);}constexpr std::string_view text{"Hello-+-C++-+-20-+-!"};constexpr std::string_view delim{"-+-"};std::cout << "\n" "substrings: ";std::ranges::for_each(text | std::views::lazy_split(delim), print);
}

Output:

splits[5]:  { } { 1 } { 2 3 } { 4 5 6 } { 7 8 9 }
substrings: { H e l l o } { C + + } { 2 0 } {?! }
substrings: { H e l l o } { C + + } { 2 0 } {?! }

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

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

相關文章

c++ constraints與concepts使用筆記

c constraints與concepts使用筆記 1. 模板參數缺乏約束的問題2. Concepts 基本概念3. Concept 的定義與使用4. requires 表達式詳解5. requires 從句 vs requires 表達式完整示例&#xff1a;約束矩陣運算 1. 模板參數缺乏約束的問題 問題分析&#xff1a; 傳統模板參數沒有語…

Qt | 屏幕截圖實現

01 全局截屏控件 1. 鼠標右鍵彈出菜單。 2. 支持全局截屏。 3. 支持局部截屏。 4. 支持截圖區域拖動。 5. 支持圖片另存為。 演示 點擊按鈕即可截圖 源碼: 通過網盤分享的文件:screenwidget屏幕截圖 鏈接: https://pan.baidu.com/s/1PZfQlUXNIoZKEfEtLNV2jQ?pwd=5jsg 提…

2.angular指令

初級使用可以查看視頻 參考手冊 注意 像ng-class,ng-value,ng-href等這些&#xff0c;很多都可以直接用class“{{}}” 原生寫&#xff0c;為啥還出這些指令&#xff0c;是因為原生的比如剛一進頁面就先出現表達式了&#xff0c;瀏覽器走到這里的時候才去解析&#xff0c;給用戶…

CTFshow 【WEB入門】信息搜集 【VIP限免】 web1-web17

CTFshow 【 WEB入門】、【VIP限免】 web1 ----源碼泄露 首先第一步&#xff0c;看源代碼 web2----前臺JS繞過 簡單點擊查看不了源代碼&#xff0c;可以強制查看 比如 Ctrl Shift ICtrl U或者在url前加一個view-source: view-source:http://79999ca1-7403-46da-b25b-7ba9…

java 手搓一個http工具類請求傳body

import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.nio.charset.StandardCharsets;public class HttpUtil {/*** JSON請求發起*/public static String httpJsonRequest(String requestUrl, String requestJson) {String responseJson &…

Spring boot3-WebClient遠程調用非阻塞、響應式HTTP客戶端

來吧&#xff0c;會用就行具體理論不討論 1、首先pom.xml引入webflux依賴 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId> </dependency> 別問為什么因為是響應式....…

寫了一個二叉樹構造函數和畫圖函數,方便debug

代碼 class TreeNode(object):def __init__(self, val, leftNone, rightNone):self.val valself.left leftself.right rightdef construct_tree(nodes):if not nodes:return Noneroot TreeNode(nodes[0])queue [root]index 1while index < len(nodes):node queue.p…

QT:串口上位機

創建工程 布局UI界面 設置名稱 設置數據 設置波特率 波特率默認9600 設置數據位 數據位默認8 設置停止位 設置校驗位 調整串口設置、接收設置、發送設置為Group Box 修改配置 QT core gui serialport 代碼詳解 mianwindow.h 首先在mianwindow.h當中定義一個串口指…

【Pandas】pandas Series asof

Pandas2.2 Series Time Series-related 方法描述Series.asfreq(freq[, method, how, …])用于將時間序列數據轉換為指定的頻率Series.asof(where[, subset])用于返回時間序列中指定索引位置的最近一個非缺失值 pandas.Series.asof pandas.Series.asof 方法用于返回時間序列…

沉浸式CSS學習路徑

好的!我將以魔法學院成長故事為框架,為您設計一套沉浸式CSS學習路徑。以下是敘事化學習提綱: 第一卷:像素學徒的覺醒 章節1:被封印的魔法書 發現HTML的"素顏"本質,通過<!DOCTYPE html>解除網頁封印用style標簽打開CSS魔法書,學會給文字穿上color斗篷和…

使用netlify部署github的vue/react項目或本地的dist,國內也可以正常訪問

提供簡潔的部署流程和豐富功能&#xff0c;如自定義域名、自動構建和服務器端功能。通過連接到 Git 倉庫實現持續部署&#xff0c;每次推送代碼都會自動構建和發布&#xff0c;支持無服務器函數&#xff0c;允許在前端項目中實現后端邏輯&#xff0c;提供直觀的用戶界面來管理和…

復現 MoGe

要復現 MoGe&#xff0c;以下給出一般性的復現訓練過程步驟示例&#xff09;的訓練過程&#xff0c;你可以參考以下步驟&#xff1a; 環境準備 安裝必要的深度學習框架&#xff0c;如 TensorFlow 或 PyTorch&#xff0c;以及相關的庫&#xff0c;例如用于數據處理的 NumPy、Pan…

Redis-緩存穿透擊穿雪崩

1. 穿透問題 緩存穿透問題就是查詢不存在的數據。在緩存穿透中&#xff0c;先查緩存&#xff0c;緩存沒有數據&#xff0c;就會請求到數據庫上&#xff0c;導致數據庫壓力劇增。 解決方法&#xff1a; 給不存在的key加上空值&#xff0c;防止每次都會請求到數據庫。布隆過濾器…

如何在自己的網站接入API接口獲取數據?分步指南與實戰示例

將第三方API接入自己的網站是獲取實時數據、擴展功能的重要手段&#xff08;如展示商品、同步訂單、用戶登錄等&#xff09;。以下是完整的接入流程與關鍵實踐&#xff0c;以微店API為例&#xff0c;適用于多數開放平臺。 一、準備工作&#xff1a;注冊與權限申請 注冊開發者…

刷leetcode hot100--動態規劃3.12

第一題乘積max子數組[1h] emmmm感覺看不懂題解 線性dp【計劃學一下acwing&#xff0c;挨個做一下】 線性動態規劃 相似題解析 最長上升子序列 最大上升子序列和 最大連續子段和 乘積最大子數組_嗶哩嗶哩_bilibili 比較奇怪的就是有正負數和0&#xff0c;如何處理&#xff1f…

Pytortch深度學習網絡框架庫 torch.no_grad方法 核心原理與使用場景

在PyTorch中&#xff0c;with torch.no_grad() 是一個用于臨時禁用自動梯度計算的上下文管理器。它通過關閉計算圖的構建和梯度跟蹤&#xff0c;優化內存使用和計算效率&#xff0c;尤其適用于不需要反向傳播的場景。以下是其核心含義、作用及使用場景的詳細說明&#xff1a; 一…

postgresql 數據庫使用

目錄 索引 查看索引 創建 刪除索引 修改數據庫時區 索引 查看索引 select * from pg_indexes where tablenamet_table_data; 或者 select * from pg_statio_all_indexes where relnamet_table_data; 創建 CREATE INDEX ix_table_data_time ON t_table_data (id, crea…

為什么大模型網站使用 SSE 而不是 WebSocket?

在大模型網站&#xff08;如 ChatGPT、Claude、Gemini 等&#xff09;中&#xff0c;前端通常使用 EventSource&#xff08;Server-Sent Events, SSE&#xff09; 來與后端對接&#xff0c;而不是 WebSocket。這是因為 SSE 更適合類似流式文本生成的場景。下面我們詳細對比 SSE…

TDengine 數據對接 EXCEL

簡介 通過配置使用 ODBC 連接器&#xff0c;Excel 可以快速訪問 TDengine 的數據。用戶可以將標簽數據、原始時序數據或按時間聚合后的時序數據從 TDengine 導入到 Excel&#xff0c;用以制作報表整個過程不需要任何代碼編寫過程。 前置條件 準備以下環境&#xff1a; TDen…

【具身相關】legged_gym, isaacgym、rsl_rl關系梳理

【legged_gym】legged_gym, isaacgym代碼邏輯梳理 總體關系IsaacGymlegged_gymrsl_rl三者的關系 legged_gym代碼庫介紹環境模塊env 總體關系 IsaacGym Isaac Gym 是 NVIDIA 開發的一個高性能物理仿真平臺&#xff0c;專門用于強化學習和機器人控制任務。它基于 NVIDIA 的 Phy…