名稱空間
變體
操作

std::ranges::views::filter, std::ranges::filter_view

來自 cppreference.com
< cpp‎ | ranges
 
 
範圍庫 (Ranges library)
範圍介面卡 (Range adaptors)
 
 
定義於標頭檔案 <ranges>
template< ranges::input_range V,

          std::indirect_unary_predicate<ranges::iterator_t<V>> Pred >
    requires ranges::view<V> && std::is_object_v<Pred>
class filter_view

    : public ranges::view_interface<filter_view<V, Pred>>
(1) (C++20 起)
namespace views {

    inline constexpr /* unspecified */ filter = /* unspecified */;

}
(2) (C++20 起)
呼叫簽名 (Call signature)
template< ranges::viewable_range R, class Pred >

    requires /* 見下文 */

constexpr ranges::view auto filter( R&& r, Pred&& pred );
(C++20 起)
template< class Pred >
constexpr /* range adaptor closure */ filter( Pred&& pred );
(C++20 起)
1) 一個範圍介面卡,它表示一個底層序列的view,不包含不滿足謂詞的元素。
2) RangeAdaptorObject。表示式views::filter(e, p)表示式等價filter_view(e, p),適用於任何合適的子表示式ep

當底層view V 模擬相應的概念時,filter_view 模擬bidirectional_rangeforward_rangeinput_rangecommon_range的概念。

目錄

[編輯] 資料成員

成員 描述
V base_ (私有) 底層檢視
(僅用於闡釋的成員物件*)
copyable-box<Pred>(C++23前)movable-box<Pred>(C++23起) pred_ (私有) 包裝用於過濾 base_ 元素的謂詞
(僅用於闡釋的成員物件*)
non-propagating-cache<ranges::iterator_t<V>> begin_ (私有)
(僅當 V 滿足forward_range時存在)
一個物件,用於快取指向 base_ 中滿足 pred_ 的第一個元素的迭代器
(僅用於闡釋的成員物件*)

[編輯] 成員函式

構造一個 filter_view
(公開成員函式)
返回底層檢視 V
(公開成員函式)
返回 filter_view 中儲存的謂詞的引用
(公開成員函式)
返回 filter_view 的起始迭代器
(公開成員函式)
返回 filter_view 的哨兵
(公開成員函式)
繼承自 std::ranges::view_interface
返回派生檢視是否為空,僅當它滿足sized_rangeforward_range時提供
(std::ranges::view_interface<D> 的公共成員函式) [編輯]
(C++23)
返回範圍開頭的常量迭代器
(std::ranges::view_interface<D> 的公共成員函式) [編輯]
(C++23)
返回範圍常量迭代器的哨兵
(std::ranges::view_interface<D> 的公共成員函式) [編輯]
返回派生檢視是否非空,僅當 ranges::empty 適用於它時提供
(std::ranges::view_interface<D> 的公共成員函式) [編輯]
返回派生檢視中的第一個元素,如果它滿足 forward_range 則提供
(std::ranges::view_interface<D> 的公共成員函式) [編輯]
返回派生檢視中的最後一個元素,僅當它滿足bidirectional_rangecommon_range時提供
(std::ranges::view_interface<D> 的公共成員函式) [編輯]

std::ranges::filter_view::filter_view

filter_view() requires std::default_initializable<V> &&
                       std::default_initializable<Pred> = default;
(1) (C++20 起)
constexpr explicit filter_view( V base, Pred pred );
(2) (C++20 起)
1) 透過其預設成員初始化器 (= V()) 值初始化 base_,並預設初始化 pred_ (其值初始化包含的 Pred)。
2)std::move(base) 初始化 base_,並用 std::move(pred) 初始化 pred_

引數

base - 要過濾的範圍
pred - 用於過濾元素的謂詞

std::ranges::filter_view::base

constexpr V base() const& requires std::copy_constructible<V>;
(1) (C++20 起)
constexpr V base() &&;
(2) (C++20 起)
1) 等價於 return base_;
2) 等價於 return std::move(base_);

std::ranges::filter_view::pred

constexpr const Pred& pred() const;
(C++20 起)

返回所包含的 Pred 物件的引用。如果 pred_ 不包含值,則行為未定義。

std::ranges::filter_view::begin

constexpr /*iterator*/ begin();
(僅作說明*)

為了提供range概念所要求的攤銷常數時間複雜度,此函式會在 filter_view 物件中快取結果,以供後續呼叫使用。等價於

if constexpr (!ranges::forward_range<V>)
    return /*iterator*/{*this, ranges::find_if(base_, std::ref(*pred_))};
else
{
    if (!begin_.has_value())
        begin_ = ranges::find_if(base_, std::ref(*pred_)); // caching
    return /*iterator*/{*this, begin_.value())};
}

如果 pred_ 不包含值,則行為未定義。

std::ranges::filter_view::end

constexpr auto end();
(C++20 起)

返回一個指向末尾的迭代器。等價於

if constexpr (ranges::common_range<V>)
    return /*iterator*/{*this, ranges::end(base_)};
else
    return /*sentinel*/{*this};

[編輯] 推導指南

template< class R, class Pred >
filter_view( R&&, Pred ) -> filter_view<views::all_t<R>, Pred>;
(C++20 起)

[編輯] 巢狀類

filter_view 的迭代器型別
(僅用於說明的成員類*)
當底層檢視不是common_range時,filter_view 的哨兵型別
(僅用於說明的成員類*)

[編輯] 示例

#include <iostream>
#include <ranges>
 
int main()
{
    auto even = [](int i) { return 0 == i % 2; };
    auto square = [](int i) { return i * i; };
 
    for (int i : std::views::iota(0, 6)
               | std::views::filter(even)
               | std::views::transform(square))
        std::cout << i << ' ';
    std::cout << '\n';
}

輸出

0 4 16

[編輯] 缺陷報告

下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
LWG 3714
(P2711R1)
C++20 多引數建構函式不是顯式的 改為 explicit
P2325R3 C++20 如果 Pred 不是default_initializable,則預設建構函式
構造的 filter_view 不包含 Pred
filter_view
不可default_initializable

[編輯] 另見

一個view,由另一個view的初始元素組成,直到第一個謂詞返回false的元素
(類模板) (範圍介面卡物件)[編輯]