Spec-Zone.ru › C++

std::ranges::views::take, std::ranges::take_view

Определено в заголовке <ranges>
template< ranges::view V >
class take_view
    : public ranges::view_interface<take_view<V>>
(1) (с C++20)
namespace views {
    inline constexpr /* unspecified */ take = /* unspecified */;
}
(2) (с C++20)
Подпись вызова
template< ranges::viewable_range R >
    requires /* see below */
constexpr ranges::view auto
    take( R&& r, ranges::range_difference_t<R> count );
(с C++20)
template< class DifferenceType >
constexpr /* range adaptor closure */ take( DifferenceType&& count );
(с C++20)
1) Адаптер диапазона, представляющий view элементов из базовой последовательности, начиная с начала и заканчивая заданной границей.
2) views::take является RangeAdaptorObject. Выражение views::take(e, f) приводит к представлению вида первых f элементов из e. Результат не обязательно является take_view.

views::take(e, f) эквивалентен (где T это std::remove_cvref_t<decltype((e))> и D это ranges::range_difference_t<decltype((e))>):

  • ((void)f, decay-copy(e)), если T является ranges::empty_view, за исключением того, что оценки e и f не определены;
  • U(ranges::begin(e), ranges::begin(e) + std::min<D>(ranges::distance(e), f)), если T является специализацией std::span, std::basic_string_view, или ranges::subrange, которая моделирует как random_access_range, так и sized_range, где U является
    • std::span<typename T::element_type>, если T является специализацией std::span;
    • T, если T является специализацией std::basic_string_view;
    • ranges::subrange<ranges::iterator_t<T>>, если T является специализацией ranges::subrange;
  • ranges::iota_view(*ranges::begin(e),
    *(ranges::begin(e) + std::min<D>(ranges::distance(e), f)))
    , если T является специализацией ranges::iota_view, которая моделирует как random_access_range, так и sized_range;
  • иначе, если T является специализацией ranges::repeat_view:
    • views::repeat(*e.value_, std::min<D>(ranges::distance(e), f)), если T моделирует sized_range; в этом случае e вычисляется только один раз;
    • views::repeat(*e.value_, static_cast<D>(e)) в противном случае;
(с C++23)
  • иначе, take_view(e, f).
Во всех случаях, decltype((f)) должно моделировать std::convertible_to<D>.

take_view моделирует концепции contiguous_range, random_access_range, bidirectional_range, forward_range, input_range и sized_range, когда базовый вид V моделирует соответствующие концепции. Он моделирует common_range, когда базовый вид V моделирует как random_access_range, так и sized_range.

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

(конструктор)
(C++20)
создаёт take_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>)

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

Вложенные классы

sentinel
(C++20)
тип сентиннель
(только для демонстрации*)

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

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

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

Пример

#include <algorithm>
#include <iostream>
#include <ranges>
 
auto print = [](char x){ std::cout << x; };
 
int main()
{
    constexpr char pi[]{'3', '.', '1', '4', '1', '5', '9', '2'};
 
    std::ranges::for_each(pi | std::ranges::views::take(6), print);
    std::cout << '\n';
 
    // safely takes 8 chars only, i.e. min(pi.size(), 42)
    std::ranges::for_each(std::ranges::take_view{pi, 42}, print);
 
    std::cout << '\n';
}

Вывод:

3.1415
3.141592

Отчёты о дефектах

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

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

См. также

views::counted
(C++20)
создаёт поддиапазон из итератора и количества
(объект точек настройки)
ranges::take_while_viewviews::take_while
(C++20)
view состоящий из начальных элементов другой view, до первого элемента, на котором предикат возвращает false
(шаблон класса) (объект адаптера диапазонов)
ranges::copy_n
(C++20)
копирует определённое количество элементов в новое местоположение
(ниблоид)

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

Spec-Zone.ru

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