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

来自cppreference.com
< cpp‎ | ranges
 
 
范围库
范围适配器
 
 
在标头 <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

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

    inlineconstexpr/* 未指定 */ filter =/* 未指定 */;

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

    requires /* 见下文 */

constexprranges::viewauto filter( R&& r, Pred&& pred );
(C++20 起)
template<class Pred >
constexpr/* 范围适配器闭包 */ filter( Pred&& pred );
(C++20 起)
1) 表示排除了不能满足谓词的元素的底层序列的 view 的范围适配器。
2)范围适配器对象(RangeAdaptorObject) 。对任何适合的子表达式 ep,表达式 views::filter(e, p)表达式等价filter_view(e, p)

filter_view 在底层 viewV 实现 bidirectional_rangeforward_rangeinput_rangecommon_range 时分别实现相应的概念。

目录

[编辑]数据成员

成员 描述
Vbase_(私有) 底层视图
(仅用于阐述的成员对象*)
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
返回视图是否为空,仅当视图满足 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_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 起)
constexprexplicit 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

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

返回到包含的 Pred 对象的引用。如果 pred_ 没有包含值,那么行为未定义。

std::ranges::filter_view::begin

constexpr/*iterator*/ begin();
(仅用于阐述*)

为提供 range 概念所要求的均摊常数时间复杂度,此函数在 filter_view 对象内缓存结果以用于后继调用。等价于

ifconstexpr(!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_));// 缓存return/*iterator*/{*this, begin_.value())};}

如果 pred_ 没有包含值,那么行为未定义。

std::ranges::filter_view::end

constexprauto end();
(C++20 起)

返回指向末尾的迭代器。等价于:

ifconstexpr(ranges::common_range<V>)return/*iterator*/{*this, ranges::end(base_)};elsereturn/*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){return0== 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 如果 Preddefault_initializable
那么默认构造函数构造不含 Predfilter_view
filter_view 也不
default_initializable

[编辑]参阅

由另一 view 的到首个谓词返回 false 为止的起始元素组成的 view
(类模板)(范围适配器对象)[编辑]
close