std::ranges::views::drop, std::ranges::drop_view
| Определён в заголовке <ranges>
|
||
template< ranges::view V >
class drop_view
: public ranges::view_interface<drop_view<V>>
|
(1) | (начиная с C++20) |
namespace views {
inline constexpr /* unspecified */ drop = /* unspecified */;
}
|
(2) | (начиная с C++20) |
| Сигнатура вызова |
||
template< ranges::viewable_range R >
requires /* see below */
constexpr ranges::view auto
drop( R&& r, ranges::range_difference_t<R> count );
|
(начиная с C++20) | |
template< class DifferenceType >
constexpr /* range adaptor closure */ drop( DifferenceType&& count );
|
(начиная с C++20) | |
T является std::remove_cvref_t<decltype((e))> и D является ranges::range_difference_t<decltype((e))>), то выражение views::drop(e, f) является эквивалентным выражению:
((void)f,decay-copy(e)), еслиTявляется ranges::empty_view, за исключением того, что вычисленияeиfнеопределённо последовательны;- иначе,
T(ranges::begin(e) + inc, ranges::end(e),/*to-unsigned-like*/(ranges::distance(e) - inc)), еслиTявляется специализациейranges::subrange, которая моделирует как random_access_range, так и sized_range, иTнеобходимо сохранить размер (подробнее см. ranges::subrange::subrange()), гдеincравноstd::min<D>(ranges::distance(e), f); - иначе,
U(ranges::begin(e) + inc, ranges::end(e)), еслиTявляется специализациейstd::span, std::basic_string_view,ranges::iota_view, илиranges::subrange, которая моделирует как random_access_range, так и sized_range, гдеUравно
std::span<typename T::element_type>, еслиTявляется специализациейstd::span;Tиначе;
|
(начиная с C++23) |
- иначе,
drop_view(e, f).
decltype((f)) должен моделировать std::convertible_to<D>.drop_view моделирует концепции contiguous_range, random_access_range, bidirectional_range, forward_range, input_range, common_range и sized_range, когда базовое представление V моделирует соответствующие концепции.
Элементы данных
| Элемент | Описание |
V base_ (закрытый)
|
базовое представление (объект-член только для пояснения*) |
ranges::range_difference_t<V> count_ (закрытый)
|
количество элементов для пропуска (объект-член только для пояснения*) |
непропагирующий кеш<ranges::iterator_t<V>> cache_ (закрытый) (присутствует только если V удовлетворяет forward_rangeно не random_access_range и sized_range) |
объект, кеширующий результат вызовов к begin()(объект-член только для пояснения*) |
Функции-члены
создаёт
drop_view
(публичная функция-член) |
|
|
возвращает копию базового (адаптированного) представления
(публичная функция-член) |
|
|
возвращает итератор на начало
(публичная функция-член) |
|
|
возвращает итератор или страж на конец
(публичная функция-член) |
|
возвращает количество элементов, предоставляется только если базовый (адаптированный) диапазон удовлетворяет
sized_range
(публичная функция-член) |
|
|
(C++26)
|
возвращает приблизительный размер результирующего
approximately_sized_range
(публичная функция-член) |
Унаследовано от 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 (открытая функция-член класса 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
>
constexpr
bool
enable_borrowed_range
<
std
::
ranges
::
drop_view
<
T
>>
=
|
(начиная с C++20) | |
Эта специализация
ranges::enable_borrowed_range
позволяет
drop_view
удовлетворять требованиям
borrowed_range
, когда базовое представление удовлетворяет им.
Пример
#include <initializer_list> #include <iostream> #include <ranges> int main() { const auto nums = {1, 2, 3, 4, 5, 6, 7}; std::cout << "drop " << 2 << ": "; for (int i : std::ranges::drop_view{nums, 2}) std::cout << i << ' '; std::cout << '\n'; std::cout << "drop " << 3 << ": "; for (int i : nums | std::views::drop(3)) std::cout << i << ' '; std::cout << '\n'; std::cout << "drop " << 4 << ": "; for (int i : std::views::iota(1, 8) | std::views::drop(4)) std::cout << i << ' '; std::cout << '\n'; // Обратите внимание, что отбрасывание большего количества элементов допустимо: for (int dp : {5, 6, 7, 890, 100500}) { std::cout << "drop " << dp << ": "; for (int i : std::views::iota(1, 8) | std::views::drop(dp)) std::cout << i << ' '; std::cout << '\n'; } }
Вывод:
drop 2: 3 4 5 6 7 drop 3: 4 5 6 7 drop 4: 5 6 7 drop 5: 6 7 drop 6: 7 drop 7: drop 890: drop 100500:
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
| LWG 3407 | C++20 |
views::drop
иногда не удается
создать sized random access range |
конструкция скорректирована так,
чтобы она всегда была валидной |
| LWG 3494 | C++20 |
drop_view
никогда не был
borrowed_range
|
он является
borrowed_range
если его базовое представление является таковым
|
Смотрите также
представление,
view
состоящее из элементов другого
view
, пропускающее начальную подпоследовательность элементов до первого элемента, где предикат возвращает
false
(шаблон класса) (объект адаптера диапазона) |