Spec-Zone.ru › C++

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)
1) zip_transform_view — это адаптер диапазона, который принимает вызываемый объект и одно или несколько views и создаёт 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. Подробности см. в разделе Объект точки настройки.

Функции-члены

(constructor)
создаёт zip_transform_view
(открытая функция-член)
begin
возвращает итератор на начало
(открытая функция-член)
end
возвращает итератор или сентинел на конец
(открытая функция-член)
size
возвращает количество элементов; доступна только в том случае, если каждый базовый (адаптированный) диапазон удовлетворяет концепту sized_range
(открытая функция-член)
Унаследовано от std::ranges::view_interface
empty
возвращает признак того, что производное представление пусто; доступна только в том случае, если оно удовлетворяет концепту 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
возвращает признак того, что производное представление не пусто; доступна только в том случае, если к нему применим ranges::empty
(открытая функция-член std::ranges::view_interface<D>)
front
возвращает первый элемент производного представления, если оно удовлетворяет концепту forward_range
(открытая функция-член std::ranges::view_interface<D>)
back
возвращает последний элемент производного представления; доступна только в том случае, если оно удовлетворяет концептам bidirectional_range и common_range
(открытая функция-член std::ranges::view_interface<D>)
operator[]
возвращает 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>.
    (тип-член, используемый только для описания*)

Поля данных

Член Описание
InnerView zip_ (закрытый) базовый объект-представление
(объект-член, используемый только для описания*)
movable-box<F> fun_ (закрытый) обёрнутый вызываемый объект
(объект-член, используемый только для описания*)

Вложенные классы

iterator
тип итератора
(шаблон класса-члена, используемый только для описания*)
sentinel
тип сентинела, используемый, когда базовый 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}

См. также

ranges::zip_viewviews::zip
(C++23)
view, состоящее из кортежей ссылок на соответствующие элементы адаптированных представлений
(шаблон класса) (объект точки настройки)
ranges::transform_viewviews::transform
(C++20)
view последовательности, применяющее функцию преобразования к каждому элементу
(шаблон класса) (объект адаптера диапазона)
ranges::elements_viewviews::elements
(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

Spec-Zone.ru

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