std::ranges::lazy_split_view<V, Pattern>::outer_iterator
来自cppreference.com
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。
成员类型
| 成员 | 定义 |
Parent
|
maybe-const <Const, ranges::lazy_split_view>(仅用于阐述的成员类型*) |
Base
|
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
<tbody> </tbody> /*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*
<tbody> </tbody> constexpr value_type operator*() const; |
(C++20 起) | |
等价于 return value_type{*this};。
std::ranges::lazy_split_view::outer_iterator ::operator++
<tbody> </tbody> 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; // 已匹配模式;跳过它
}
} while (++/*cur*/() != end);
}
return *this;
2) 等价于
if constexpr (ranges::forward_range<Base>)
{
auto tmp = *this;
++*this;
return tmp;
}
else
{
++*this; // 没有返回语句
}
std::ranges::lazy_split_view::outer_iterator ::cur ()
<tbody> </tbody>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)
<tbody> </tbody> 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 | trailing_empty_ 在构造函数从中(4)中未初始化
|
初始化 |