std::ranges:: views:: take, std::ranges:: take_view
|
Определено в заголовке
<ranges>
|
||
|
template
<
ranges::
view
V
>
class
take_view
|
(1) | (начиная с C++20) |
|
namespace
views
{
inline
constexpr
/* unspecified */
take
=
/* unspecified */
;
|
(2) | (начиная с C++20) |
|
Сигнатура вызова
|
||
|
template
<
ranges::
viewable_range
R
>
requires
/* see below */
|
(начиная с C++20) | |
|
template
<
class
DifferenceType
>
constexpr /* range adaptor closure */ take ( DifferenceType && count ) ; |
(начиная с C++20) | |
view
элементов из базовой последовательности, начинающийся с начала и заканчивающийся на заданной границе.
views::take
is a
RangeAdaptorObject
. The expression
views
::
take
(
e, f
)
results in a view that represents the first
f
elements from
e
. The result is not necessarily a
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 ;
-
std::
span
<
typename
T
::
element_type
>
, если
-
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 ) .
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
(публичная функция-член) |
Унаследовано от std::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)
|
копирует указанное количество элементов в новое место
(функциональный объект алгоритма) |