名稱空間
變體
操作

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

來自 cppreference.com
< cpp‎ | ranges
 
 
範圍庫 (Ranges library)
範圍介面卡 (Range adaptors)
 
 
定義於標頭檔案 <ranges>
template< ranges::forward_range V, ranges::forward_range Pattern >

requires ranges::view<V> &&
         ranges::view<Pattern> &&
         std::indirectly_comparable<ranges::iterator_t<V>,
                                    ranges::iterator_t<Pattern>,
                                    ranges::equal_to>
class split_view

    : public ranges::view_interface<split_view<V, Pattern>>
(1) (C++20 起)
namespace views {

    inline constexpr /* unspecified */ split = /* unspecified */;

}
(2) (C++20 起)
呼叫簽名 (Call signature)
template< ranges::viewable_range R, class Pattern >

    requires /* 見下文 */

constexpr ranges::view auto split( R&& r, Pattern&& pattern );
(C++20 起)
template< class Pattern >
constexpr /* range adaptor closure */ split( Pattern&& pattern );
(C++20 起)
1) split_view 接受一個 view 和一個分隔符,並將該 view 按分隔符拆分成子範圍。
2) RangeAdaptorObject。表示式 views::split(e, p) 對於任何合適的子表示式 ep 來說,與 split_view(e, p) 表示式等價。

split_view 模擬 forward_rangecommon_range 概念,當底層 view V 模擬相應的概念時。

內部範圍 (ranges::range_reference_t<split_view>) 是一個 ranges::subrange<ranges::iterator_t<V>>,它模擬 common_range,當 ranges::iterator_t<V> 模擬 std::sized_sentinel_for<ranges::iterator_t<V>> 時,模擬 sized_range,並且當 V 模擬相應的概念時,它還模擬 contiguous_rangerandom_access_rangebidirectional_rangeforward_range

lazy_split_view 不同,split_view 保持子範圍的連續性,使其適用於字串分割。

目錄

[編輯] 資料成員

成員 描述
V base_ (私有) 底層(適配的)view
(僅用於闡釋的成員物件*)
Pattern pattern_ (私有) 用作分隔符來拆分底層 view 的模式物件
(僅用於闡釋的成員物件*)
non-propagating-cache<ranges::subrange
    <ranges::iterator_t<V>>>
cached_begin_ (私有)
一個快取首次呼叫 begin() 結果的物件
(僅用於闡釋的成員物件*)

[編輯] 成員函式

構造一個 split_view
(公共成員函式) [編輯]
返回底層(適配)檢視的副本
(公共成員函式) [編輯]
返回指向起始的迭代器
(公共成員函式) [編輯]
返回一個迭代器或一個哨兵到末尾
(公共成員函式) [編輯]
搜尋模式的下一次出現
(僅用於說明的成員函式*)
繼承自 std::ranges::view_interface
如果派生檢視滿足 sized_rangeforward_range,則返回派生檢視是否為空
(std::ranges::view_interface<D> 的公共成員函式) [編輯]
(C++23)
返回範圍開頭的常量迭代器
(std::ranges::view_interface<D> 的公共成員函式) [編輯]
(C++23)
返回範圍常量迭代器的哨兵
(std::ranges::view_interface<D> 的公共成員函式) [編輯]
返回派生檢視是否非空,僅當 ranges::empty 適用於它時提供
(std::ranges::view_interface<D> 的公共成員函式) [編輯]
返回派生檢視中的第一個元素,如果它滿足 forward_range 則提供
(std::ranges::view_interface<D> 的公共成員函式) [編輯]

[編輯] 巢狀類

迭代器型別
(僅用於說明的成員類*)
哨兵型別
(僅用於說明的成員類*)

[編輯] 推導指南

[編輯] 注意

P2210R2 之前,split_view 使用了一種“惰性”機制進行拆分,因此無法保持底層檢視的雙向、隨機訪問或連續特性,也無法使內部範圍的迭代器型別與底層檢視的迭代器型別相同。因此,它在 P2210R2 中進行了重新設計,而惰性機制則移至 lazy_split_view

分隔符 pattern 通常不應是普通字串字面量,因為它會認為空終止符是分隔符的必要部分;因此,建議使用 std::string_view 字面量。

[編輯] 示例

#include <iomanip>
#include <iostream>
#include <ranges>
#include <string_view>
 
int main()
{
    using std::operator""sv;
    constexpr auto words{"Hello^_^C++^_^20^_^!"sv};
    constexpr auto delim{"^_^"sv};
 
    for (const auto word : std::views::split(words, delim))
        // with string_view's C++23 range constructor:
        std::cout << std::quoted(std::string_view(word)) << ' ';
    std::cout << '\n';
}

輸出

"Hello" "C++" "20" "!"

[編輯] 缺陷報告

下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
P2210R2 C++20 舊的 split_view 太惰性,不易使用 它已重新設計

[編輯] 參閱

一個 view,包含透過分隔符拆分另一個 view 獲得的子範圍
(類模板) (範圍介面卡物件)[編輯]
一個 view,由展平一個 rangesview 得到的序列組成
(類模板) (範圍介面卡物件)[編輯]