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 である。式 views :: filter ( e, p ) は、任意の適切な部分式 e および p に対して 式等価 である filter_view ( e, p ) に等しい。

filter_view は、 bidirectional_range forward_range input_range 、および common_range の各コンセプトを、基盤となる view V がそれぞれのコンセプトをモデルする場合にモデルします。

目次

データメンバ

メンバー 説明
V base_ 基となるビュー
( 説明専用メンバーオブジェクト* )
copyable-box <Pred> (until C++23) movable-box <Pred> (since C++23) pred_ base_ の要素をフィルタリングするために使用される述語をラップする
( 説明専用メンバーオブジェクト* )
non-propagating-cache < ranges:: iterator_t < V >> begin_
( V forward_range を満たす場合のみ存在)
pred_ を満たす base_ の最初の要素へのイテレータをキャッシュするオブジェクト
( 説明専用メンバーオブジェクト* )

メンバー関数

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 member function)
(C++23)
範囲の先頭を指す定数イテレータを返す
( std::ranges::view_interface<D> のpublic member function)
(C++23)
範囲の定数イテレータ用センチネルを返す
( std::ranges::view_interface<D> のpublic member function)
派生ビューが空でないかどうかを返す( ranges::empty が適用可能な場合のみ提供)
( std::ranges::view_interface<D> のpublic member function)
派生ビューの最初の要素を返す( forward_range を満たす場合に提供)
( std::ranges::view_interface<D> のpublic member function)
派生ビューの最後の要素を返す( bidirectional_range かつ common_range を満たす場合のみ提供)
( std::ranges::view_interface<D> のpublic member function)

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) 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) base_ を返すことに等しい。
2) std::move(base_) を返すことに等しい。

(注:指定されたテキストブロック内に翻訳対象となる実際のテキストコンテンツが含まれていないため、HTML構造のみを保持した状態で出力しています)

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_)); // キャッシング
    return /*iterator*/{*this, begin_.value())};
}

pred_ が値を保持していない場合、動作は未定義です。

(注:指定されたテキストブロック内に翻訳対象となる可読テキストが存在しないため、HTML構造はそのまま保持されています)

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以降)
HTMLタグ、属性、コードブロック内のテキストは翻訳せず、元のフォーマットを保持しました。C++固有の用語も翻訳せず、唯一「(since C++20)」を「(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ではなかった explicitに変更
P2325R3 C++20 Pred default_initializable でない場合、デフォルトコンストラクタは
Pred を含まない filter_view を構築する
filter_view も同様に
default_initializable ではない

関連項目

別の view の先頭要素から、述語が false を返す最初の要素までを含む view
(クラステンプレート) (レンジアダプタオブジェクト)