Namespaces
Variants

std::ranges::views::adjacent_transform, std::ranges::adjacent_transform_view, std::ranges::views::pairwise_transform

ja.cppreference.net より
 
 
Rangesライブラリ
範囲アダプタ
 
 
ヘッダで定義 <ranges>
template< ranges::forward_range V, std::move_constructible F, std::size_t N >
  requires ranges::view<V> && (N > 0) && std::is_object_v<F> &&
           std::regular_invocable<F&,
               /*REPEAT*/(ranges::range_reference_t<V>, N)...> &&
           /*can-reference*/<std::invoke_result_t<F&,
               /*REPEAT*/(ranges::range_reference_t<V>, N)...>>
class adjacent_transform_view
    : public ranges::view_interface<adjacent_transform_view<V, F, N>>
(1) (since C++23)
namespace views {
    template< std::size_t N >
    constexpr /* unspecified */ adjacent_transform = /* unspecified */;
}
(2) (since C++23)
namespace views {
    inline constexpr auto pairwise_transform = adjacent_transform<2>;
}
(3) (since C++23)
呼び出しシグネチャ
template< ranges::viewable_range R, class F >
    requires /* see below */
constexpr ranges::view auto adjacent_transform<N>( R&& r, F&& fun );
(since C++23)
template< class F >
constexpr /*range adaptor closure*/ adjacent_transform<N>( F&& fun );
(since C++23)
1) adjacent_transform_viewは、viewと呼び出し可能オブジェクト を受け取り、fun を生成する範囲アダプタです。その i番目の要素は、元のviewの funの各要素に[ii + N)を適用した結果です。Fは常に個の引数を持ちます N
元のviewのサイズをSとします。生成されるviewのサイズは次のようになります:
  • S - N + 1、もしS >= Nならば、
  • 0それ以外の場合は、結果のviewは空です。
2) 名前views::adjacent_transform<N>RangeAdaptorObjectを表します。部分式ef、および定数式Nが与えられたとき、式views::adjacent_transform<N>(e, f)式等価です:
  • ((void)e, views::zip_transform(f))、もしN0に等しく、decltype((e))forward_rangeをモデル化する場合(ただし、efの評価は不定な順序で行われます)、
  • adjacent_transform_view<views::all_t<decltype((e))>, std::decay_t<decltype((f))>, N>(e, f)それ以外の場合。
3) 名前views::pairwise_transformRangeAdaptorObjectを表し、views::adjacent_transform<2>とまったく同じように動作します。特に、Fの引数の数も2であり、funは二項呼び出し可能オブジェクトです。

adjacent_transform_viewは常にforward_rangeをモデル化し、適応されるbidirectional_rangerandom_access_range、またはsized_rangeをモデル化します。もしview型が対応するコンセプトをモデル化する場合。

メンバー関数

adjacent_transform_view を構築する
(公開メンバ関数)
先頭を指すイテレータを返す
(公開メンバ関数)
終端を指すイテレータまたはセンチネルを返す
(公開メンバ関数)
要素数を返す(基となる範囲が sized_range を満たす場合のみ提供)
(公開メンバ関数)
結果の approximately_sized_range の近似サイズを返す
(公開メンバ関数)
から継承 ranges::view_interface
派生ビューが空であるかどうかを返します。ただし、派生ビューが sized_range または forward_range
を満たす場合に限ります。(std::ranges::view_interface<D>のパブリックメンバ関数)
(C++23)
範囲の先頭を指す定数イテレータを返します。
std::ranges::view_interface<D>のパブリックメンバ関数)
(C++23)
範囲の定数イテレータの番兵を返します。
std::ranges::view_interface<D>のパブリックメンバ関数)
派生ビューが空でないかどうかを返します。ただし、派生ビューに ranges::empty が適用可能な場合に限ります。
std::ranges::view_interface<D>のパブリックメンバ関数)
派生ビューの最初の要素を返します。ただし、派生ビューが forward_range
を満たす場合に限ります。(std::ranges::view_interface<D>のパブリックメンバ関数)
派生ビューの最後の要素を返します。ただし、派生ビューが bidirectional_range および common_range
を満たす場合に限ります。(std::ranges::view_interface<D>のパブリックメンバ関数)
派生ビューの n番目 の要素を返します。ただし、派生ビューが random_access_range
を満たす場合に限ります。(std::ranges::view_interface<D>のパブリックメンバ関数)

ネストされた型

定義
InnerView (非公開) ranges:: adjacent_view < V, N >
説明専用メンバ型*
inner_iterator (非公開)
inner_sentinel (非公開)

データメンバ

メンバー 説明
/*movable-box*/ < F > fun_ (非公開) 変換可能な呼び出し可能オブジェクト
( 説明専用メンバーオブジェクト* )
ranges:: adjacent_view < V,N > inner_ (非公開) 格納されたビュー
( 説明専用メンバーオブジェクト* )

ネストされたクラス

イテレータ型
( 説明専用メンバクラステンプレート* )
adjacent_transform_view common_range でない場合に使用されるセンチネル型
( 説明専用メンバクラステンプレート* )

注記

views :: adjacent_transform N0の場合でも、前方範囲のみを受け入れます。

機能テスト マクロ 標準 機能
__cpp_lib_ranges_zip 202110L (C++23) ranges:: zip_view ,
ranges:: zip_transform_view ,
ranges:: adjacent_view ,
ranges::adjacent_transform_view

#include <array>
#include <iostream>
#include <ranges>
int main()
{
    constexpr static std::array data{1, 2, 3, 4, 5, 6};
    constexpr int window{3};
    auto Fun = [](auto... ints) { return (... + ints); };
    // 代替案として、Funは任意の三項(window == 3の場合)呼び出し可能オブジェクトでもよい、例:
    // auto Fun = [](int x, int y, int z) { return x + y + z; };
    constexpr auto view = data | std::views::adjacent_transform<window>(Fun);
    static_assert(
        view.size() == (data.size() - window + 1)
        && std::array{6, 9, 12, 15}
        == std::array{view[0], view[1], view[2], view[3]}
        && view[0] == Fun(data[0], data[1], data[2])
        && view[1] == Fun(data[1], data[2], data[3])
        && view[2] == Fun(data[2], data[3], data[4])
        && view[3] == Fun(data[3], data[4], data[5])
    );
    for (int x : view)
        std::cout << x << ' ';
    std::cout << '\n';
}

出力:

6 9 12 15

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 4098 C++23 views :: adjacent_transform < 0 > が入力専用範囲を受け入れていた 拒否するように変更

参考文献

  • C++23標準 (ISO/IEC 14882:2024):
  • 26.7.27 隣接変換ビュー [range.adjacent.transform]

関連項目

適応された view の隣接する要素への参照のタプルからなるビュー
(クラステンプレート) (レンジアダプタオブジェクト)
各要素に変換関数を適用するシーケンスの view
(クラステンプレート) (レンジアダプタオブジェクト)
適応されたビューの対応する要素に変換関数を適用した結果からなる view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト)
要素の範囲に関数を適用する
(アルゴリズム関数オブジェクト)