Spec-Zone.ru › C++

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)
1) zip_transform_view — это адаптер диапазонов, который принимает вызываемый объект и один или несколько view, и создаёт view, чьим i-м элементом является результат применения вызываемого объекта к i-му элементам всех представлений.
Тип T моделирует концепцию /*can-reference*/, если и только если T& — это допустимый тип.
2) 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
(публичная функция-член)
begin
(C++23)
возвращает итератор в начало
(публичная функция-член)
end
(C++23)
возвращает итератор или стоп-значение в конец
(публичная функция-член)
size
(C++23)
возвращает количество элементов. Предоставляется только в том случае, если каждый базовый (адаптированный) диапазон удовлетворяет sized_range.
(публичная функция-член)
Наследуется от std::ranges::view_interface
empty
(C++20)
возвращает, пуст ли производный диапазон. Предоставляется, если он удовлетворяет sized_range или forward_range.
(публичная функция-член std::ranges::view_interface<D>)
cbegin
(C++23)
возвращает константный итератор в начало диапазона.
(публичная функция-член std::ranges::view_interface<D>)
cend
(C++23)
возвращает стоп-значение для константного итератора диапазона.
(публичная функция-член std::ranges::view_interface<D>)
operator bool
(C++20)
возвращает, не пуст ли производный диапазон. Предоставляется, если для него применимо ranges::empty.
(публичная функция-член std::ranges::view_interface<D>)
front
(C++20)
возвращает первый элемент в производном диапазоне. Предоставляется, если он удовлетворяет forward_range.
(публичная функция-член std::ranges::view_interface<D>)
back
(C++20)
возвращает последний элемент в производном диапазоне. Предоставляется, если он удовлетворяет bidirectional_range и common_range.
(публичная функция-член std::ranges::view_interface<D>)
operator[]
(C++20)
возвращает n-ый элемент в производном диапазоне. Предоставляется, если он удовлетворяет random_access_range.
(публичная функция-член std::ranges::view_interface<D>)

Руководства по выводу типов

Типы членов

Тип члена Определение
InnerView (приватный) ranges::zip_view<Views...>.
(член типа только для демонстрации*)
ziperator (приватный)
  • ranges::iterator_t<const InnerView> если Const равно true, в противном случае
  • ranges::iterator_t<InnerView>.


(член типа только для демонстрации*)

zentinel (приватный)
  • ranges::sentinel_t<const InnerView> если Const равно true, в противном случае
  • ranges::sentinel_t<InnerView>.


(член типа только для демонстрации*)

Члены данных

Объект члена Определение
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,

std::ranges::zip_transform_view,
std::ranges::adjacent_view,
std::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}

См. также

ranges::zip_viewviews::zip
(C++23)
a view consisting of tuples of references to corresponding elements of the adapted views
(шаблон класса) (объект точки кастомизации)
ranges::transform_viewviews::transform
(C++20)
a view of a sequence that applies a transformation function to each element
(шаблон класса) (объект адаптера диапазонов)
ranges::elements_viewviews::elements
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API