std::ranges:: views:: adjacent_transform, std::ranges:: adjacent_transform_view, std::ranges:: views:: pairwise_transform
|
ヘッダーで定義
<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
>
&&
|
(1) | (C++23以降) |
|
namespace
views
{
template
<
std::
size_t
N
>
|
(2) | (C++23以降) |
|
namespace
views
{
inline
constexpr
auto
pairwise_transform
=
adjacent_transform
<
2
>
;
|
(3) | (C++23以降) |
|
呼び出しシグネチャ
|
||
|
template
<
ranges::
viewable_range
R,
class
F
>
requires
/* 下記参照 */
|
(C++23以降) | |
|
template
<
class
F
>
constexpr /*range adaptor closure*/ adjacent_transform < N > ( F && fun ) ; |
(C++23以降) | |
adjacent_transform_view
は、
view
と呼び出し可能オブジェクト
fun
を受け取り、元のビューの
[
i
,
i
+
N
)
の各要素に
fun
を適用した結果の値である
i
番目
の要素を持つ
view
を生成する範囲アダプタです。
F
は常に
アリティ
N
を持ちます。
S
とする。このとき、生成されるビューのサイズは以下の通りである:
- S - N + 1 、ただし S >= N の場合、
- 0 それ以外の場合、結果のビューは空となる。
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 ) それ以外の場合。
F
のアリティも
2
であり、
fun
は二項呼び出し可能オブジェクトである。
adjacent_transform_view
は常に
forward_range
をモデルし、また適応された
view
型が対応するコンセプトをモデルする場合、
bidirectional_range
、
random_access_range
、または
sized_range
もモデルします。
目次 |
メンバー関数
adjacent_transform_view
を構築する
(公開メンバ関数) |
|
|
先頭を指すイテレータを返す
(公開メンバ関数) |
|
|
終端を指すイテレータまたはセンチネルを返す
(公開メンバ関数) |
|
要素数を返す(基となる範囲が
sized_range
を満たす場合のみ提供)
(公開メンバ関数) |
|
|
(C++26)
|
結果の
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
(クラステンプレート) (カスタマイゼーションポイントオブジェクト) |
|
|
(C++20)
|
要素の範囲に関数を適用する
(アルゴリズム関数オブジェクト) |