Namespaces
Variants

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

From cppreference.net
Ranges library
Range adaptors
定義先ヘッダ <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 /* 未規定 */ drop_while = /* 未規定 */ ;

}
(2) (C++20以降)
呼び出しシグネチャ
template < ranges:: viewable_range R, class Pred >

requires /* 下記参照 */

constexpr ranges:: view auto drop_while ( R && r, Pred && pred ) ;
(C++20以降)
template < class Pred >
constexpr /* レンジアダプタクロージャ */ drop_while ( Pred && pred ) ;
(C++20以降)
1) 基となるシーケンスから、述語が false を返す最初の要素から始まる要素の view を表すレンジアダプタ。
2) RangeAdaptorObject 。式 views :: drop_while ( e, f ) は、適切な部分式 e および f に対して 式等価 である drop_while_view ( e, f ) となる。

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

目次

データメンバ

メンバー 説明
V base_ (private) 基となるビュー
( 説明専用メンバーオブジェクト* )
copyable-box <Pred> (until C++23) movable-box <Pred> (since C++23) pred_ (private) 基となる関数オブジェクト
( 説明専用メンバーオブジェクト* )
non-propagating-cache < ranges:: iterator_t < V >> cache_ (private)
( V forward_range を満たす場合のみ存在)
begin() の結果をキャッシュするオブジェクト
( 説明専用メンバーオブジェクト* )

メンバー関数

drop_while_view を構築する
(public member function)
基盤となる(アダプトされた)ビューのコピーを返す
(public member function)
保存されている述語への参照を返す
(public member function)
先頭へのイテレータを返す
(public member function)
終端へのイテレータまたはセンチネルを返す
(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)
派生ビューのデータのアドレスを取得する(そのイテレータ型が contiguous_iterator を満たす場合にのみ提供)
( std::ranges::view_interface<D> のpublic member function)
派生ビューの要素数を返す( forward_range を満たし、かつそのセンチネルとイテレータ型が sized_sentinel_for を満たす場合に提供)
( 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)
派生ビューの n 番目の要素を返す( random_access_range を満たす場合にのみ提供)
( std::ranges::view_interface<D> のpublic member function)

推論ガイド

ヘルパーテンプレート

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個の要素をスキップする
(クラステンプレート) (レンジアダプタオブジェクト)