Spec-Zone.ru › C++

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

Определено в заголовке <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) Адаптер диапазона, представляющий view элементов из базовой последовательности, начиная с первого элемента, для которого предикат возвращает 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>> моделируются.

Члены-функции

(конструктор)
(C++20)
создаёт drop_while_view
(публичная функция-член)
base
(C++20)
возвращает копию базового (адаптированного) вида
(публичная функция-член)
pred
(C++20)
возвращает ссылку на хранящийся предикат
(публичная функция-член)
begin
(C++20)
возвращает итератор начала
(публичная функция-член)
end
(C++20)
возвращает итератор или sentinel конца
(публичная функция-член)
Наследуется от std::ranges::view_interface
empty
(C++20)
возвращает, пуст ли производный вид. Предоставляется, если он удовлетворяет sized_range или forward_range.
(публичная функция-член std::ranges::view_interface<D>)
cbegin
(C++23)
возвращает постоянный итератор начала диапазона.
(публичная функция-член std::ranges::view_interface<D>)
cend
(C++23)
возвращает sentinel для постоянного итератора диапазона.
(публичная функция-член std::ranges::view_interface<D>)
operator bool
(C++20)
возвращает, пуст ли производный вид. Предоставляется, если ranges::empty применимо к нему.
(публичная функция-член std::ranges::view_interface<D>)
data
(C++20)
получает адрес данных производного вида. Предоставляется, если тип его итератора удовлетворяет contiguous_iterator.
(публичная функция-член std::ranges::view_interface<D>)
size
(C++20)
возвращает количество элементов в производном виде. Предоставляется, если он удовлетворяет forward_range, а тип его sentinel и итератора удовлетворяет sized_sentinel_for.
(публичная функция-член std::ranges::view_interface<D>)
front
(C++20)
возвращает первый элемент в производном виде. Предоставляется, если он удовлетворяет forward_range.
(публичная функция-член std::ranges::view_interface<D>)
back
(C++20)
возвращает последний элемент в производном виде. Предоставляется, если он удовлетворяет bidirectional_range и common_range.
(публичная функция-член std::ranges::view_interface<D>)
operator[]
(C++20)
возвращает n-й элемент в производном виде. Предоставляется, если он удовлетворяет random_access_range.
(публичная функция-член std::ranges::view_interface<D>)

Указания вывода типов

Вспомогательные шаблоны

template< class T, class Pred >
inline constexpr bool enable_borrowed_range<std::ranges::drop_while_view<T, Pred>> =
    std::ranges::enable_borrowed_range<T>;
(с C++20)

Эта специализация std::ranges::enable_borrowed_range обеспечивает, что drop_while_view удовлетворяет borrowed_range, когда базовый вид её удовлетворяет.

Примечания

Для обеспечения амортизированной постоянной сложности времени, требуемой концепцией range, результат begin кэшируется внутри объекта drop_while_view. Если базовый диапазон модифицируется после первого вызова begin(), последующее использование объекта drop_while_view может иметь неинтуитивное поведение.

Пример

#include <algorithm>
#include <iomanip>
#include <iostream>
#include <ranges>
#include <string>
#include <string_view>
 
using std::operator""sv;
 
[[nodiscard]]
constexpr bool is_space(char q) noexcept
{
    static constexpr auto ws = {' ', '\t', '\n', '\v', '\r', '\f'};
    return std::ranges::any_of(ws, [q](auto p) { return p == q; });
};
 
[[nodiscard]]
constexpr std::string trim_left(std::string_view const in) noexcept
{
    auto view = in | std::views::drop_while(is_space);
    return {view.begin(), view.end()};
}
 
[[nodiscard]]
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 std::string_view src = " \f\n\t\r\vHello, C++20!\f\n\t\r\v ";
 
    const auto s = trim(src);
    std::cout << "s = " << 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 << ' ';
    std::cout << '\n';
}

Вывод:

s = "Hello, C++20!"
3 4 5

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применено к Поведение, как опубликовано Корректное поведение
LWG 3494 C++20 drop_while_view никогда не был borrowed_range является borrowed_range , если базовый вид является

См. также

ranges::drop_viewviews::drop
(C++20)
a view consisting of elements of another view, skipping the first N elements
(шаблон класса) (адаптер диапазонов)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/ranges/drop_while_view

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API