Namespaces
Variants

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

From cppreference.net
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 /* 未指定 */ filter = /* 未指定 */ ;

}
(2) (C++20 起)
调用签名
template < ranges:: viewable_range R, class Pred >

requires /* 见下文 */

constexpr ranges:: view auto filter ( R && r, Pred && pred ) ;
(C++20 起)
template < class Pred >
constexpr /* 范围适配器闭包 */ filter ( Pred && pred ) ;
(C++20 起)
1) 一个范围适配器,表示仅包含满足谓词的底层序列元素的 view
2) RangeAdaptorObject 。对于任何合适的子表达式 e p ,表达式 views :: filter ( e, p ) filter_view ( e, p ) 表达式等价 的。

filter_view 在底层 view V 满足相应概念时,实现 bidirectional_range forward_range input_range common_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_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 的元素
(类模板) (范围适配器对象)