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 является 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).
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 (общедоступный член-функция) |
|
(C++20) | возвращает копию базового (адаптированного) представления (общедоступный член-функция) |
|
(C++20) | возвращает итератор к началу (общедоступный член-функция) |
|
(C++20) | возвращает итератор или сентиннель к концу (общедоступный член-функция) |
|
(C++20) | возвращает количество элементов. Доступно только если базовая (адаптированная) область удовлетворяет sized_range. (общедоступный член-функция) |
Унаследовано от |
|
|
(C++20) | возвращает, пусто ли производное представление. Доступно, если оно удовлетворяет sized_range или forward_range. (общедоступный член-функция std::ranges::view_interface<D>) |
|
(C++23) | возвращает постоянный итератор к началу области. (общедоступный член-функция std::ranges::view_interface<D>) |
|
(C++23) | возвращает сентиннель для постоянного итератора области. (общедоступный член-функция std::ranges::view_interface<D>) |
|
(C++20) | возвращает, не пусто ли производное представление. Доступно, если ranges::empty применимо к нему. (общедоступный член-функция std::ranges::view_interface<D>) |
|
(C++20) | получает адрес данных производного представления. Доступно, если тип итератора удовлетворяет contiguous_iterator. (общедоступный член-функция std::ranges::view_interface<D>) |
|
(C++20) | возвращает первый элемент в производном представлении. Доступно, если оно удовлетворяет forward_range. (общедоступный член-функция std::ranges::view_interface<D>) |
|
(C++20) | возвращает последний элемент в производном представлении. Доступно, если оно удовлетворяет bidirectional_range и common_range. (общедоступный член-функция std::ranges::view_interface<D>) |
|
(C++20) | возвращает n-й элемент в производном представлении. Доступно, если оно удовлетворяет random_access_range. (общедоступный член-функция std::ranges::view_interface<D>) |
Руководства по выводу типов
Вложенные классы
|
(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 если его базовое представление таково |
См. также
|
(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/w/cpp/ranges/take_view