名前空間
変種
操作

std::ranges::views::adjacent, std::ranges::adjacent_view, std::ranges::views::pairwise

From cppreference.com
< cpp‎ | ranges
 
 
Rangesライブラリ
Rangeアダプタ
adjacent_viewviews::adjacent
(C++23)(C++23)
views::pairwise
(C++23)

 
 
ヘッダ <ranges> で定義
template< ranges::forward_range V, std::size_t N >

    requires ranges::view<V> && (N > 0)
class adjacent_view

    : public ranges::view_interface<adjacent_view<V, N>>
(1) (C++23から)
namespace views {

    template< std::size_t N >
    constexpr /* unspecified */ adjacent = /* unspecified */ ;

}
(2) (C++23から)
namespace views {

    inline constexpr auto pairwise = adjacent<2>;

}
(3) (C++23から)
呼び出しシグネチャ
template< ranges::viewable_range R >

    requires /* 以下を参照 */

constexpr ranges::view auto adjacent<N>( R&& r );
(C++23から)
1) adjacent_view は、view を受け取り、元のビューの i番目から i + N - 1番目までの要素への N 個の参照を保持する std::tuple である i番目の要素(「ウィンドウ」)を生成する範囲アダプタです。
元のビューのサイズを S とします。このとき、生成されるビューのサイズは以下のようになります。
  • S - N + 1S >= N の場合)
  • 0 (それ以外の場合、結果のビューは空になります)
2) 名前 views::adjacent<N>RangeAdaptorObject を表します。サブ式 e と定数式 N が与えられた場合、式 views::adjacent<N>(e) は以下と 式的に等価 です。
  • ((void)e, auto(views::empty<tuple<>>))N0 に等しく、decltype((e))forward_range をモデルする場合)
  • adjacent_view<views::all_t<decltype((e))>, N>(e) (それ以外の場合)
3) 名前 views::pairwiseviews::adjacent<2> とまったく同じように動作する RangeAdaptorObject を表します。

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

目次

[編集] データメンバー

メンバ名 定義
base_ (プライベート) V の基底 view
(説明用のメンバオブジェクト*)

[編集] メンバ関数

adjacent_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 メンバ関数) [編集]

[編集] 推論補助

(なし)

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

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

[編集] ヘルパーテンプレート

template< class V, size_t N >

constexpr bool ranges::enable_borrowed_range<adjacent_view<V, N>> =

    ranges::enable_borrowed_range<V>;
(C++23から)

ranges::enable_borrowed_range のこの特殊化により、基底のビューがこれを満たす場合、adjacent_viewborrowed_range を満たします。

[編集] ノート

views::adjacent は、N0 の場合でもフォワードレンジのみを受け入れます。

ranges::adjacent_viewranges::slide_view には類似点があります

  • どちらもサイズ N の「スライディングウィンドウ」を作成します。
  • どちらも同じサイズ S - N + 1 を持ちます。ここで、S はアダプトされた view のサイズであり、S >= N > 0 が成り立ちます。

以下の表は、これらのアダプタの違いを示しています。

ビューアダプタ value_type ウィンドウサイズ N
ranges::adjacent_view std::tuple テンプレートパラメータ
ranges::slide_view ranges::range 実行時引数
機能テストマクロ 規格 機能
__cpp_lib_ranges_zip 202110L (C++23) ranges::zip_view,
ranges::zip_transform_view,
ranges::adjacent_view,
ranges::adjacent_transform_view

[編集]

#include <array>
#include <format>
#include <iostream>
#include <ranges>
#include <tuple>
 
int main()
{
    constexpr std::array v{1, 2, 3, 4, 5, 6};
    std::cout << "v = [1 2 3 4 5 6]\n";
 
    for (int i{}; std::tuple t : v | std::views::adjacent<3>)
    {
        auto [t0, t1, t2] = t;
        std::cout << std::format("e = {:<{}}[{} {} {}]\n", "", 2 * i++, t0, t1, t2);
    }
}

出力

v = [1 2 3 4 5 6]
e = [1 2 3]
e =   [2 3 4]
e =     [3 4 5]
e =       [4 5 6]

[編集] 欠陥報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 4098 C++23 views::adjacent<0> はかつて入力専用範囲を受け入れていました。 拒否されるようになりました

[編集] 参照

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

[編集] 関連項目

適合するviewの隣接する要素に変換関数を適用した結果からなる view
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
M番目の要素が別のviewのM番目から(M + N - 1)番目の要素に対するviewであるview
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
別のviewの要素をN個ずつの重複しない連続したチャンクにしたviewのrange
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
別のviewの要素からなり、一度にN個の要素を飛ばして進む view
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
English 日本語 中文(简体) 中文(繁體)