- ranges[meta header]
- std::ranges[meta namespace]
- class template[meta id-type]
- cpp23[meta cpp]
namespace std::ranges {
template<move_constructible F, input_range... Views>
requires (view<Views> && ...) && (sizeof...(Views) > 0) && is_object_v<F> &&
regular_invocable<F&, range_reference_t<Views>...> &&
can-reference<invoke_result_t<F&, range_reference_t<Views>...>>
class zip_transform_view : public view_interface<zip_transform_view<F, Views...>> {…… }; // (1)
namespace views {
inline constexpr /*unspecified*/ zip_transform = /*unspecified*/; // (2)
}
}
- can-reference[link /reference/iterator/dereferenceable.md]
zip_transform_view
は複数のRangeから要素を1つずつ取得し、それらを引数として関数を呼び出した結果を要素とするview
。
zip_transform_view
の要素を1つ取得するごとに、各Rangeの要素を1つずつ取得する。
zipするRangeのサイズが異なっている場合、zip_transform_view
のサイズはそれらの中で最小のサイズとなる。
- (1):
zip_transform_view
のクラス定義
- (2):
zip_transform_view
を生成するカスタマイゼーションポイントオブジェクト(Rangeアダプタオブジェクトではない)
borrowed |
sized |
output |
input |
forward |
bidirectional |
random_access |
contiguous |
common |
viewable |
view |
|
(1) |
〇 |
〇 |
(1) |
(1) |
(1) |
|
(1) |
○ |
○ |
- (2):
F
を部分式、Es...
を部分式のパックとする。式 views::zip_transform(F, Es...)
の効果は以下の通り。
#include <ranges>
#include <vector>
#include <print>
int main() {
std::vector d = {1, 2, 3};
std::vector p = {1, 10, 100, 1000};
std::println("{}", std::views::zip_transform([](auto x, auto y){ return x * y; }, d, p));
}
- std::views::zip_transform[color ff0000]