# std::ranges::filter_view<V,Pred>::iterator

< cpp‎ | ranges‎ | filter view

class /*iterator*/; // 仅用于阐释 |  | (C++20 起)

`filter_view::begin` 的返回类型。名称 `iterator` 仅用于阐释目的。

若 V 实现 `bidirectional_range` 则这是 `bidirectional_iterator` ，若 V 实现 `forward_range` 则这是 `forward_iterator` ，否则是 `input_iterator` 。

容许修改此迭代器所指向的元素，但若结果值不满足滤的谓词则导致未定义行为。

### 成员类型

成员类型 | 定义
`iterator_concept` | 若 V 实现 `bidirectional_range` 则为 std::bidirectional_iterator_tag ， 若 V 实现 `forward_iterator` 则为 std::forward_iterator_tag ， 否则为 std::input_iterator_tag 。
`iterator_category` | 当且仅当 V 实现 `forward_range` 才定义。 令 C 为类型 std::iterator_traits<ranges::iterator_t<V>>​::​iterator_category 。 若 C 实现 std::derived_from<std::bidirectional_iterator_tag> 则为 std::bidirectional_iterator_tag ， 若 C 实现 std::forward_iterator_tag 则为 std::derived_from<std::forward_iterator_tag> ， 否则为 C 。
`value_type` | ranges::range_value_t<V>
`difference_type` | ranges::range_difference_t<V>

### 数据成员

`iterator` 的典型实现保有二个非静态数据成员：

- ranges::iterator_t<V> 类型迭代器，指向底层 `view` 中（此处示为 `current_` ，仅为阐释），及
- ranges::filter_view<V, Pred>* 指针，指向亲 `filter_view` 对象（此处示为 `parent_` ，仅为阐释）。

### 成员函数

(构造函数) (C++20) | 构造迭代器 (公开成员函数)
base (C++20) | 返回底层迭代器 (公开成员函数)
operator*operator-> (C++20) | 转发到底层迭代器 (公开成员函数)
operator++operator++(int)operator--operator--(int) (C++20) | 推进或自减迭代器 (公开成员函数)

## std::ranges::filter_view::iterator::iterator

/*iterator*/() requires std::default_initializable<ranges::iterator_t<V>> = default; | (1) | (C++20 起)
constexpr /*iterator*/( filter_view& parent, ranges::iterator_t<V> current ); | (2) | (C++20 起)

1) 分别以其默认成员初始化器初始化 `current_` 与 `parent_` ，它们分别为 = ranges::iterator_t<V>() 与 = nullptr 。
2) 以 std​::​move(current) 初始化 `current_` 并以 std::addressof(parent) 初始化 `parent_` 。

## std::ranges::filter_view::iterator::base

constexpr const ranges::iterator_t<V>& base() const & noexcept; | (1) | (C++20 起)
constexpr ranges::iterator_t<V> base() &&; | (2) | (C++20 起)

1) 等价于 return current_; 。
2) 等价于 return std​::​move(current_); 。

## std::ranges::filter_view::iterator::operator*,->

constexpr ranges::range_reference_t<V> operator*() const; | (1) | (C++20 起)
constexpr ranges::iterator_t<V> operator->() const requires /*has-arrow*/<ranges::iterator_t<V>> && std::copyable<ranges::iterator_t<V>>; | (2) | (C++20 起)

1) 等价于 return *current_; 。
2) 等价于 return current_; 。
对于 `I` ， /*has-arrow*/<I> 得到实现或满足，当且仅当 `I` 分别实现或满足 `input_iterator` ，并且 `I` 为指针类型或 requires(I i){ i.operator->(); } 为 true 。

## std::ranges::filter_view::iterator::operator++

constexpr /*iterator*/& operator++(); | (1) | (C++20 起)
constexpr void operator++( int ); | (2) | (C++20 起)
constexpr /*iterator*/ operator++( int ) requires ranges::forward_range<V>; | (3) | (C++20 起)

1) 等价于
current_ = ranges::find_if(std::move(++current_), ranges::end(parent_->base_),

std::ref(*parent_->pred_));

return *this; 。
2) 等价于 ++*this; 。
3) 等价于 auto tmp = *this; ++*this; return tmp; 。

## std::ranges::filter_view::iterator::operator--

constexpr /*iterator*/& operator--() requires ranges::bidirectional_range<V>; | (1) | (C++20 起)
constexpr /*iterator*/ operator--( int ) requires ranges::bidirectional_range<V>; | (2) | (C++20 起)

1) 等价于
do

--current_;
while (!std::invoke(*parent_->pred_, *current_));

return *this; 。
2) 等价于 auto tmp = *this; --*this; return tmp; 。

### 非成员函数

operator== (C++20) | 比较底层迭代器 (函数)
iter_move (C++20) | 将解引用底层迭代器的结果转型到其关联右值引用类型 (函数)
iter_swap (C++20) | 交换二个底层迭代器所指向的对象 (函数)

## operator==(std::ranges::filter_view::iterator)

friend constexpr bool operator==( const /*iterator*/& x, const /*iterator*/& y ) requires std::equality_comparable<ranges::iterator_t<V>>; |  | (C++20 起)

等价于 return x.current_ == y.current_; 。

`!=` 运算符从 `operator==` 合成。

此函数对通常无限定或有限定查找不可见，而只能在 `std::ranges::filter_view::iterator` 为参数的关联类时由实参依赖查找找到。

## iter_move(std::ranges::filter_view::iterator)

friend constexpr ranges::range_rvalue_reference_t<V> iter_move( const /*iterator*/& i ) noexcept(noexcept(ranges::iter_move(i.current_))); |  | (C++20 起)

等价于 return ranges​::​iter_move(i.current_);。

此函数对通常无限定或有限定查找不可见，而只能在 `std::ranges::filter_view::iterator` 为参数的关联类时由实参依赖查找找到。

## iter_swap(std::ranges::filter_view::iterator)

friend constexpr void iter_swap( const /*iterator*/& x, const /*iterator*/& y ) noexcept(noexcept(ranges::iter_swap(x.current_, y.current_))) requires std::indirectly_swappable<ranges::iterator_t<V>>; |  | (C++20 起)

等价于 ranges​::​iter_swap(x.current_, y.current_) 。

此函数对通常无限定或有限定查找不可见，而只能在 `std::ranges::filter_view::iterator` 为参数的关联类时由实参依赖查找找到。

### 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

DR | 应用于 | 出版时的行为 | 正确行为
--- | --- | --- | ---
P2259R1 | C++20 | 始终定义成员类型 `iterator_category` | 仅若 `V` 为 `forward_range` 才定义
LWG 3533 | C++20 | `base` 的 const& 重载复制底层迭代器 | 返回到它的引用
LWG 3593 | C++20 | `base` 的 const& 重载可能不是 noexcept | 使之为 noexcept