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) | |
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;
|
(начиная с 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
(публичная функция-член) |
|
|
возвращает копию базового (адаптированного) представления
(публичная функция-член) |
|
|
возвращает итератор на начало
(публичная функция-член) |
|
|
возвращает итератор или страж на конец
(публичная функция-член) |
|
возвращает количество элементов, предоставляется только если базовый (адаптированный) диапазон удовлетворяет
sized_range
(публичная функция-член) |
|
|
(C++26)
|
возвращает приблизительный размер результирующего
approximately_sized_range
(публичная функция-член) |
Унаследовано от ranges::view_interface | |
| возвращает, пусто ли производное представление, предоставляется только если оно удовлетворяет 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)
|
тип sentinel
( демонстрационный шаблон класса-члена* ) |
Вспомогательные шаблоны
|
template
<
class
T
>
constexpr
bool
enable_borrowed_range
<
std
::
ranges
::
take_view
<
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 << "): "; // безопасно берет только до min(n, nums.size()) элементов: 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++.
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
| LWG 3407 | C++20 |
views::take
иногда не удавалось
создать диапазон произвольного доступа с размером |
тип результата корректируется так,
чтобы создание всегда было допустимым |
| LWG 3494 | C++20 |
take_view
никогда не был
borrowed_range
|
он является
borrowed_range
если его базовый диапазон является таковым
|
Смотрите также
|
(C++20)
|
создает поддиапазон из итератора и счетчика
(объект точки кастомизации) |
view
, состоящий из начальных элементов другого
view
, до первого элемента, для которого предикат возвращает
false
(шаблон класса) (объект адаптера диапазона) |
|
|
(C++20)
|
копирует указанное количество элементов в новое место
(функциональный объект алгоритма) |