Namespaces
Variants

std::ranges::views::drop_while, std::ranges::drop_while_view

ja.cppreference.net より
 
 
レンジライブラリ
レンジアダプタ
 
 
ヘッダで定義 <ranges>
template< ranges::view V, class Pred >
    requires ranges::input_range<V> &&
             std::is_object_v<Pred> &&
             std::indirect_unary_predicate<const Pred, ranges::iterator_t<V>>
class drop_while_view
    : public ranges::view_interface<drop_while_view<V, Pred>>
(1) (C++20以降)
namespace views {
    inline constexpr /* unspecified */ drop_while = /* unspecified */;
}
(2) (C++20以降)
呼び出しシグネチャ
template< ranges::viewable_range R, class Pred >
    requires /* see below */
constexpr ranges::view auto drop_while( R&& r, Pred&& pred );
(C++20以降)
template< class Pred >
constexpr /*range adaptor closure*/ drop_while( Pred&& pred );
(C++20以降)
1) 元のシーケンスの要素のビューを表すレンジアダプタであり、述語がfalseを返す最初の要素から始まります。
2) RangeAdaptorObject。式views::drop_while(e, f)は式と等価からdrop_while_view(e, f)、任意の適切な部分式eとfに対して。

drop_while_viewは以下のコンセプトをモデル化します:contiguous_range、random_access_range、bidirectional_range、forward_range、input_range、およびcommon_range、元のビューVがそれぞれのコンセプトをモデル化する場合。また、sized_rangeであれば、ranges::forward_range<V>とstd::sized_sentinel_for<ranges::sentinel_t<V>, ranges::iterator_t<V>>がモデル化されている場合。

データメンバ

メンバ 説明
V base_ (プライベート) 基盤となるビュー
(説明専用メンバオブジェクト*)

copyable-box<Pred>

(C++23まで)

movable-box<Pred>

(C++23以降)
pred_ (プライベート)
基盤となる関数オブジェクト
(説明専用メンバオブジェクト*)
non-propagating-cache<ranges::iterator_t<V>> cache_ (プライベート)
(Vがforward_rangeを満たす場合のみ存在する)
begin()
の結果をキャッシュするオブジェクト(説明専用メンバオブジェクト*)

メンバー関数

drop_while_viewを構築する
(public member function)
基盤となる(アダプトされた)ビューのコピーを返す
(public member function)
保存されている述語への参照を返す
(public member function)
先頭へのイテレータを返す
(public member function)
終端へのイテレータまたはセンチネルを返す
(public member function)
から継承 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>のパブリックメンバ関数)
派生ビューのデータのアドレスを取得します。ただし、そのイテレータ型がcontiguous_iterator
を満たす場合のみ利用可能です。(std::ranges::view_interface<D>のパブリックメンバ関数)
派生ビュー内の要素数を返します。ただし、forward_rangeを満たし、かつその番兵とイテレータ型がsized_sentinel_forを満たす場合のみ利用可能です。
(std::ranges::view_interface<D>のパブリックメンバ関数)
派生ビューの最初の要素を返します。ただし、forward_range
を満たす場合のみ利用可能です。(std::ranges::view_interface<D>のパブリックメンバ関数)
派生ビューの最後の要素を返します。ただし、bidirectional_rangeとcommon_range
を満たす場合のみ利用可能です。(std::ranges::view_interface<D>のパブリックメンバ関数)
派生ビューのn番目の要素を返します。ただし、random_access_range
を満たす場合のみ利用可能です。(std::ranges::view_interface<D>のパブリックメンバ関数)

推論ガイド

ヘルパーテンプレート

template < class T, class Pred >

constexpr bool enable_borrowed_range < std :: ranges :: drop_while_view < T, Pred >> =

ranges:: enable_borrowed_range < T > ;
(C++20以降)

std :: ranges:: enable_borrowed_range のこの特殊化は、基になるビューが borrowed_range を満たす場合に、 drop_while_view が borrowed_range を満たすようにします。

注記

range コンセプトが要求する償却定数時間計算量を提供するために、 begin の結果は drop_while_view オブジェクト内にキャッシュされます。基になる範囲が begin() の最初の呼び出し後に変更された場合、 drop_while_view オブジェクトの後続の使用は直感的でない動作をする可能性があります。

例

#include <iostream>
#include <ranges>
#include <string>
#include <string_view>
using std::operator""sv;
[[nodiscard]]
constexpr bool is_space(char p) noexcept
{
    auto ne = [p](auto q) { return p != q; };
    return !!(" \t\n\v\r\f" | std::views::drop_while(ne));
};
[[nodiscard("trims the output")]]
constexpr std::string_view trim_left(std::string_view const in) noexcept
{
    auto view = in | std::views::drop_while(is_space);
    return {view.begin(), view.end()};
}
[[nodiscard("trims the output")]]
constexpr std::string trim(std::string_view const in)
{
    auto view = in
              | std::views::drop_while(is_space)
              | std::views::reverse
              | std::views::drop_while(is_space)
              | std::views::reverse
              ;
    return {view.begin(), view.end()};
}
int main()
{
    static_assert(trim_left(" \n C++23") == "C++23"sv);
    constexpr auto src{" \f\n\t\r\vHello, C++20!\f\n\t\r\v "sv};
    static_assert(trim(src) == "Hello, C++20!");
    static constexpr auto v = {0, 1, 2, 3, 4, 5};
    for (int n : v | std::views::drop_while([](int i) { return i < 3; }))
        std::cout << n << ' ';
    std::cout << '\n';
}

出力:

3 4 5

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 3494 C++20 drop_while_view は決して borrowed_range ではなかった 基になるビューが borrowed_range である場合、それは borrowed_range である

関連項目

別の view の要素からなる view 。最初のN個の要素をスキップする
(クラステンプレート) (レンジアダプタオブジェクト)