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) 一种范围适配器,表示基础序列中满足谓词的元素所构成的视图,不包含不满足谓词的元素。
filter_view 在底层bidirectional_range、forward_range、input_range 和 common_range 概念被各自的视图 V所模拟时,它也模拟这些概念。
数据成员
| 成员 | 描述 | ||||
V base_ (私有)
|
底层视图 (仅用于阐述的成员对象*) | ||||
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
的元素
(类模板) (范围适配器对象) |