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) |
view элементов базовой последовательности, начиная с первого элемента, для которого предикат возвращает false.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_ (закрытый) | базовое представление (объект-член, используемый только для описания) |
||||
pred_ (закрытый) | базовый функциональный объект (объект-член, используемый только для описания) |
||||
non-propagating-cache<ranges::iterator_t<V>> cache_ (закрытый) (присутствует, только если V удовлетворяет forward_range) | объект, кэширующий результат begin()(объект-член, используемый только для описания) |
Функции-члены
создаёт drop_while_view (открытая функция-член) |
|
| возвращает копию базового (адаптированного) представления (открытая функция-член) |
|
| возвращает ссылку на сохранённый предикат (открытая функция-член) |
|
| возвращает итератор начала (открытая функция-член) |
|
| возвращает итератор или sentinel конца (открытая функция-член) |
|
Унаследовано от |
|
возвращает, является ли производное представление пустым; предоставляется, только если оно удовлетворяет sized_range или forward_range (открытая функция-член std::ranges::view_interface<D>) |
|
|
(C++23) | возвращает константный итератор начала диапазона (открытая функция-член std::ranges::view_interface<D>) |
|
(C++23) | возвращает sentinel для константного итератора диапазона (открытая функция-член std::ranges::view_interface<D>) |
возвращает, не является ли производное представление пустым; предоставляется, только если к нему применимо ranges::empty (открытая функция-член std::ranges::view_interface<D>) |
|
получает адрес данных производного представления; предоставляется, только если тип его итератора удовлетворяет contiguous_iterator (открытая функция-член std::ranges::view_interface<D>) |
|
возвращает количество элементов в производном представлении. Предоставляется, если оно удовлетворяет forward_range, а его типы sentinel и итератора удовлетворяют 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, если таковым является его базовое представление |
См. также
|
(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