最終更新日時(UTC):
が更新

履歴 編集

<ranges>

ranges(C++20)

<ranges> では、イテレータの組ではなく、コンテナや配列、部分的なコンテナなどを扱う範囲ライブラリを提供する。

C++17までは、標準アルゴリズム関数はイテレータの組を扱い、範囲を直接扱ってはいなかった。 範囲ライブラリはBoost.Rangeやrange-v3などで実績があり、C++標準にも取り込まれることになった。

範囲アクセス

これらの機能は従来<iterator>でフリー関数として提供されていた。 C++20では関数によるカスタマイゼーションポイントの問題点を解消するため、関数オブジェクトとして再実装されている。 互換性を維持するために従来の関数も残っているが、これらのカスタマイゼーションポイントオブジェクトを使用することが推奨される。

名前 説明 対応バージョン
begin 範囲の先頭を指すイテレータを取得する (customization point object) C++20
end 範囲の末尾の次を指すイテレータもしくは番兵を取得する (customization point object) C++20
cbegin 範囲の先頭を指す読み取り専用イテレータを取得する (customization point object) C++20
cend 範囲の末尾の次を指す読み取り専用イテレータもしくは番兵を取得する (customization point object) C++20
rbegin 範囲の末尾を指す逆イテレータを取得する (customization point object) C++20
rend 範囲の先頭の前を指す逆イテレータもしくは番兵を取得する (customization point object) C++20
crbegin 範囲の末尾を指す読み取り専用逆イテレータを取得する (customization point object) C++20
crend 範囲の先頭の前を指す読み取り専用逆イテレータもしくは番兵を取得する (customization point object) C++20
size 範囲の要素数を取得する (customization point object) C++20
ssize 範囲の要素数を、符号付き整数型で取得する (customization point object) C++20
empty 範囲が空かどうかを判定する (customization point object) C++20
data 範囲の要素配列へのポインタを取得する (customization point object) C++20
cdata 範囲の要素配列への読み取り専用ポインタを取得する (customization point object) C++20

範囲に関連する型へのアクセス

名前 説明 対応バージョン
iterator_t 範囲のイテレータ型を取得する (alias template) C++20
sentinel_t 範囲の番兵型を取得する (alias template) C++20
range_difference_t 範囲のイテレータの差の型を取得する (alias template) C++20
range_size_t 範囲のサイズの型を取得する(alias template) C++20
range_value_t 範囲の要素の型を取得する (alias template) C++20
range_reference_t 範囲の要素の参照型を取得する (alias template) C++20
range_rvalue_reference_t 範囲の要素の右辺値参照型を取得する (alias template) C++20

範囲コンセプト

名前 説明 対応バージョン
range 範囲を定義するコンセプト (concept) C++20
borrowed_range 所有権を持たない範囲 (concept) C++20
sized_range サイズを一定時間で求められる範囲 (concept) C++20
view ビューである範囲 (concept) C++20
output_range イテレータが出力イテレータである範囲 (concept) C++20
input_range イテレータが入力イテレータである範囲 (concept) C++20
forward_range イテレータが前進イテレータである範囲 (concept) C++20
bidirectional_range イテレータが双方向イテレータである範囲 (concept) C++20
random_access_range イテレータがランダムアクセスイテレータである範囲 (concept) C++20
contiguous_range イテレータが隣接イテレータである範囲 (concept) C++20
common_range イテレータと番兵の型が等しい範囲 (concept) C++20
viewable_range ビューに変換できる範囲 (concept) C++20

カスタマイゼーションポイント

名前 説明 対応バージョン
enable_borrowed_range 範囲をborrowed_rangeにする (variable template) C++20
enable_view 範囲をviewにする (variable template) C++20
disable_sized_range 範囲をsized_rangeにならないようにする (variable template) C++20

ビューインターフェース

名前 説明 対応バージョン
view_base 基底クラスとすることでviewとなるタグ型 (class) C++20
view_interface ビューの基底クラスとして推奨されるクラス (class template) C++20

部分範囲

名前 説明 対応バージョン
subrange_kind 部分範囲の種類を表す列挙体 (enum class) C++20
subrange イテレータペアを範囲として扱う (class template) C++20

ダングリングイテレータハンドリング

名前 説明 対応バージョン
dangling ダングリングイテレータ、ダングリング範囲を表す型 (class) C++20
borrowed_iterator_t 範囲がborrowed_rangeではないときdanglingとなるイテレータ (alias template) C++20
borrowed_subrange_t 範囲がborrowed_rangeではないときdanglingとなる部分範囲 (alias template) C++20

範囲ファクトリ

範囲ファクトリは、範囲ではないオブジェクトからviewを生成するものである。 その実体は、引数の無いものは変数テンプレート、引数のあるものは関数テンプレートやカスタマイゼーションポイントオブジェクトとなっている。

