Namespaces
Variants

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

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

Элементы данных

Член Описание
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
(public member function)
возвращает копию базового (адаптированного) представления
(public member function)
возвращает ссылку на сохранённый предикат
(public member function)
возвращает итератор на начало
(public member function)
возвращает итератор или страж на конец
(public member function)
Унаследовано от ranges::view_interface
возвращает, пусто ли производное представление, предоставляется только если оно удовлетворяет sized_range или forward_range
(открытая функция-элемент std::ranges::view_interface<D>)
(C++23)
возвращает константный итератор на начало диапазона
(открытая функция-элемент std::ranges::view_interface<D>)
(C++23)
возвращает страж для константного итератора диапазона
(открытая функция-элемент std::ranges::view_interface<D>)
возвращает, не пусто ли производное представление, предоставляется только если к нему применимо ranges::empty
(открытая функция-элемент std::ranges::view_interface<D>)
получает адрес данных производного представления, предоставляется только если тип его итератора удовлетворяет contiguous_iterator
(открытая функция-элемент std::ranges::view_interface<D>)
возвращает количество элементов в производном представлении. Предоставляется, если оно удовлетворяет forward_range и его страж и тип итератора удовлетворяют sized_sentinel_for.
(открытая функция-элемент std::ranges::view_interface<D>)
возвращает первый элемент в производном представлении, предоставляется, если оно удовлетворяет forward_range
(открытая функция-элемент std::ranges::view_interface<D>)
возвращает последний элемент в производном представлении, предоставляется только если оно удовлетворяет bidirectional_range и common_range
(открытая функция-элемент std::ranges::view_interface<D>)
возвращает 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 если его базовое представление является таковым

Смотрите также

представление, view состоящее из элементов другого view , пропускающее первые N элементов
(шаблон класса) (объект адаптера диапазона)