Namespaces
Variants

Ranges library (since C++20)

From cppreference.net
Ranges library
Range adaptors

rangesライブラリは、アルゴリズムとイテレータライブラリの拡張および一般化であり、それらを合成可能にし、エラーを起こしにくくすることで、より強力にするものです。

このライブラリは範囲 views を作成および操作します。これは、反復可能なシーケンス( ranges )を間接的に表現する軽量オブジェクトです。範囲は

  • [ 開始 , 終了 ) – イテレータペア(例:コンテナからの暗黙変換によって作成される範囲)。イテレータペアを受け取るすべてのアルゴリズムは、範囲を受け入れるオーバーロードを持つようになりました(例: ranges::sort
  • 開始 + [ 0 , サイズ ) – カウント付きシーケンス(例: views::counted によって返される範囲)
  • [ 開始 , predicate ) – 条件付き終端シーケンス(例: views::take_while によって返される範囲)
  • [ 開始 , .. ) – 無限シーケンス(例: views::iota によって返される範囲)

rangesライブラリは、 rangeアルゴリズム rangeアダプタ を含みます。rangeアルゴリズムは範囲に対して積極的に適用され、rangeアダプタはビューに対して遅延的に適用されます。アダプタはパイプラインに組み込むことができ、それらのアクションはビューが反復処理される際に実行されます。

ヘッダーで定義 <ranges>
namespace std {

namespace views = ranges :: views ;

}
(C++20以降)

名前空間エイリアス std::views は、 std::ranges::views の短縮形として提供されます。

名前空間 std::ranges で定義

目次

Range access
定義済みヘッダー <ranges>
定義済みヘッダー <iterator>
範囲の先頭を指すイテレータを返す
(カスタマイゼーションポイントオブジェクト)
範囲の終端を示すセンチネルを返す
(カスタマイゼーションポイントオブジェクト)
読み取り専用範囲の先頭を指すイテレータを返す
(カスタマイゼーションポイントオブジェクト)
読み取り専用範囲の終端を示すセンチネルを返す
(カスタマイゼーションポイントオブジェクト)
範囲の逆方向イテレータを返す
(カスタマイゼーションポイントオブジェクト)
範囲の逆方向終端イテレータを返す
(カスタマイゼーションポイントオブジェクト)
読み取り専用範囲への逆イテレータを返す
(カスタマイゼーションポイントオブジェクト)
読み取り専用範囲の逆方向終端イテレータを返す
(カスタマイゼーションポイントオブジェクト)
範囲によって与えられるリザーブヒントと等しい整数を返す
(カスタマイゼーションポイントオブジェクト)
範囲のサイズに等しい整数を返す
(カスタマイゼーションポイントオブジェクト)
範囲のサイズに等しい符号付き整数を返す
(カスタマイゼーションポイントオブジェクト)
範囲が空かどうかをチェックする
(カスタマイゼーションポイントオブジェクト)
連続範囲の先頭へのポインタを取得する
(カスタマイゼーションポイントオブジェクト)
読み取り専用連続範囲の先頭へのポインタを取得する
(カスタマイゼーションポイントオブジェクト)
レンジプリミティブ
定義済みヘッダー <ranges>
範囲のイテレータ型とセンチネル型を取得する
(エイリアステンプレート)
範囲のサイズ、差分、および値の型を取得する
(エイリアステンプレート)
範囲の参照型を取得する
(エイリアステンプレート)
ダングリングイテレータの取り扱い
定義済みヘッダー <ranges>
イテレータまたは subrange がダングリング状態になるため返すべきではないことを示すプレースホルダ型
(クラス)
borrowed_range のイテレータ型または subrange 型を取得する
(エイリアステンプレート)
その他のユーティリティ
定義済みヘッダー <ranges>
範囲を単一の値ではなくシーケンスとして扱うことを示すタグ
(クラステンプレート)
Range コンセプト
定義済みヘッダー <ranges>
型が範囲であること、すなわち begin イテレータと end センチネルを提供することを指定する
(コンセプト)
型が range であり、その式から取得したイテレータがダングリングの危険なく安全に返却できることを指定する
(コンセプト)
範囲が定数時間でそのサイズを推定できることを指定する
(concept)
範囲がそのサイズを定数時間で知ることができることを指定する
(コンセプト)
範囲がビューであること、すなわち定数時間でのコピー/ムーブ/代入が可能であることを指定する
(コンセプト)
イテレータ型が input_iterator を満たす範囲を指定する
(コンセプト)
イテレータ型が output_iterator を満たす範囲を指定する
(コンセプト)
前方イテレータを満たすイテレータ型を持つ範囲を指定する forward_iterator
(コンセプト)
双方向イテレータの要件を満たすイテレータ型を持つ範囲を指定する bidirectional_iterator
(コンセプト)
イテレータ型が random_access_iterator を満たす範囲を指定する
(コンセプト)
連続したイテレータ型を満たす範囲を指定する contiguous_iterator
(コンセプト)
範囲が同一のイテレータ型とセンチネル型を持つことを指定する
(コンセプト)
range が安全に view に変換可能であるための要件を指定する
(コンセプト)
範囲が読み取り専用要素を持つことを指定する
(コンセプト)
範囲変換
ヘッダーで定義 <ranges>
(C++23)
入力範囲から新しい非ビューオブジェクトを構築する
(関数テンプレート)
ビュー
定義済みヘッダー <ranges>
view を定義するためのヘルパークラステンプレート、 curiously recurring template pattern を使用
(クラステンプレート)
イテレータとセンチネルのペアを view に結合する
(クラステンプレート)

レンジファクトリ

ヘッダーで定義 <ranges>
名前空間で定義 std::ranges
要素を持たない空の view
(クラステンプレート) (変数テンプレート)
指定された値の単一要素を含む view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト)
初期値を繰り返しインクリメントして生成されるシーケンスからなる view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト)
同じ値を繰り返し生成して作成されるシーケンスからなる view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト)
関連付けられた入力ストリームに対する operator>> の連続的な適用によって得られる要素からなる view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト)