empty view

名前 説明 対応バージョン
empty_view 空の範囲 (class template) C++20
empty empty_viewを生成する (variable template) C++20

single view

名前 説明 対応バージョン
single_view 指定した値1つからなる範囲 (class template) C++20
single single_viewを生成する (customization point object) C++20

iota view

名前 説明 対応バージョン
iota_view 単調増加列である範囲 (class template) C++20
iota iota_viewを生成する (customization point object) C++20

istream view

名前 説明 対応バージョン
basic_istream_view 入力ストリームから値を読む範囲 (class template) C++20
istream_view basic_istream_viewを生成する (function template) C++20

範囲アダプタ

範囲アダプタは、既存の範囲に作用して新たなviewを生成するものである。 その実体はカスタマイゼーションポイントオブジェクトとなっている。

範囲アダプタを範囲に作用させる方法には、関数記法とパイプライン記法の2つがある。

Rを範囲アダプタ、rを元になる範囲とする。このとき、以下の2つの式は同じviewを生成する。

R(r)   // 関数記法
r | R  // パイプライン記法

範囲アダプタを適用した結果はview、すなわち範囲であることから、範囲アダプタを次々と繋いでいくことができる。

R1(R2(R3(r)))     // 関数記法
r | R1 | R2 | R3  // パイプライン記法

範囲アダプタの処理は遅延評価され、要素は必要になるまで生成されない。このような仕組みは実際の仕事の多くをイテレータが担うことで実現している。

for (auto&& item : r | R) {
  // ループ一回ごとに、(r | R)の要素を1つ生成する。このとき、rの要素を必要なだけ取得する。
}

第1引数にviewable_rangeを受け取ってviewを返すカスタマイゼーションポイントオブジェクトを、範囲アダプタオブジェクトという。とくに、1引数のものを範囲アダプタクロージャオブジェクトという。

all view

名前 説明 対応バージョン
ref_view 範囲への参照として振る舞うビュー (class template) C++20
all 範囲への参照として振る舞うビューを生成する (customization point object) C++20
all_t allの戻り値型 (alias template) C++20

filter view

名前 説明 対応バージョン
filter_view 指定した条件を満たす要素だけを集めるビュー (class template) C++20
filter 指定した条件を満たす要素だけを集めるビューを生成する (customization point object) C++20

transform view

名前 説明 対応バージョン
transform_view 指定した関数で各要素を変換するビュー (class template) C++20
transform 指定した関数で各要素を変換するビューを生成する (customization point object) C++20

take view

名前 説明 対応バージョン
take_view 先頭から指定した個数だけ取り出すビュー (class template) C++20
take 先頭から指定した個数だけ取り出すビューを生成する (customization point object) C++20

take while view

名前 説明 対応バージョン
take_while_view 先頭から指定した条件を満たす範囲を取り出すビュー (class template) C++20
take_while 先頭から指定した条件を満たす範囲を取り出すビューを生成する (customization point object) C++20

drop view

名前 説明 対応バージョン
drop_view 先頭から指定した個数だけ除外するビュー (class template) C++20
drop 先頭から指定した個数だけ除外するビューを生成する (customization point object) C++20

drop while view

名前 説明 対応バージョン
drop_while_view 先頭から指定した条件を満たす範囲を除外するビュー (class template) C++20
drop_while 先頭から指定した条件を満たす範囲を除外するビューを生成する (customization point object) C++20

join view

名前 説明 対応バージョン
join_view ネストされた範囲を平坦にするビュー (class template) C++20
join ネストされた範囲を平坦にするビューを生成する (customization point object) C++20

split view

名前 説明 対応バージョン
split_view 範囲を指定したデリミタで分割するビュー (class template) C++20
split 範囲を指定したデリミタで分割するビューを生成する (customization point object) C++20

counted view

名前 説明 対応バージョン
counted イテレータを指定した数だけ進めるビューを生成する (customization point object) C++20

common view

名前 説明 対応バージョン
common_view common_rangeにしたビュー (class template) C++20
common common_rangeなビューを生成する (customization point object) C++20

reverse view

名前 説明 対応バージョン
reverse_view 逆順のビュー (class template) C++20
reverse 逆順のビューを生成する (customization point object) C++20

elements view

名前 説明 対応バージョン
elements_view 第n要素を集めたビュー (class template) C++20
keys_view 第0要素を集めたビュー (alias template) C++20
values_view 第1要素を集めたビュー (alias template) C++20
elements elements_viewを生成する (variable template) C++20
keys keys_viewを生成する (customization point object) C++20
values values_viewを生成する (customization point object) C++20

バージョン

言語

  • C++20

処理系

関連項目

参照