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) |
1) Адаптер диапазона, состоящий из элементов базовой последовательности и пропускающий первые N элементов.
2) RangeAdaptorObject. Пусть 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<typenameT::element_type>, если
Tявляется специализацией std::span; -
Tв противном случае;
| (начиная с C++23) |
- в противном случае —
drop_view(e, 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_ (закрытый) | количество пропускаемых элементов (объект-член только для экспозиции*) |
non-propagating-cache<ranges::iterator_t<V>> cache_ (закрытый) (присутствует, только если V удовлетворяет forward_range,но не random_access_range и sized_range) | объект, кэширующий результат вызовов begin()(объект-член только для экспозиции*) |
Функции-члены
создаёт drop_view (открытая функция-член) |
|
| возвращает копию базового (адаптированного) представления (открытая функция-член) |
|
| возвращает итератор на начало (открытая функция-член) |
|
| возвращает итератор или сентинел на конец (открытая функция-член) |
|
возвращает количество элементов; доступна только если базовый (адаптированный) диапазон удовлетворяет sized_range (открытая функция-член) |
|
|
(C++26) | возвращает приблизительный размер результирующего approximately_sized_range (открытая функция-член) |
Наследуется от |
|
возвращает признак пустоты производного представления; доступна, только если оно удовлетворяет 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>> =
ranges::enable_borrowed_range<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';
// Note that dropping more than the number of elements is OK:
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++.
| Отчёт об ошибке | Применён к | Опубликованное поведение | Правильное поведение |
|---|---|---|---|
| LWG 3407 | C++20 |
views::drop иногда не удаётсясоздать диапазон с произвольным доступом и известным размером | конструирование скорректировано так, чтобы оно всегда было корректным |
| LWG 3494 | C++20 |
drop_view никогда не являлся borrowed_range | он является borrowed_range, если таковым является его базовое представление |
См. также
|
(C++20) | view, состоящее из элементов другого view, пропуская начальную подпоследовательность элементов до первого элемента, для которого предикат возвращает false(шаблон класса) (объект-адаптер диапазона) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/ranges/drop_view