名稱空間
變體
操作

std::ranges::filter_view<V,Pred>::迭代器 (iterator)

來自 cppreference.com
 
 
範圍庫 (Ranges library)
範圍介面卡 (Range adaptors)
 
 
class /*迭代器*/;
(C++20 起)
(僅作說明*)

filter_view::begin 的返回型別。

如果 `V` 滿足 `bidirectional_range`,則此為 `bidirectional_iterator`;如果 `V` 滿足 `forward_range`,則此為 `forward_iterator`;否則為 `input_iterator`

允許修改此迭代器所指向的元素,但如果結果值不滿足過濾器的謂詞,則會導致未定義行為。

目錄

[編輯] 成員型別

型別 定義
迭代器概念 (iterator_concept)
迭代器類別 (iterator_category)
(僅當 `V` 滿足時才存在)
前向範圍 (forward_range))

令 `C` 為型別 std::iterator_traits<ranges::iterator_t<V>>::iterator_category

值型別 (value_type) ranges::range_value_t<V>
差值型別 (difference_type) ranges::range_difference_t<V>

[編輯] 資料成員

成員 描述
ranges::iterator_t<V> current_ (私有) 指向底層 `view` 的迭代器
(僅用於闡釋的成員物件*)
ranges::filter_view<V, Pred>* parent_ (私有) 指向父 `filter_view` 物件的指標
(僅用於闡釋的成員物件*)

[編輯] 成員函式

構造一個迭代器
(公開成員函式)
返回底層迭代器
(公開成員函式)
轉發到底層迭代器
(公開成員函式)
前進迭代器
(公開成員函式)
遞減迭代器
(公開成員函式)

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`,當且僅當 `I` 滿足(或滿足)`input_iterator` 概念(或約束),且 `I` 為指標型別或 requires(I i){ i.operator->();} 為 true 時,/*has-arrow*/<I> 被建模或滿足。

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

constexpr /*迭代器*/& 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;

[編輯] 非成員函式

比較底層迭代器
(函式)
(C++20)
將底層迭代器解引用的結果轉換為其關聯的右值引用型別
(函式)
(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++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
P2259R1 C++20 成員型別 `iterator_category` 始終被定義 僅當 `V` 是 `forward_range` 時定義
LWG 3533 C++20 `base` 的 const& 過載會複製底層迭代器 返回底層迭代器的引用
LWG 3593 C++20 `base` 的 const& 過載可能不是 `noexcept` 的 已改為 noexcept