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 является объектом-адаптером диапазона. Выражение 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.

Члены данных

Член Описание
V base_ базовое представление
(объект-член, используемый только для экспозиции*)
ranges::range_difference_t<V> count_ число элементов, которые нужно взять
(объект-член, используемый только для экспозиции*)

Функции-члены

(конструктор)
создаёт take_view
(открытая функция-член)
base
возвращает копию базового (адаптированного) представления
(открытая функция-член)
begin
возвращает итератор на начало
(открытая функция-член)
end
возвращает итератор или сентинел на конец
(открытая функция-член)
size
возвращает число элементов; доступна только в том случае, если базовый (адаптированный) диапазон удовлетворяет концепции sized_range
(открытая функция-член)
reserve_hint
(C++26)
возвращает приблизительный размер результирующего approximately_sized_range
(открытая функция-член)
Унаследовано от std::ranges::view_interface
empty
возвращает признак того, что производное представление пусто; доступна только в том случае, если оно удовлетворяет концепции 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
возвращает признак того, что производное представление не пусто; доступна только в том случае, если к нему применима ranges::empty
(открытая функция-член std::ranges::view_interface<D>)
data
получает адрес данных производного представления; доступна только в том случае, если тип его итератора удовлетворяет концепции contiguous_iterator
(открытая функция-член std::ranges::view_interface<D>)
front
возвращает первый элемент производного представления, если оно удовлетворяет концепции forward_range
(открытая функция-член std::ranges::view_interface<D>)
back
возвращает последний элемент производного представления; доступна только в том случае, если оно удовлетворяет концепциям bidirectional_range и common_range
(открытая функция-член std::ranges::view_interface<D>)
operator[]
возвращает элемент с индексом n в производном представлении; доступна только в том случае, если оно удовлетворяет концепции random_access_range
(открытая функция-член std::ranges::view_interface<D>)

Направляющие вывода

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

sentinel
(C++20)
тип сентинела
(шаблон класса-члена, используемый только для экспозиции*)

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

template< class T >
constexpr bool enable_borrowed_range<std::ranges::take_view<T>> =
    ranges::enable_borrowed_range<T>;
(начиная с C++20)

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

Пример

#include <algorithm>
#include <iostream>
#include <ranges>

int main()
{
    namespace views = std::views;
    auto print = [](char x){ std::cout << x; };

    for (const char nums[]{'1', '2', '3'};
         int n : views::iota(0, 5))
    {
        std::cout << "take(" << n << "): ";
        // safely takes only upto min(n, nums.size()) elements:
        std::ranges::for_each(nums | views::take(n), print);
        std::cout << '\n';
    }
}

Вывод:

take(0): 
take(1): 1
take(2): 12
take(3): 123
take(4): 123

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

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

Отчёт об ошибке Применён к Опубликованное поведение Исправленное поведение
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/cpp/ranges/take_view

Spec-Zone.ru

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