[range.drop.while.view] (original) (raw)

25 Ranges library [ranges]

25.7 Range adaptors [range.adaptors]

25.7.13 Drop while view [range.drop.while]

25.7.13.2 Class template drop_while_view [range.drop.while.view]

namespace std::ranges { template<view V, class Pred> requires input_range<V> && is_object_v<Pred> && indirect_unary_predicate<const Pred, iterator_t<V>> class drop_while_view : public view_interface<drop_while_view<V, Pred>> { public: drop_while_view() requires default_initializable<V> && default_initializable<Pred> = default;constexpr explicit drop_while_view(V base, Pred pred);constexpr V base() const & requires copy_constructible<V> { return base_; } constexpr V base() && { return std::move(base_); } constexpr const Pred& pred() const;constexpr auto begin();constexpr auto end() { return ranges::end(base_); } private: V base_ = V(); movable-box<Pred> pred_; };template<class R, class Pred> drop_while_view(R&&, Pred) -> drop_while_view<views::all_t<R>, Pred>;}

constexpr explicit drop_while_view(V base, Pred pred);

Effects: Initializes base_ with std​::​move(base) and_pred__ with std​::​move(pred).

constexpr const Pred& pred() const;

Effects: Equivalent to: return *pred_;

Preconditions: pred_.has_value() is true.

Returns: ranges​::​find_if_not(base_, cref(*pred_)).

Remarks: In order to provide the amortized constant-time complexity required by the range concept when drop_while_view models forward_range, the first call caches the result within the drop_while_viewfor use on subsequent calls.

[Note 1:

Without this, applying a reverse_view over a drop_while_viewwould have quadratic iteration complexity.

— _end note_]