std::ranges::views::filter, std::ranges::filter_view
From cppreference.com
| ヘッダ <ranges> で定義 |
||
| template< ranges::input_range V, std::indirect_unary_predicate<ranges::iterator_t<V>> Pred > |
(1) | (C++20以降) |
| namespace views { inline constexpr /* 不明 */ filter = /* 不明 */; |
(2) | (C++20以降) |
| 呼び出しシグネチャ |
||
| template< ranges::viewable_range R, class Pred > requires /* 以下を参照 */ |
(C++20以降) | |
| template< class Pred > constexpr /* 範囲アダプタクロージャ */ filter( Pred&& pred ); |
(C++20以降) | |
1) 元のシーケンスから、述語を満たさない要素を除外した
viewを表す範囲アダプタ。filter_viewは、基になるview Vがそれぞれのコンセプトをモデルとする場合、bidirectional_range、forward_range、input_range、およびcommon_rangeのコンセプトをモデル化します。
目次 |
[編集] データメンバ
| メンバ | 説明 |
V base_ (private) |
基盤となるビュー (説明用のメンバオブジェクト*) |
copyable-box<Pred>(C++23まで)movable-box<Pred>(C++23以降) pred_ (private) |
base_から要素を除外するために使用される述語をラップします。(説明用のメンバオブジェクト*) |
non-propagating-cache<ranges::iterator_t<V>> begin_ (private)( Vがforward_rangeを満たす場合のみ存在)
|
base_の、pred_を満たす最初の要素へのイテレータをキャッシュするオブジェクト。(説明用のメンバオブジェクト*) |
[編集] メンバ関数
filter_viewを構築します。(public member function) | |
基本となるビュー V を返す(public member function) | |
filter_view内に格納されている述語への参照を返します。(public member function) | |
filter_viewの開始イテレータを返します。(public member function) | |
filter_viewのセンチネルを返します。(public member function) | |
std::ranges::view_interface から継承 | |
派生ビューが空かどうかを返す。sized_range または forward_range を満たす場合にのみ提供される( std::ranges::view_interface<D> の public メンバ関数) | |
| (C++23) |
範囲の先頭への定数イテレータを返す ( std::ranges::view_interface<D> の public メンバ関数) |
| (C++23) |
範囲の定数イテレータの番兵を返す ( std::ranges::view_interface<D> の public メンバ関数) |
| 派生ビューが空でないかどうかを返す。ranges::empty が適用可能な場合にのみ提供される ( std::ranges::view_interface<D> の public メンバ関数) | |
派生ビューが forward_range を満たす場合に、派生ビューの最初の要素を返す( std::ranges::view_interface<D> の public メンバ関数) | |
派生ビューが bidirectional_range と common_range の両方を満たす場合にのみ、派生ビューの最後の要素を返す( std::ranges::view_interface<D> の public メンバ関数) | |
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)
base_をデフォルトメンバ初期化子(= V())で値初期化し、pred_をデフォルト初期化します(これにより、含まれるPredが値初期化されます)。2)
base_をstd::move(base)で初期化し、pred_をstd::move(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++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 3714 (P2711R1) |
C++20 | 複数引数コンストラクタがexplicitではなかった。 |
明示的にされました |
| P2325R3 | C++20 | Predがdefault_initializableでない場合、デフォルトコンストラクタはPredを含まないfilter_viewを構築します。 |
filter_viewもdefault_initializableではありません。 |
[編集] 関連項目
別のviewの先頭から、述語がfalseを返す最初の要素までの要素からなる view(クラステンプレート) (rangeアダプタオブジェクト) |