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