名前空間
変種
操作

std::ranges::views::zip_transform, std::ranges::zip_transform_view

From cppreference.com
< cpp‎ | ranges
 
 
Rangesライブラリ
Rangeアダプタ
 
 
ヘッダ <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 /* 以下を参照 */

constexpr auto zip_transform( F&& f, Rs&&... rs );
(C++23から)
1) zip_transform_view は、呼び出し可能なオブジェクトと1つ以上の view を受け取り、呼び出し可能なオブジェクトをすべてのビューの i 番目の要素に適用した結果を i 番目の要素とする view を生成するレンジアダプタである。
T が公開専用の概念 /*can-reference*/ をモデルするのは、T& が有効な型である場合に限られる。
2) views::zip_transform はカスタマイゼーションポイントオブジェクトである。

引数を1つ f として呼び出すとき、FDstd::decay_t<decltype(f)> とする。もし

views::zip_transform(f)式として等価 である ((void)f, auto(views::empty<std::decay_t<std::invoke_result_t<FD&>>>))。それ以外の場合、views::zip_transform の呼び出しは不適格である。

引数を複数 frs... として呼び出すとき、views::zip_transform(f, rs...)式として等価 である ranges::zip_transform_view(f, rs...)

zip_transform_view は、基になる ranges::zip_view<Views...> がそれぞれの概念をモデルする場合、random_access_rangebidirectional_rangeforward_rangeinput_rangecommon_range、および sized_range の概念をモデルする。

目次

カスタマイゼーションポイントオブジェクト

名前 views::zip_transform は、カスタマイゼーションポイントオブジェクト を表す。これは、リテラルな semiregular クラス型の const 関数オブジェクトである。説明の目的上、その型の cv-非修飾バージョンは __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

をモデルする。それ以外の場合、__zip_transform_fn の関数呼び出し演算子はいずれもオーバーロード解決に参加しない。

[編集] メンバ関数

zip_transform_view を構築する
(public メンバ関数) [編集]
先頭へのイテレータを返す
(public メンバ関数) [編集]
終端へのイテレータまたはセンチネルを返す
(public メンバ関数) [編集]
基になる(適合された)各レンジが sized_range を満たす場合にのみ要素数を返す
(public メンバ関数) [編集]
std::ranges::view_interface から継承
派生ビューが空かどうかを返す。sized_range または forward_range を満たす場合にのみ提供される
(std::ranges::view_interface<D> の public メンバ関数) [編集]
(C++23)
範囲の先頭への定数イテレータを返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
(C++23)
範囲の定数イテレータの番兵を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
派生ビューが空でないかどうかを返す。ranges::empty が適用可能な場合にのみ提供される
(std::ranges::view_interface<D> の public メンバ関数) [編集]
派生ビューが forward_range を満たす場合に、派生ビューの最初の要素を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
派生ビューが bidirectional_rangecommon_range の両方を満たす場合にのみ、派生ビューの最後の要素を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
派生ビューが random_access_range を満たす場合にのみ、派生ビューの n番目の要素を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]

[編集] 推論ガイド

[編集] メンバ型

メンバ型 定義
InnerView (プライベート) ranges::zip_view<Views...>.
(説明専用メンバ型*)
ziperator (プライベート)
zentinel (プライベート)

[編集] データメンバ

メンバオブジェクト 定義
zip_ (プライベート) InnerView の基になるビューオブジェクト
(説明用のメンバオブジェクト*)
fun_ (プライベート) movable-box<F> のラップされた呼び出し可能なオブジェクト
(説明用のメンバオブジェクト*)

[編集] 入れ子クラス

イテレータ型
(説明専用メンバクラステンプレート*)
基になる zip_viewcommon_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}

[編集] 関連項目

適合するviewの対応する要素への参照のタプルからなる view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト)[編集]
各要素に変換関数を適用するシーケンスの view
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
tuple-like な値からなるviewと数値Nを取り、各タプルのN番目の要素のviewを生成する
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
English 日本語 中文(简体) 中文(繁體)