std::ranges::views::adjacent_transform, std::ranges::adjacent_transform_view, std::ranges::views::pairwise_transform
ja.cppreference.net より
| ヘッダで定義 <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の各要素に[i, i + N)を適用した結果です。Fは常に個の引数を持ちます N。元のviewのサイズを
Sとします。生成されるviewのサイズは次のようになります:
S - N + 1、もしS >= Nならば、0それ以外の場合は、結果のviewは空です。
2) 名前
views::adjacent_transform<N>はRangeAdaptorObjectを表します。部分式eとf、および定数式Nが与えられたとき、式views::adjacent_transform<N>(e, f)は式等価です:
((void)e, views::zip_transform(f))、もしNが0に等しく、decltype((e))がforward_rangeをモデル化する場合(ただし、eとfの評価は不定な順序で行われます)、adjacent_transform_view<views::all_t<decltype((e))>, std::decay_t<decltype((f))>, N>(e, f)それ以外の場合。
3) 名前
views::pairwise_transformはRangeAdaptorObjectを表し、views::adjacent_transform<2>とまったく同じように動作します。特に、Fの引数の数も2であり、funは二項呼び出し可能オブジェクトです。adjacent_transform_viewは常にforward_rangeをモデル化し、適応されるbidirectional_range、random_access_range、またはsized_rangeをモデル化します。もしview型が対応するコンセプトをモデル化する場合。
メンバー関数
adjacent_transform_view を構築する
(公開メンバ関数) |
|
|
先頭を指すイテレータを返す
(公開メンバ関数) |
|
|
終端を指すイテレータまたはセンチネルを返す
(公開メンバ関数) |
|
要素数を返す(基となる範囲が
sized_range
を満たす場合のみ提供)
(公開メンバ関数) |
|
|
(C++26)
|
結果の
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
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
(クラステンプレート) (カスタマイゼーションポイントオブジェクト) |
|
|
(C++20)
|
要素の範囲に関数を適用する
(アルゴリズム関数オブジェクト) |