std::ranges::views::drop_while,std::ranges::drop_while_view -
std::ranges::views::drop_while,std::ranges::drop_while_view
Defined in header <ranges>
template< ranges::view V, class Pred >
requires ranges::input_range<V> &&
std::is_object_v<Pred> && (1) (since C++20)
std::indirect_unary_predicate<const Pred,
ranges::iterator_t<V>>
class drop_while_view : public
ranges::view_interface<drop_while_view<V, Pred>>
namespace views {
inline constexpr /*unspecified*/ drop_while = /*unspecified*/; (2)
(since C++20)
}
Call signature
template< ranges::viewable_range R, class Pred >
requires /* see below */ (since C++20)
constexpr ranges::view auto drop_while( R&& r, Pred&& pred );
template< class Pred > (since C++20)
constexpr /*range adaptor closure*/ drop_while( Pred&& pred );
1) A range adaptor that represents view of elements from an underlying
sequence,
beginning at the first element for which the predicate returns false.
2) Range adaptor objects. The expression views::drop_while(e, f) is
expression-equivalent to drop_while_view(e, f) for any suitable
subexpressions e and
f.
drop_while_view models the concepts contiguous_range, random_access_range,
bidirectional_range, forward_range, input_range, and common_range when the
underlying view V models respective concepts. It also models sized_range if
ranges::forward_range<V> and
std::sized_sentinel_for<ranges::sentinel_t<V>,
ranges::iterator_t<V>> are modeled.
Expression-equivalent
Expression e is expression-equivalent to expression f, if
* e and f have the same effects, and
* either both are constant subexpressions or else neither is a constant
subexpression, and
* either both are potentially-throwing or else neither is
potentially-throwing
(i.e. noexcept(e) == noexcept(f)).
constructor constructs a drop_while_view
(C++20) (public member function)
base returns a copy of the underlying (adapted) view
(C++20) (public member function)
pred returns a reference to the stored predicate
(C++20) (public member function)
begin returns an iterator to the beginning
(C++20) (public member function)
end returns an iterator or a sentinel to the end
(C++20) (public member function)
Inherited from std::ranges::view_interface
empty Returns whether the derived view is empty. Provided if it satisfies
(C++20) sized_range or forward_range.
(public member function of std::ranges::view_interface<D>)
operator bool Returns whether the derived view is not empty. Provided if
(C++20) ranges::empty is applicable to it.
(public member function of std::ranges::view_interface<D>)
data Gets the address of derived view's data. Provided if its iterator type
(C++20) satisfies contiguous_iterator.
(public member function of std::ranges::view_interface<D>)
Returns the number of elements in the derived view. Provided if it
size satisfies forward_range and its sentinel and iterator type satisfy
(C++20) sized_sentinel_for.
(public member function of std::ranges::view_interface<D>)
front Returns the first element in the derived view. Provided if it
(C++20) satisfies forward_range.
(public member function of std::ranges::view_interface<D>)
back Returns the last element in the derived view. Provided if it satisfies
(C++20) bidirectional_range and common_range.
(public member function of std::ranges::view_interface<D>)
operator[] Returns the nth element in the derived view. Provided if it
satisfies
(C++20) random_access_range.
(public member function of std::ranges::view_interface<D>)
Deduction guides
Helper templates
template<class T, class Pred>
inline constexpr bool
enable_borrowed_range<std::ranges::drop_while_view<T, (since
Pred>> = C++20)
std::ranges::enable_borrowed_range<T>;
This specialization of std::ranges::enable_borrowed_range makes
drop_while_view
satisfy borrowed_range when the underlying view satisfies it.
In order to provide the amortized constant time complexity
required by the range
concept, the result of begin is cached within the drop_while_view object. If
the
underlying range is modified after the first call to begin(), subsequent uses
of the
drop_while_view object might have unintuitive behavior.
// Run this code
#include <cctype>
#include <iomanip>
#include <iostream>
#include <ranges>
#include <string>
#include <string_view>
std::string trim(std::string_view const in)
{
auto view
= in
| std::views::drop_while(isspace)
| std::views::reverse
| std::views::drop_while(isspace)
| std::views::reverse
;
return {view.begin(), view.end()};
}
int main()
{
const auto s = trim(" \f\n\t\r\vHello, C++20!\f\n\t\r\v ");
std::cout << std::quoted(s) << '\n';
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 << ' ';
}
}
"Hello, C++20!"
3 4 5
Defect reports
The following behavior-changing defect reports were applied retroactively to
previously published C++ standards.
DR Applied to Behavior as published Correct behavior
LWG 3494 C++20 drop_while_view was never a it is a borrowed_range if its
borrowed_range underlying view is
ranges::drop_view a view consisting of elements of another view,
skipping the first
views::drop N elements
(C++20) (class template) (range adaptor object)