レンジアダプタ

定義済みヘッダー <ranges>
名前空間 std::ranges で定義
レンジアダプタクロージャオブジェクトを定義するためのヘルパーベースクラステンプレート
(クラステンプレート)
view を返す range の全要素を含む
(エイリアステンプレート) (レンジアダプタオブジェクト)
他の range の要素を参照する view
(クラステンプレート)
ある view を一意所有する range
(クラステンプレート)
各要素を右辺値にキャストするシーケンスの view
(クラステンプレート) (レンジアダプタオブジェクト)
view で、述語を満たす range の要素から構成される
(クラステンプレート) (range adaptor object)
各要素に変換関数を適用するシーケンスの view
(クラステンプレート) (レンジアダプタオブジェクト)
別の view の最初のN個の要素から構成される view
(クラステンプレート) (レンジアダプタオブジェクト)
別の view の先頭要素から、述語が false を返す最初の要素までを含む view
(クラステンプレート) (範囲アダプタオブジェクト)
別の view の要素からなる view 。最初のN個の要素をスキップする
(クラステンプレート) (レンジアダプタオブジェクト)
別の view の要素から構成される view 。述語が false を返す最初の要素までの初期部分列をスキップする
(クラステンプレート) (レンジアダプタオブジェクト)
view range s からなる view を平坦化して得られるシーケンスから構成される
(クラステンプレート) (range adaptor object)
a view 範囲のビューから平坦化して得られたシーケンスから構成されるビューで、要素間に区切り文字を挿入する
(クラステンプレート) (範囲アダプタオブジェクト)
デリミタを使用して別の view を分割して得られる部分範囲に対する view
(クラステンプレート) (範囲アダプタオブジェクト)
デリミタを使用して別の view を分割して得られる部分範囲を表す view
(クラステンプレート) (範囲アダプタオブジェクト)
アダプトされたビューの連結からなる view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト)
イテレータとカウントからサブレンジを作成する
(カスタマイゼーションポイントオブジェクト)
view common_range に変換する
(クラステンプレート) (レンジアダプタオブジェクト)
双方向 view の要素を逆順に反復する
(クラステンプレート) (範囲アダプタオブジェクト)
view constant_range に変換する
(クラステンプレート) (レンジアダプタオブジェクト)
view から成る tuple-like 値と数値Nを取り、各タプルのN th 要素から成る view を生成する
(クラステンプレート) (レンジアダプタオブジェクト)
ペアのような値からなる view を受け取り、各ペアの最初の要素からなる view を生成する
(クラステンプレート) (レンジアダプタオブジェクト)
ペアのような値からなる view を受け取り、各ペアの2番目の要素からなる view を生成する
(クラステンプレート) (レンジアダプタオブジェクト)
適応されたシーケンスの各要素を、要素の位置とその値の両方を含むタプルにマッピングする view
(クラステンプレート) (レンジアダプタオブジェクト)
適応されたビューの対応する要素への参照のタプルから構成される view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト)
変換関数を適用したビューの対応する要素の結果から構成される view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト)
適応されたビューの隣接する要素への参照のタプルから構成される view
(クラステンプレート) (レンジアダプタオブジェクト)
適応されたビューの隣接する要素に変換関数を適用した結果からなる view
(クラステンプレート) (レンジアダプタオブジェクト)
別の view の要素からなる、サイズ N の非重複連続チャンクの view の範囲
(クラステンプレート) (範囲アダプタオブジェクト)
M th 要素が別の view のM th から(M + N - 1) th 要素までの view である view
(クラステンプレート) (レンジアダプタオブジェクト)
指定された述語が false を返す隣接要素の各ペア間で view を部分範囲に分割する
(クラステンプレート) (範囲アダプタオブジェクト)
別の view の要素から構成され、一度にN要素進む view
(クラステンプレート) (レンジアダプタオブジェクト)
アダプトされたビューのn項デカルト積によって計算された結果のタプルからなる view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト)
基となるシーケンスの最後にアクセスされた要素をキャッシュする view
(クラステンプレート) (レンジアダプタオブジェクト)
view input_range のみで、非 common_range の範囲に変換する
(クラステンプレート) (範囲アダプタオブジェクト)

