std::ranges::views::zip_transform, std::ranges::zip_transform_view
Определён в заголовочном файле <ranges> | ||
|---|---|---|
template< std::move_constructible F, ranges::input_range... Views >
requires (ranges::view<Views> && ...) && (sizeof...(Views) > 0) &&
std::is_object_v<F> && std::regular_invocable<
F&, ranges::range_reference_t<Views>...> &&
/*can-reference*/<std::invoke_result_t<
F&, ranges::range_reference_t<Views>...>>
class zip_transform_view
: public ranges::view_interface<zip_transform_view<F, Views...>>
| (1) | (начиная с C++23) |
namespace views {
inline constexpr /*unspecified*/ zip_transform = /*unspecified*/;
}
| (2) | (начиная с C++23) |
| Сигнатура вызова | ||
template< class F, ranges::viewable_range... Rs >
requires /* see below */
constexpr auto zip_transform( F&& f, Rs&&... rs );
| (начиная с C++23) |
zip_transform_view — это адаптер диапазона, который принимает вызываемый объект и одно или несколько views и создаёт view, iй элемент которого является результатом применения вызываемого объекта к iм элементам всех представлений.Тип
T моделирует концепт, используемый только для описания, /*can-reference*/ тогда и только тогда, когда T& является допустимым типом.views::zip_transform — это объект точки настройки. При вызове с одним аргументом f пусть FD будет std::decay_t<decltype(f)>, если:
-
FDмоделируетcopy_constructible, -
FD&моделируетregular_invocable, и -
std::invoke_result_t<FD&>является объектным типом,
то views::zip_transform(f) эквивалентно по выражению ((void)f, auto(views::empty<std::decay_t<std::invoke_result_t<FD&>>>)). В противном случае вызов views::zip_transform некорректен. При вызове с более чем одним аргументом f и rs..., views::zip_transform(f, rs...) эквивалентно по выражению ranges::zip_transform_view(f, rs...).
zip_transform_view моделирует концепты random_access_range, bidirectional_range, forward_range, input_range, common_range и sized_range, если базовые ranges::zip_view<Views...> моделируют соответствующие концепты.
Объекты точек настройки
Имя views::zip_transform обозначает объект точки настройки — константный функциональный объект литерального типа класса semiregular. Подробности см. в разделе Объект точки настройки.
Функции-члены
создаёт zip_transform_view (открытая функция-член) |
|
| возвращает итератор на начало (открытая функция-член) |
|
| возвращает итератор или сентинел на конец (открытая функция-член) |
|
возвращает количество элементов; доступна только в том случае, если каждый базовый (адаптированный) диапазон удовлетворяет концепту 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>) |
|
возвращает первый элемент производного представления, если оно удовлетворяет концепту 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::zip_view<Views...>.(тип-член, используемый только для описания*) |
ziperator (закрытый) |
|
zentinel (закрытый) |
|
Поля данных
| Член | Описание |
|---|---|
InnerView zip_ (закрытый) | базовый объект-представление (объект-член, используемый только для описания*) |
movable-box<F> fun_ (закрытый) | обёрнутый вызываемый объект (объект-член, используемый только для описания*) |
Вложенные классы
| тип итератора (шаблон класса-члена, используемый только для описания*) |
|
тип сентинела, используемый, когда базовый zip_view не является common_range(шаблон класса-члена, используемый только для описания*) |
Примечания
| Макрос проверки поддержки возможностей | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_lib_ranges_zip | 202110L | (C++23) |
ranges::zip_view,std::ranges::zip_transform_view,ranges::adjacent_view, ranges::adjacent_transform_view |
Пример
#include <array>
#include <iostream>
#include <list>
#include <ranges>
#include <vector>
void print(auto const rem, auto const& r)
{
std::cout << rem << '{';
for (char o[]{0,' ',0}; auto const& e : r)
std::cout << o << e, *o = ',';
std::cout << "}\n";
}
int main()
{
auto v1 = std::vector<float>{1, 2, 3};
auto v2 = std::list<short>{1, 2, 3, 4};
auto v3 = std::to_array({1, 2, 3, 4, 5});
auto add = [](auto a, auto b, auto c) { return a + b + c; };
auto sum = std::views::zip_transform(add, v1, v2, v3);
print("v1: ", v1);
print("v2: ", v2);
print("v3: ", v3);
print("sum: ", sum);
}
Вывод:
v1: {1, 2, 3}
v2: {1, 2, 3, 4}
v3: {1, 2, 3, 4, 5}
sum: {3, 6, 9}
См. также
|
(C++23) | view, состоящее из кортежей ссылок на соответствующие элементы адаптированных представлений(шаблон класса) (объект точки настройки) |
|
(C++20) | view последовательности, применяющее функцию преобразования к каждому элементу(шаблон класса) (объект адаптера диапазона) |
|
(C++20) | принимает view, состоящее из значений tuple-like, и число N, а затем создаёт view из N-го элемента каждого кортежа(шаблон класса) (объект адаптера диапазона) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/ranges/zip_transform_view