命名空间
变体
操作

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

来自 cppreference.com
 
 
范围库
范围适配器
 
 
template< bool Const >
struct /*outer_iterator*/;
(自 C++20 起)
(仅供说明*)

lazy_split_view::beginlazy_split_view::end 的返回值类型(当底层视图为 common_rangeforward_range 时)。

如果 VPattern 不是 简单视图(例如,如果 ranges::iterator_t<const V> 无效或与 ranges::iterator_t<V> 不同),则对于从 const 重载返回的迭代器,Consttrue,否则为 false。如果 V 是一个简单视图,则当且仅当 Vforward_range 时,Consttrue

内容

[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。否则不存在。
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 )

    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_;

[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 )

      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 是参数的关联类时,通过 参数相关查找 找到。

[edit] 缺陷报告

以下行为更改缺陷报告已追溯应用于之前发布的 C++ 标准。

DR 应用于 已发布的行为 正确行为
LWG 3904 C++20 trailing_empty_ 未在构造函数 (4) 中初始化 已初始化