レンジジェネレータ (C++23以降)

ヘッダーで定義 <generator>
名前空間で定義 std
(C++23)
同期 コルーチン ジェネレータを表す view
(クラステンプレート)

ヘルパーアイテム

レンジアダプタオブジェクト

RangeAdaptorObject (RAO) を参照してください。

レンジアダプタクロージャオブジェクト

RangeAdaptorClosureObject (RACO) を参照してください。

カスタマイゼーションポイントオブジェクト

Customization point object (CPO) を参照してください。

代入可能ラッパー

一部の範囲アダプタは、その要素や関数オブジェクトを copyable-box (until C++23) movable-box (since C++23) でラップします。このラッパーは、必要に応じてラップされたオブジェクトに代入可能性を追加します。

非伝播キャッシュ

一部のレンジアダプタは、説明専用のクラステンプレート non-propagating-cache によって定義されており、これはほぼ std:: optional < T > のように動作します(相違点については説明を参照)。

条件付き const

template < bool Const, class T >
using /*maybe-const*/ = std:: conditional_t < Const, const T, T > ;
( 説明専用* )

エイリアステンプレート /*maybe-const*/ は、型 T に条件付きで const 修飾子を適用するために使用される短縮記法です。

整数ライク型ヘルパーテンプレート

template < /*is-integer-like*/ T >
using /*make-signed-like-t*/ < T > = /* 説明を参照 */ ;
(1) ( 説明専用* )
template < /*is-integer-like*/ T >
using /*make-unsigned-like-t*/ < T > = /* 説明を参照 */ ;
(2) ( 説明専用* )
template < /*is-integer-like*/ T >

/*make-unsigned-like-t*/ < T > /*to-unsigned-like*/ ( T t )
{
return static_cast < /*make-unsigned-like-t*/ < T >> ( t ) ;

}
(3) ( 説明専用* )
1) 整数ライク型 T について:
  • T が整数型の場合、 /*make-signed-like-t*/ < T > std:: make_signed_t < T > である。
  • それ以外の場合、 /*make-signed-like-t*/ < T > T と同じ幅を持つ対応する未規定の符号付き整数ライク型である。
