名前空間
変種
操作

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

From cppreference.com
< cpp‎ | ranges
 
 
Rangesライブラリ
Rangeアダプタ
adjacent_transform_viewviews::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 /* unspecified */ adjacent_transform = /* unspecified */;

}
(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 を受け取り、元のビューの [ii + N) の各要素に fun を適用した結果である値を i番目 の要素とする view を生成する範囲アダプタです。F は常に arity (引数の数)N です。
元のビューのサイズを S とします。このとき、生成されるビューのサイズは以下のようになります。
  • S - N + 1、もし S >= N の場合。
  • 0 (それ以外の場合、結果のビューは空になります)
2) 名前 views::adjacent_transform<N>RangeAdaptorObject を表します。部分式 ef、および定数式 N が与えられた場合、式 views::adjacent_transform<N>(e, f) は次の式と 式的に等価 です。
3) 名前 views::pairwise_transform は、views::adjacent_transform<2> とまったく同じように動作する RangeAdaptorObject を表します。特に、F のアリティも 2 であり、fun は二項呼び出し可能オブジェクトです。

adjacent_transform_view は常に forward_range をモデル化し、適合された view 型が対応する概念をモデル化する場合、bidirectional_rangerandom_access_range、または sized_range をモデル化します。

目次

[編集] メンバ関数

adjacent_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 (private) ranges::adjacent_view<V, N>.
(説明専用メンバ型*)
inner_iterator (private)
inner_sentinel (private)

[編集] データメンバ

メンバ名 定義
fun_ (private) /*movable-box*/<F>
(説明用のメンバオブジェクト*)
inner_ (private) ranges::adjacent_view<V,N>
(説明用のメンバオブジェクト*)

[編集] ネストされたクラス

イテレータ型
(説明専用メンバクラステンプレート*)
adjacent_transform_viewcommon_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); };
    // Alternatively, the Fun could be any ternary (if window == 3) callable, e.g.:
    // 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
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
各要素に変換関数を適用するシーケンスの view
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
適合するviewの対応する要素に変換関数を適用した結果からなる view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト)[編集]
要素の範囲に関数を適用する
(アルゴリズム関数オブジェクト)[編集]
English 日本語 中文(简体) 中文(繁體)