Namespaces
Variants

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

来自 zh.cppreference.net
 
 
范围库
范围适配器
 
 
定义于头文件 <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 起)
调用签名
template< ranges::viewable_range R, class Pred >
    requires /* see below */
constexpr ranges::view auto filter( R&& r, Pred&& pred );
(C++20 起)
template< class Pred >
constexpr /* range adaptor closure */ filter( Pred&& pred );
(C++20 起)
1) 一种范围适配器,表示基础序列中满足谓词的元素所构成的视图,不包含不满足谓词的元素。
2) RangeAdaptorObject。表达式 views::filter(e, p) 与 表达式等价于 filter_view(e, p),对于任何合适的子表达式 e 和 p。

filter_view 在底层bidirectional_range、forward_range、input_range 和 common_range 概念被各自的视图 V所模拟时,它也模拟这些概念。

数据成员

成员 描述
V base_ (私有) 底层视图
(仅用于阐述的成员对象*)

copyable-box<Pred>

(C++23 前)

movable-box<Pred>

(C++23 起)
pred_ (私有)
包装用于过滤 base_
中元素的谓词(仅用于阐述的成员对象*)
非传播缓存<ranges::iterator_t<V>>
  
begin_ (私有)
(仅当 V 满足 forward_range 时存在)
一个缓存对象,用于缓存指向 base_ 中首个满足 pred_
条件的元素的迭代器(仅用于阐述的成员对象*)

成员函数

构造一个 filter_view
(公开成员函数)
返回底层视图 V
(公开成员函数)
返回存储在 filter_view 内的谓词的引用
(公开成员函数)
返回 filter_view 的起始迭代器
(公开成员函数)
返回 filter_view 的哨兵
(公开成员函数)
继承自 ranges::view_interface
返回派生视图是否为空,仅当它满足 sized_range 或 forward_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_range 和 common_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) (since C++20)
constexpr explicit filter_view ( V base, Pred pred ) ;
(2) (since 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) (since C++20)
constexpr V base ( ) && ;
(2) (since C++20)
1) 等价于 return base_ ; 。
2) 等价于 return std :: move ( base_ ) ; 。

std::ranges::filter_view:: pred

constexpr const Pred & pred ( ) const ;
(since 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 ( ) ;
(since 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 多参数构造函数不是显式的 改为显式
P2325R3 C++20 若 Pred 不满足 default_initializable ,
默认构造函数会构造一个不包含 Pred 的 filter_view
filter_view 同样
不满足 default_initializable

参见

由另一个 view 的初始元素组成的 view ,直至首个谓词返回 false 的元素
(类模板) (范围适配器对象)