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) |
view элементов базовой последовательности, начиная с её начала и заканчивая заданной границей.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;
| (начиная с C++23) |
- в противном случае —
take_view(e, 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 (открытая функция-член) |
|
| возвращает копию базового (адаптированного) представления (открытая функция-член) |
|
| возвращает итератор на начало (открытая функция-член) |
|
| возвращает итератор или сентинел на конец (открытая функция-член) |
|
возвращает число элементов; доступна только в том случае, если базовый (адаптированный) диапазон удовлетворяет концепции 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>) |
|
Направляющие вывода
Вложенные классы
|
(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, если им является его базовое представление |
См. также
|
(C++20) | создаёт поддиапазон на основе итератора и количества элементов (объект-точка настройки) |
|
(C++20) | view, состоящее из начальных элементов другого view до первого элемента, для которого предикат возвращает false(шаблон класса) (объект адаптера диапазона) |
|
(C++20) | копирует заданное число элементов в новое место (объект функции-алгоритма) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/ranges/take_view