名稱空間
變體
操作

std::ranges::lazy_split_view<V, Pattern>::outer_iterator

來自 cppreference.com
 
 
範圍庫 (Ranges library)
範圍介面卡 (Range adaptors)
 
 
template< bool Const >
struct /*outer_iterator*/;
(C++20 起)
(僅作說明*)

返回型別為 lazy_split_view::begin,以及當底層檢視為 common_rangeforward_range 時為 lazy_split_view::end

如果 VPattern 不是 簡單檢視 (例如,如果 ranges::iterator_t<const V> 無效或與 ranges::iterator_t<V> 不同),則對於 const 過載返回的迭代器,Consttrue,否則為 false。如果 V 是簡單檢視,則當且僅當 Vforward_range 時,Consttrue

目錄

[編輯] 成員型別

成員 定義
父類 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 )

    requires ranges::forward_range<Base>;
(3) (C++20 起)
constexpr /*outer_iterator*/( /*outer_iterator*/<!Const> i )

    requires Const && std::convertible_to<ranges::iterator_t<V>,

                                          ranges::iterator_t<Base>>;
(4) (C++20 起)
1) 使用其預設成員初始化器值初始化非靜態資料成員,即
  • parent_ = nullptr;,
  • current_ = iterator_t<Base>(); (僅當 V 建模 forward_range 時存在),
2)std::addressof(parent) 初始化 parent_
3)std::addressof(parent) 初始化 parent_,並用 std::move(current) 初始化 current_
4)i.parent_ 初始化 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 起)
1) 函式體等價於
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;
2) 等價於
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 的可能實現的一些成員函式中引用。

1,2) 等價於
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 )

      requires forward_range<Base>;
(1) (C++20 起)
friend constexpr bool operator==( const /*outer_iterator*/& x,
                                  std::default_sentinel_t );
(2) (C++20 起)
1) 等價於 return x.current_ == y.current_ and x.trailing_empty_ == y.trailing_empty_;
2) 等價於 return x./*cur*/() == ranges::end(x.parent_->base_) and !x.trailing_empty_;

!= 運算子由 operator== 合成

這些函式對普通的 非限定查詢限定查詢 不可見,並且只有當 std::ranges::split_view::outer_iterator 是引數的關聯類時,才能透過 實參依賴查詢 找到。

[編輯] 缺陷報告

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

缺陷報告 應用於 釋出時的行為 正確的行為
LWG 3904 C++20 建構函式 (4) 中未初始化 trailing_empty_ 已初始化