std::ranges:: views:: adjacent_transform, std::ranges:: adjacent_transform_view, std::ranges:: views:: pairwise_transform
|
Определено в заголовочном файле
<ranges>
|
||
|
template
<
ranges::
forward_range
V,
std::
move_constructible
F,
std::
size_t
N
>
requires
ranges::
view
<
V
>
&&
(
N
>
0
)
&&
std::
is_object_v
<
F
>
&&
|
(1) | (начиная с C++23) |
|
namespace
views
{
template
<
std::
size_t
N
>
|
(2) | (начиная с C++23) |
|
namespace
views
{
inline
constexpr
auto
pairwise_transform
=
adjacent_transform
<
2
>
;
|
(3) | (начиная с C++23) |
|
Сигнатура вызова
|
||
|
template
<
ranges::
viewable_range
R,
class
F
>
requires
/* см. ниже */
|
(начиная с C++23) | |
|
template
<
class
F
>
constexpr /*адаптер диапазона-замыкания*/ adjacent_transform < N > ( F && fun ) ; |
(начиная с C++23) | |
adjacent_transform_view
— это адаптер диапазона, который принимает
view
и вызываемый объект
fun
, и создает
view
, чей
i
-й
элемент является значением, полученным в результате применения
fun
к каждому элементу в
[
i
,
i
+
N
)
исходного представления.
F
всегда имеет
арность
N
.
S
будет размером исходного представления. Тогда размер созданного представления равен:
- S - N + 1 , если S >= N ,
- 0 в противном случае, и результирующее представление является пустым.
N
выражение
views
::
adjacent_transform
<
N
>
(
e, f
)
является
эквивалентным выражению
:
-
(
(
void
)
e,
views::
zip_transform
(
f
)
)
, если
Nравно 0 и decltype ( ( e ) ) моделируетforward_range(за исключением того, что вычисления e и f имеют неопределённую последовательность ), - adjacent_transform_view < views:: all_t < decltype ( ( e ) ) > , std:: decay_t < decltype ( ( f ) ) > , N > ( e, f ) в противном случае.
F
также равна
2
, а
fun
является бинарным вызываемым объектом.
adjacent_transform_view
всегда моделирует
forward_range
и моделирует
bidirectional_range
,
random_access_range
или
sized_range
, если адаптированный тип
view
моделирует соответствующую концепцию.
Содержание |
Функции-члены
создает
adjacent_transform_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>
)
|
|
возвращает первый элемент в производном представлении, предоставляется если оно удовлетворяет
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>
)
|
|
Вложенные типы
| Тип | Определение |
InnerView
(приватный)
|
ranges::
adjacent_view
<
V, N
>
( тип-член только для демонстрации* ) |
inner_iterator
(приватный)
|
|
inner_sentinel
(приватный)
|
|
Члены данных
| Участник | Описание |
/*movable-box*/
<
F
>
fun_
(private)
|
преобразуемый вызываемый объект
( объект-участник только для демонстрации* ) |
ranges::
adjacent_view
<
V,N
>
inner_
(private)
|
хранимое представление
( объект-участник только для демонстрации* ) |
Вложенные классы
|
тип итератора
( демонстрационный шаблон класса-члена* ) |
|
тип сторожа, используемый когда
adjacent_transform_view
не является
common_range
( демонстрационный шаблон класса-члена* ) |
Примечания
views
::
adjacent_transform
принимает только forward ranges, даже когда
N
равен
0
.
| Макрос тестирования возможностей | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_lib_ranges_zip
|
202110L
|
(C++23) |
ranges::
zip_view
,
ranges:: zip_transform_view , ranges:: adjacent_view ,
ranges::adjacent_transform_view
|
Пример
#include <array> #include <iostream> #include <ranges> int main() { constexpr static std::array data{1, 2, 3, 4, 5, 6}; constexpr int window{3}; auto Fun = [](auto... ints) { return (... + ints); }; // Альтернативно, Fun может быть любым тернарным (если window == 3) вызываемым объектом, например: // auto Fun = [](int x, int y, int z) { return x + y + z; }; constexpr auto view = data | std::views::adjacent_transform<window>(Fun); static_assert( view.size() == (data.size() - window + 1) && std::array{6, 9, 12, 15} == std::array{view[0], view[1], view[2], view[3]} && view[0] == Fun(data[0], data[1], data[2]) && view[1] == Fun(data[1], data[2], data[3]) && view[2] == Fun(data[2], data[3], data[4]) && view[3] == Fun(data[3], data[4], data[5]) ); for (int x : view) std::cout << x << ' '; std::cout << '\n'; }
Вывод:
6 9 12 15
Отчёты о дефектах
Следующие отчеты об изменениях в поведении, содержащие описания дефектов, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 4098 | C++23 | views :: adjacent_transform < 0 > использовался для принятия диапазонов только для ввода | сделан отклоненным |
Ссылки
- Стандарт C++23 (ISO/IEC 14882:2024):
-
- 26.7.27 Представление преобразования смежных элементов [range.adjacent.transform]
Смотрите также
представление,
view
состоящее из кортежей ссылок на смежные элементы адаптированного представления
(шаблон класса) (объект адаптера диапазона) |
|
представление
view
последовательности, которое применяет функцию преобразования к каждому элементу
(шаблон класса) (объект адаптера диапазона) |
|
представление,
view
состоящее из результатов применения функции преобразования к соответствующим элементам адаптированных представлений
(шаблон класса) (объект точки настройки) |
|
|
(C++20)
|
применяет функцию к диапазону элементов
(функциональный объект алгоритма) |