std::ranges::views::filter, std::ranges::filter_view
來自 cppreference.com
定義於標頭檔案 <ranges> |
||
template< ranges::input_range V, std::indirect_unary_predicate<ranges::iterator_t<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 /* 見下文 */ |
(C++20 起) | |
template< class Pred > constexpr /* range adaptor closure */ filter( Pred&& pred ); |
(C++20 起) | |
1) 一個範圍介面卡,它表示一個底層序列的
view
,不包含不滿足謂詞的元素。當底層view
V
模擬相應的概念時,filter_view
模擬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) | (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的元素(類模板) (範圍介面卡物件) |