名前空間
変種
操作

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

From cppreference.com
< cpp‎ | ranges
 
 
Rangesライブラリ
Rangeアダプタ
 
 
ヘッダ <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は、基になるview Vがそれぞれのコンセプトをモデルとする場合、bidirectional_rangeforward_rangeinput_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)
(Vforward_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_rangecommon_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 Preddefault_initializableでない場合、デフォルトコンストラクタは
Predを含まないfilter_viewを構築します。
filter_view
default_initializableではありません。

[編集] 関連項目

別のviewの先頭から、述語がfalseを返す最初の要素までの要素からなる view
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
English 日本語 中文(简体) 中文(繁體)