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) Объект-адаптер диапазона. Выражение 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
(открытая функция-член)
base
возвращает копию базового (адаптированного) представления
(открытая функция-член)
pred
возвращает ссылку на сохранённый предикат
(открытая функция-член)
begin
возвращает итератор начала
(открытая функция-член)
end
возвращает итератор или sentinel конца
(открытая функция-член)
Унаследовано от std::ranges::view_interface
empty
возвращает, является ли производное представление пустым; предоставляется, только если оно удовлетворяет 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
возвращает, не является ли производное представление пустым; предоставляется, только если к нему применимо ranges::empty
(открытая функция-член std::ranges::view_interface<D>)
data
получает адрес данных производного представления; предоставляется, только если тип его итератора удовлетворяет contiguous_iterator
(открытая функция-член std::ranges::view_interface<D>)
size
возвращает количество элементов в производном представлении. Предоставляется, если оно удовлетворяет forward_range, а его типы sentinel и итератора удовлетворяют sized_sentinel_for.
(открытая функция-член std::ranges::view_interface<D>)
front
возвращает первый элемент производного представления; предоставляется, если оно удовлетворяет forward_range
(открытая функция-член std::ranges::view_interface<D>)
back
возвращает последний элемент производного представления; предоставляется, только если оно удовлетворяет bidirectional_range и common_range
(открытая функция-член std::ranges::view_interface<D>)
operator[]
возвращает 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 позволяет 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, если таковым является его базовое представление

См. также

ranges::drop_viewviews::drop
(C++20)
представление view, состоящее из элементов другого view без первых N элементов
(шаблон класса) (объект-адаптер диапазона)

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

Spec-Zone.ru

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