std::ranges::lazy_split_view<V, Pattern>::outer_iterator
template< bool Const > struct /*outer_iterator*/; |
(C++20 起) (僅作說明*) |
|
返回型別為 lazy_split_view::begin
,以及當底層檢視為 common_range
和 forward_range
時為 lazy_split_view::end
。
如果 V
或 Pattern
不是 簡單檢視 (例如,如果 ranges::iterator_t<const V> 無效或與 ranges::iterator_t<V> 不同),則對於 const 過載返回的迭代器,Const
為 true,否則為 false。如果 V
是簡單檢視,則當且僅當 V
是 forward_range
時,Const
為 true。
[編輯] 成員型別
成員 | 定義 |
父類
|
maybe-const <Const, ranges::lazy_split_view>(僅供說明的成員型別*) |
基類
|
maybe-const <Const, V>(僅供說明的成員型別*) |
iterator_concept
|
|
iterator_category (僅當 Base 建模 forward_range 時存在)
|
std::input_iterator_tag |
outer_iterator 的值型別(公有成員類) | |
difference_type
|
ranges::range_difference_t<Base> |
[編輯] 資料成員
成員 | 描述 |
Parent* parent_ (私有) |
指向父物件 lazy_split_view 的指標(僅用於闡釋的成員物件*) |
ranges::iterator_t<Base> current_ (私有)(僅當 V 建模 forward_range 時存在)
|
底層 view 中的迭代器(僅用於闡釋的成員物件*) |
bool trailing_empty_ (私有) |
一個標誌,指示是否已到達空的尾部子範圍 (如果有) (僅用於闡釋的成員物件*) |
[編輯] 成員函式
(建構函式) |
構造一個迭代器 (公開成員函式) |
operator* |
返回當前子範圍 (公開成員函式) |
operator++operator++(int) |
前進迭代器 (公開成員函式) |
cur |
有條件地返回對 current_ (如果存在) 或對 *parent_ ->current_ 的引用(僅用於說明的成員函式*) |
[編輯] 成員函式
std::ranges::lazy_split_view::outer_iterator ::outer_iterator
/*outer_iterator*/() = default; |
(1) | (C++20 起) |
constexpr explicit /*outer_iterator*/( Parent& parent ) requires (!ranges::forward_range<Base>); |
(2) | (C++20 起) |
constexpr /*outer_iterator*/( Parent& parent, ranges::iterator_t<Base> current ) |
(3) | (C++20 起) |
constexpr /*outer_iterator*/( /*outer_iterator*/<!Const> i ) requires Const && std::convertible_to<ranges::iterator_t<V>, |
(4) | (C++20 起) |
- parent_ = nullptr;,
- current_ = iterator_t<Base>(); (僅當
V
建模forward_range
時存在),
parent_
,用 std::move(i.current_) 初始化 current_
,並用 t.trailing_empty_ 初始化 trailing_empty_
。trailing_empty_
用其預設成員初始化器初始化為 false。
std::ranges::lazy_split_view::outer_iterator ::operator*
constexpr value_type operator*() const; |
(C++20 起) | |
等價於 return value_type{*this};。
std::ranges::lazy_split_view::outer_iterator ::operator++
constexpr /*outer_iterator*/& operator++(); |
(1) | (C++20 起) |
constexpr decltype(auto) operator++(int); |
(2) | (C++20 起) |
const auto end = ranges::end(parent_->base_); if (/*cur*/() == end) { trailing_empty_ = false; return *this; } const auto [pbegin, pend] = ranges::subrange{parent_->pattern_}; if (pbegin == pend) ++/*cur*/(); else if constexpr (/*tiny_range*/<Pattern>) { /*cur*/() = ranges::find(std::move(/*cur*/()), end, *pbegin); if (/*cur*/() != end) { ++/*cur*/(); if (/*cur*/() == end) trailing_empty_ = true; } } else { do { auto [b, p] = ranges::mismatch(/*cur*/(), end, pbegin, pend); if (p == pend) { /*cur*/() = b; if (/*cur*/() == end) trailing_empty_ = true; break; // The pattern matched; skip it } } while (++/*cur*/() != end); } return *this;
if constexpr (ranges::forward_range<Base>) { auto tmp = *this; ++*this; return tmp; } else { ++*this; // no return statement }
std::ranges::lazy_split_view::outer_iterator ::cur ()
constexpr auto& /*cur*/() noexcept; |
(1) | (C++20 起) (僅作說明*) |
constexpr auto& /*cur*/() const noexcept; |
(2) | (C++20 起) (僅作說明*) |
此便利成員函式從 /*outer_iterator*/::operator++()、非成員 operator==(const /*outer_iterator*/&, std::default_sentinel_t) 以及 inner_iterator
的可能實現的一些成員函式中引用。
if constexpr (ranges::forward_range<V>) return current_; else return *parent->current_;
[編輯] 非成員函式
operator== (C++20) |
比較底層迭代器或底層迭代器和 std::default_sentinel (函式) |
operator==(std::ranges::split_view::outer_iterator)
friend constexpr bool operator==( const /*outer_iterator*/& x, const /*outer_iterator*/& y ) |
(1) | (C++20 起) |
friend constexpr bool operator==( const /*outer_iterator*/& x, std::default_sentinel_t ); |
(2) | (C++20 起) |
!=
運算子由 operator==
合成。
這些函式對普通的 非限定查詢 或 限定查詢 不可見,並且只有當 std::ranges::split_view::outer_iterator
是引數的關聯類時,才能透過 實參依賴查詢 找到。
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 3904 | C++20 | 建構函式 (4) 中未初始化 trailing_empty_ |
已初始化 |