Spec-Zone.ru › C++

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<typename T::element_type>, если T является специализацией std::span;
    • T в противном случае;
  • иначе, если T является специализацией ranges::repeat_view:
    • views::repeat(*e.value_, ranges::distance(e) - inc), если T моделирует sized_range; в таком случае e вычисляется только один раз;
    • ((void)e, auto(f)) в противном случае, за исключением того, что оценки e и f выполняются в неопределённой последовательности;
(с 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 моделирует соответствующие концепции.

Члены-функции

(конструктор)
(C++20)
создаёт drop_view
(публичный член-функция)
base
(C++20)
возвращает копию базового (адаптированного) представления
(публичный член-функция)
begin
(C++20)
возвращает итератор начала
(публичный член-функция)
end
(C++20)
возвращает итератор или маркер конца
(публичный член-функция)
size
(C++20)
возвращает количество элементов. Доступна только если базовый (адаптированный) диапазон удовлетворяет sized_range.
(публичный член-функция)
Унаследовано от std::ranges::view_interface
empty
(C++20)
возвращает, пусто ли производное представление. Доступно, если оно удовлетворяет sized_range или forward_range.
(публичный член-функция std::ranges::view_interface<D>)
cbegin
(C++23)
возвращает константный итератор начала диапазона.
(публичный член-функция std::ranges::view_interface<D>)
cend
(C++23)
возвращает маркер конца для константного итератора диапазона.
(публичный член-функция std::ranges::view_interface<D>)
operator bool
(C++20)
возвращает, не пусто ли производное представление. Доступно, если ranges::empty применима к нему.
(публичный член-функция std::ranges::view_interface<D>)
data
(C++20)
получает адрес данных производного представления. Доступно, если тип его итератора удовлетворяет contiguous_iterator.
(публичный член-функция std::ranges::view_interface<D>)
front
(C++20)
возвращает первый элемент в производном представлении. Доступно, если оно удовлетворяет forward_range.
(публичный член-функция std::ranges::view_interface<D>)
back
(C++20)
возвращает последний элемент в производном представлении. Доступно, если оно удовлетворяет bidirectional_range и common_range.
(публичный член-функция std::ranges::view_interface<D>)
operator[]
(C++20)
возвращает n-ый элемент в производном представлении. Доступно, если оно удовлетворяет random_access_range.
(публичный член-функция std::ranges::view_interface<D>)

Руководства по выводу типов

Вспомогательные шаблоны

template<class T>
inline constexpr bool enable_borrowed_range<std::ranges::drop_view<T>> =
    std::ranges::enable_borrowed_range<T>;
(с C++20)

Эта специализация std::ranges::enable_borrowed_range делает drop_view удовлетворяющим borrowed_range, когда базовые представления удовлетворяют ему.

Пример

#include <iostream>
#include <ranges>
 
int main()
{
    const auto nums = {1, 2, 3, 4, 5, 6, 7, 8, 9};
 
    for (int i : std::ranges::drop_view{nums, 2})
        std::cout << i << ' ';
    std::cout << '\n';
 
    for (int i : nums | std::views::drop(2))
        std::cout << i << ' ';
    std::cout << '\n';
 
    for (int i : std::views::iota(1, 10) | std::views::drop(2))
        std::cout << i << ' ';
    std::cout << '\n';
}

Вывод:

3 4 5 6 7 8 9
3 4 5 6 7 8 9
3 4 5 6 7 8 9

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применён к Поведение, как опубликовано Правильное поведение
LWG 3407 C++20 views::drop иногда не удаётся
создать упорядоченный диапазон случайного доступа
создание скорректировано,
так что оно всегда допустимо
LWG 3494 C++20 drop_view никогда не было borrowed_range является borrowed_range если его базовая view таковым является

См. также

ranges::drop_while_viewviews::drop_while
(C++20)
a view состоящее из элементов другого view, пропускающее начальную последовательность элементов до первого элемента, где предикат возвращает false
(шаблон класса) (объект адаптера диапазонов)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/ranges/drop_view

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API