2) 整数ライクな型 T に対して:
  • T が整数型の場合、 /*make-unsigned-like-t*/ < T > std:: make_unsigned_t < T > である。
  • それ以外の場合、 /*make-signed-like-t*/ < T > T と同じ幅を持つ対応する未規定の符号なし整数ライク型である。
3) 明示的に t /*make-unsigned-like-t*/ < T > に変換します。

カスタマイゼーションポイントオブジェクトヘルパー

template < ranges:: input_range R >

constexpr auto & /*possibly-const-range*/ ( R & r ) noexcept
{
if constexpr ( ranges:: input_range < const R > )
return const_cast < const R & > ( r ) ;
else
return r ;

}
(1) ( 説明専用* )
template < class T >

constexpr auto /*as-const-pointer*/ ( const T * p ) noexcept
{
return p ;

}
(2) ( 説明専用* )

一部の範囲アクセスカスタマイゼーションポイントオブジェクトは、これらの説明専用の関数テンプレートに基づいて規定されています。

1) /*possibly-const-range*/ input_range をモデル化する場合、 r のconst修飾版を返す。それ以外の場合、 r をキャストなしで返す。
2) /*as-const-pointer*/ 定数型オブジェクトへのポインタを返します。

レンジアダプタヘルパー

(注:指定されたHTML要素には翻訳対象のテキストコンテンツが含まれていないため、構造は完全に保持されたままです)
template < class F, class Tuple >

constexpr auto /*tuple-transform*/ ( F && f, Tuple && tuple )
{
return std:: apply ( [ & ] < class ... Ts > ( Ts && ... args )
{
return std:: tuple < std:: invoke_result_t < F & , Ts > ... >
( std:: invoke ( f, std:: forward < Ts > ( args ) ) ... ) ;
} , std:: forward < Tuple > ( tuple ) ) ;

}
(1) ( 説明専用* )
template < class F, class Tuple >

constexpr void /*tuple-for-each*/ ( F && f, Tuple && tuple )
{
std:: apply ( [ & ] < class ... Ts > ( Ts && ... args )
{
( static_cast < void > ( std:: invoke ( f, std:: forward < Ts > ( args ) ) ) , ... ) ;
} , std:: forward < Tuple > ( tuple ) ) ;

}
(2) ( 説明専用* )
template < class T >

constexpr T & /*左辺値として*/ ( T && t )
{
return static_cast < T & > ( t ) ;

}
(3) ( 説明専用* )

一部の範囲アダプタは、これらの説明専用の関数テンプレートに基づいて規定されています。

1) /*tuple-transform*/ は、 f tuple の各要素に適用して構築された新しいタプルを返します。
2) /*tuple-for-each*/ f tuple の各要素に適用し、何も返さない。
3) /*as-lvalue*/ 右辺値を左辺値として転送します t

ヘルパー概念

以下の説明専用の概念はいくつかの型で使用されていますが、これらは標準ライブラリのインターフェースの一部ではありません。

変更点: - HTMLタグ、属性、C++コード内のテキストはそのまま保持 - コメント部分 `/*all-random-access*/` はC++コード内のため非翻訳 - 説明テキスト「exposition only*」を「説明専用*」に翻訳 - タイトル属性のテキストを日本語に翻訳 - 数値「(5)」はそのまま保持 - すべてのHTML構造とクラス属性を完全に保持 (注:このHTML要素には翻訳対象のテキストコンテンツが含まれていないため、元の構造を保持したまま出力します)
template < class R >

concept /*単純ビュー*/ =
ranges:: view < R > && ranges:: range < const R > &&
std:: same_as < ranges:: iterator_t < R > , ranges:: iterator_t < const R >> &&

std:: same_as < ranges:: sentinel_t < R > , ranges:: sentinel_t < const R >> ;
(1) ( 説明専用* )
template < class I >

concept /*has-arrow*/ =
ranges :: input_iterator < I > &&

