std::ranges::views::zip_transform, std::ranges::zip_transform_view
Определено в заголовочном файле <ranges> | ||
|---|---|---|
template< std::copy_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 — это адаптер диапазонов, который принимает вызываемый объект и один или несколько view, и создаёт 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_fn.
Все экземпляры __zip_transform_fn равны. Эффекты вызова различных экземпляров типа __zip_transform_fn с одними и теми же аргументами эквивалентны, независимо от того, является ли выражение, обозначающее экземпляр, lvalue или rvalue, и квалифицирован ли он как const или нет (хотя не требуется, чтобы экземпляр с квалификатором volatile был вызываемым). Таким образом, views::zip_transform можно свободно копировать, и его копии можно использовать взаимозаменяемо.
Учитывая набор типов Args..., если std::declval<Args>()... удовлетворяют требованиям аргументов для views::zip_transform выше, __zip_transform_fn моделирует
-
std::invocable<__zip_transform_fn, Args...>, -
std::invocable<const __zip_transform_fn, Args...>, -
std::invocable<__zip_transform_fn&, Args...>, и -
std::invocable<const __zip_transform_fn&, Args...>.
В противном случае, ни один оператор вызова функции __zip_transform_fn не участвует в решении перегрузки.
Члены-функции
|
(C++23) | создаёт zip_transform_view (публичная функция-член) |
|
(C++23) | возвращает итератор в начало (публичная функция-член) |
|
(C++23) | возвращает итератор или стоп-значение в конец (публичная функция-член) |
|
(C++23) | возвращает количество элементов. Предоставляется только в том случае, если каждый базовый (адаптированный) диапазон удовлетворяет 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) | возвращает первый элемент в производном диапазоне. Предоставляется, если он удовлетворяет 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>) |
Руководства по выводу типов
Типы членов
| Тип члена | Определение |
|---|---|
InnerView (приватный) | ranges::zip_view<Views...>.(член типа только для демонстрации*) |
ziperator (приватный) |
|
zentinel (приватный) |
|
Члены данных
| Объект члена | Определение |
|---|---|
zip_ (приватный) | Базовый объект представления типа InnerView(объект члена только для демонстрации*) |
fun_ (приватный) | Оборачиваемый вызываемый объект типа movable-box<F>(объект члена только для демонстрации*) |
Вложенные классы
|
(C++23) | тип итератора (шаблон вложенного класса только для демонстрации*) |
|
(C++23) | тип стоп-итератора, используемый, когда базовый zip_view не является common_range(шаблон вложенного класса только для демонстрации*) |
Примечания
| Макрокоманда проверки наличия функции | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_lib_ranges_zip | 202110L | (C++23) |
std::ranges::zip_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) | a view consisting of tuples of references to corresponding elements of the adapted views(шаблон класса) (объект точки кастомизации) |
|
(C++20) | a view of a sequence that applies a transformation function to each element(шаблон класса) (объект адаптера диапазонов) |
|
(C++20) | takes a view consisting of tuple-like values and a number N and produces a view of Nth element of each tuple(шаблон класса) (объект адаптера диапазонов) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/ranges/zip_transform_view