Namespaces
Variants

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

From cppreference.net
Ranges library
Range adaptors
adjacent_transform_view views::adjacent_transform
(C++23) (C++23)
views::pairwise_transform
(C++23)

ヘッダーで定義 <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) (C++23以降)
namespace views {

template < std:: size_t N >
constexpr /* 未規定 */ adjacent_transform = /* 未規定 */ ;

}
(2) (C++23以降)
namespace views {

inline constexpr auto pairwise_transform = adjacent_transform < 2 > ;

}
(3) (C++23以降)
呼び出しシグネチャ
template < ranges:: viewable_range R, class F >

requires /* 下記参照 */

constexpr ranges:: view auto adjacent_transform < N > ( R && r, F && fun ) ;
(C++23以降)
template < class F >
constexpr /*range adaptor closure*/ adjacent_transform < N > ( F && fun ) ;
(C++23以降)
1) adjacent_transform_view は、 view と呼び出し可能オブジェクト fun を受け取り、元のビューの [ i , i + N ) の各要素に fun を適用した結果の値である i 番目 の要素を持つ view を生成する範囲アダプタです。 F は常に アリティ N を持ちます。
元のビューのサイズを S とする。このとき、生成されるビューのサイズは以下の通りである:
  • S - N + 1 、ただし S >= N の場合、
  • 0 それ以外の場合、結果のビューは空となる。
2) 名前 views :: adjacent_transform < N > RangeAdaptorObject を表す。部分式 e f 、および定数式 N が与えられたとき、式 views :: adjacent_transform < N > ( e, f ) は以下のいずれかと 式等価 である:
3) 名前 views :: pairwise_transform は、 RangeAdaptorObject であり、 views :: adjacent_transform < 2 > と完全に同じ動作をする。特に、 F のアリティも 2 であり、 fun は二項呼び出し可能オブジェクトである。

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

目次

メンバー関数

adjacent_transform_view を構築する
(公開メンバ関数)
先頭を指すイテレータを返す
(公開メンバ関数)
終端を指すイテレータまたはセンチネルを返す
(公開メンバ関数)
要素数を返す(基となる範囲が sized_range を満たす場合のみ提供)
(公開メンバ関数)
結果の approximately_sized_range の近似サイズを返す
(公開メンバ関数)
std::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 th 番目の要素を返す( 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 N 0 の場合でも、前方範囲のみを受け入れます。

機能テスト マクロ 標準 機能
__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
(クラステンプレート) (カスタマイゼーションポイントオブジェクト)
要素の範囲に関数を適用する
(アルゴリズム関数オブジェクト)