( std:: is_pointer_v < I > || requires ( const I i ) { i. operator - > ( ) ; } ) ;
(2) ( 説明専用* )
template < class T, class U >

concept /*different-from*/ =

! std:: same_as < std:: remove_cvref_t < T > , std:: remove_cvref_t < U >> ;
(3) ( 説明専用* )
template < class R >

concept /*移動可能な参照を持つ範囲*/ =
ranges:: input_range < R > &&
std:: move_constructible < ranges:: range_reference_t < R >> &&

std:: move_constructible < ranges:: range_rvalue_reference_t < R >> ;
(4) ( 説明専用* )
template < bool C, class ... Views >

concept /*all-random-access*/ =
( ranges:: random_access_range

< std:: conditional_t < C, const Views, Views >> && ... ) ;
(5) ( 説明専用* )
template < bool C, class ... Views >

concept /*all-bidirectional*/ =
( ranges:: bidirectional_range

< std:: conditional_t < C, const Views, Views >> && ... ) ;
(6) ( 説明専用* )
template < bool C, class ... Views >

concept /*all-forward*/ =
( ranges:: forward_range

< std:: conditional_t < C, const Views, Views >> && ... ) ;
(7) ( 説明専用* )

注記

**注記**: このHTMLコードでは、翻訳すべきテキスト要素がほとんど含まれていません。以下の点にご注意ください: - ` `タグ内の`202202L`は翻訳対象外 - ` `内の`(C++23)`はC++固有のバージョン表記のため翻訳対象外 - ` `内の`ranges::range_adaptor_closure`はC++固有の用語のため翻訳対象外 - HTMLタグ、属性、リンクはすべて保持されています 翻訳が必要なテキスト要素が存在しないため、元のHTML構造は完全に保持されています。 **注釈**: このHTMLコードには翻訳すべきテキストが含まれていません。すべてのテキストは以下のいずれかに該当します: - HTMLタグおよび属性 - ` `タグ内のテキスト(C++識別子) - C++固有の用語(`std::const_iterator`、`ranges::as_const_view`) - 数値リテラル(`202207L`) - 言語バージョン表記(`(C++23)`) したがって、元のHTMLコードは変更せずにそのまま保持されます。 **注記**: このHTMLフラグメントには翻訳すべきテキストがほとんど含まれていません。以下の要素はC++固有の用語であり、翻訳対象外です: - `__cpp_lib_ranges_as_rvalue` - `202207L` - `(C++23)` - `ranges::as_rvalue_view` HTMLタグ、属性、および` `タグ内のテキストはすべて原文のまま保持されています。 HTMLタグ、属性、 タグ内のテキスト、C++固有の用語は翻訳せず、元のフォーマットを保持しました。 **注記**: このHTMLコードでは、以下の理由から翻訳対象となるテキストがほとんど含まれていません: 1. ` `タグ内のテキスト(`__cpp_lib_ranges_enumerate`、`202302L`)は翻訳対象外 2. C++固有の用語(`ranges`、`enumerate_view`)は翻訳対象外 3. HTMLタグ、属性、記号(`::`)は保持 4. 唯一の自然言語テキストであるタイトル属性(`cpp/feature test`、`cpp/compiler support/23`)は技術的なパス/識別子であり、翻訳の必要はありません したがって、元のHTMLコードはそのまま維持されます。 **注記**: このHTMLフラグメントには翻訳すべきテキストがほとんど含まれていません。以下の要素は翻訳対象外です: - HTMLタグと属性 - ` `タグ内のテキスト(`__cpp_lib_ranges_join_with`、`202202L`) - C++固有の用語(`ranges::join_with_view`) - バージョン表記(`(C++23)`) 唯一の翻訳対象であったタイトル属性は元の英語のまま保持されています。 **翻訳結果:** **注記:** - HTMLタグ、属性、 タグ内のテキストは翻訳していません - C++固有の用語(__cpp_lib_ranges_repeat、ranges::repeat_viewなど)は翻訳していません - 数値(202207L)はそのまま保持しています - フォーマットと構造は完全に保持されています **注記**: このHTMLフラグメントには翻訳すべきテキストがほとんど含まれていません。以下の要素のみが翻訳対象となります: - ` (C++23) ` - ただしC++23はバージョン番号なので翻訳不要 - その他のテキストはすべてHTMLタグ内、コードブロック内、またはC++固有の用語(`ranges::slide_view`)であるため、翻訳せずに保持されています。 HTMLタグ、属性、 タグ内のテキスト、C++固有の用語は翻訳せず、元のフォーマットを保持しました。
機能テスト マクロ 標準 機能
__cpp_lib_generator 202207L (C++23) std:: generator 同期コルーチンジェネレータ for 範囲
__cpp_lib_ranges 201911L (C++20) 範囲ライブラリと 制約付きアルゴリズム
202106L (C++23)
(DR20)
default-initializable views
202110L (C++23)
(DR20)
Views 所有権
202202L (C++23) ranges:: range_adaptor_closure
202207L (C++23) ムーブオンリー型を許可するための レンジアダプタ の緩和
202211L (C++23) 「ポイズンピル」オーバーロードの削除 (P2602) in ranges:: begin など
202302L (C++23) 特定の射影を許可するための範囲の緩和
202406L (C++26)
(DR20)
間接的に呼び出し可能な概念からの共通参照要件の削除
__cpp_lib_ranges_as_const 202207L (C++23) std:: const_iterator , ranges:: as_const_view
__cpp_lib_ranges_as_rvalue 202207L (C++23) ranges:: as_rvalue_view
__cpp_lib_ranges_cache_latest 202411L (C++26) ranges :: cache_latest_view
__cpp_lib_ranges_cartesian_product 202207L (C++23) ranges:: cartesian_product_view
__cpp_lib_ranges_chunk 202202L (C++23) ranges:: chunk_view
__cpp_lib_ranges_chunk_by 202202L (C++23) ranges:: chunk_by_view
__cpp_lib_ranges_concat 202403L (C++26) ranges:: concat_view
__cpp_lib_ranges_enumerate 202302L (C++23) ranges :: enumerate_view
__cpp_lib_ranges_join_with 202202L (C++23) ranges:: join_with_view
__cpp_lib_ranges_repeat 202207L (C++23) ranges:: repeat_view
__cpp_lib_ranges_repeat 202207L (C++23) ranges:: repeat_view
__cpp_lib_ranges_reserve_hint 202502L (C++26) ranges :: reserve_hint および ranges :: approximately_sized_range
__cpp_lib_ranges_slide 202202L (C++23) ranges:: slide_view
__cpp_lib_ranges_stride 202207L (C++23) ranges:: stride_view
__cpp_lib_ranges_to_container 202202L (C++23) ranges:: to
__cpp_lib_ranges_to_input 202502L (C++26) ranges :: to_input_view
__cpp_lib_ranges_zip 202110L (C++23) ranges:: zip_view
ranges:: zip_transform_view
ranges:: adjacent_view
ranges:: adjacent_transform_view

#include <iostream>
#include <ranges>
int main()
{
    auto const ints = {0, 1, 2, 3, 4, 5};
    auto even = [](int i) { return 0 == i % 2; };
    auto square = [](int i) { return i * i; };
    // ビューを合成する「パイプ」構文:
    for (int i : ints | std::views::filter(even) | std::views::transform(square))
        std::cout << i << ' ';
    std::cout << '\n';
    // 従来の「関数型」合成構文:
    for (int i : std::views::transform(std::views::filter(ints, even), square))
        std::cout << i << ' ';
}

出力:

0 4 16
0 4 16

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 3509
( P2281R1 )
C++20 レンジアダプターオブジェクトが末尾引数をどのようにバインドするか不明確だった 値によってバインドされる
LWG 3948 C++23 possibly-const-range as-const-pointer
noexcept で宣言されていなかった
noexcept で宣言される
LWG 4027 C++23 possibly-const-range が既に constant_range をモデル化しているレンジに対して
const修飾を追加しなかった
そのようなレンジに対しても
const修飾を追加する
LWG 4112 C++20 has-arrow i のconst修飾を要求していなかった 要求する

関連項目