std::ranges::lazy_split_view<V, Pattern>::outer_iterator
template< bool Const > struct /*outer_iterator*/; |
(自 C++20 起) (仅供说明*) |
|
lazy_split_view::begin
和 lazy_split_view::end
的返回值类型(当底层视图为 common_range
和 forward_range
时)。
如果 V
或 Pattern
不是 简单视图(例如,如果 ranges::iterator_t<const V> 无效或与 ranges::iterator_t<V> 不同),则对于从 const 重载返回的迭代器,Const
为 true,否则为 false。如果 V
是一个简单视图,则当且仅当 V
为 forward_range
时,Const
为 true。
[edit] 成员类型
成员 | 定义 |
父级
|
maybe-const <Const, ranges::lazy_split_view>(仅供说明的成员类型*) |
基类
|
maybe-const <Const, V>(仅供说明的成员类型*) |
iterator_concept (C++20) |
std::forward_iterator_tag 如果 Base 模仿 forward_range ,否则为 std::input_iterator_tag |
iterator_category (C++20)(条件存在) |
std::input_iterator_tag 如果 Base 模仿 forward_range 。否则不存在。 |
(C++20) |
outer_iterator 的值类型(公共成员类) |
difference_type (C++20) |
ranges::range_difference_t<Base> |
[edit] 数据成员
成员 | 定义 |
Parent* parent_ (private) |
指向父级对象 lazy_split_view 的指针(仅供说明的成员对象*) |
ranges::iterator_t<Base> current_ (private)(仅当 V 模仿 forward_range 时存在)
|
底层 view 中的迭代器(仅供说明的成员对象*) |
bool trailing_empty_ (private) |
一个标志,指示是否到达了空尾部子范围(如果有) (仅供说明的成员对象*) |
[edit] 成员函数
(构造函数) (C++20) |
构造一个迭代器 (公共成员函数) |
operator* (C++20) |
返回当前子范围 (公共成员函数) |
operator++operator++(int) (C++20) |
推进迭代器 (公共成员函数) |
cur (C++20) |
有条件地返回对 current_ (如果存在)或对 *parent_->current_ 的引用(仅供说明的成员函数*) |
[edit] 成员函数
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_;
[edit] 非成员函数
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
是参数的关联类时,通过 参数相关查找 找到。
[edit] 缺陷报告
以下行为更改缺陷报告已追溯应用于之前发布的 C++ 标准。
DR | 应用于 | 已发布的行为 | 正确行为 |
---|---|---|---|
LWG 3904 | C++20 | trailing_empty_ 未在构造函数 (4) 中初始化 |
已初始化 |