Rangeについて勉強

Range Library Proposal
Range Library提案を翻訳する。目標は今週中に

Range Library Proposal

摘要
この論文は, プログラマの構文的負担を軽減させるためにC++ standard libraryに対してのrangeの拡張を提案する. この論文はまた, alrgorithmとloopの使用を大きく簡潔にする, rangeに関連したいくつかのutilityについても検討する。

1 動機
1.1 rangeとは何か?
rangeとは単に2つのiteratorをカプセルに包んだものである. rangeの区間についてはC++ standard パラグラフ 24.1/7によって与えられている:
データ構造を処理するアルゴリズムのtemplateの多くはrangeを使用するinterfaceを備えている. rangeとは処理の開始と終了をそれぞれ指し示すiteratorのペアである. 通常, range[i, j)は, データ構造上でiが指す要素からjが指す要素を含まない位置までのいくつかの要素を表し, range[i, i)は空のrangeである. range[i, j)はiからjに到達可能であるときのみ有効である. 適用する関数に無効なrangeを渡したときの結果は未定義である.

1.2 有利さ
iteratorのrangeによって区間指定されたstandardのalgorithmは, しかしまだ幾分扱いにくい。2つのiteratorを1つのオブジェクトとして組み合わせてしまうことで, 我々は大きな恩恵を獲得することができる. この提案は以下をstandard C++に提供するであろう.
1. 構文上のオーバーヘッドの思い切った削減.
2. rangeを基にした(range-based)algorithmのための基盤(そしてこれは新しいfor-loop(see n1868)にも使用されうる)
3. 新しい, 簡潔な, 慣用的な, algorithmとloopの使用法
4. 組み込み配列のより安全な使用法

次の例はrangeの使用について, 構文がいかになめらかかつfunctionalになるかを示す.

vector<int> integers;

// old style
typedef vector<int>::iterator iterator;
pair<iterator,iterator> p = equal_range( integers.begin(), integers.end(), 0 );
for_each( p.first, p.second, some_functor() );

// new style
for_each( equal_range(integers, 0), some_functor() );

後者の方法はあなたをCobol-fingersにすることもないだろう.

rangeの基盤は, 独立したtraitsとUDTs(ユーザー定義型)の容易なサポートを可能にする関数からなる. いくつかの関数はすでにWalter Brownsの提案(see n1674)によって独自に提案されている.

range adaptorの一式とオーバーロードされた演算子が, standard algorithmの使用を夢のようにするだろう. まさに下の例で明らかである:

std::vector<int*> ptr_vec = ...;

std::copy( ptr_vec | std::reversed | std::indirected,
           std::ostream_iterator<int>( std::cout ) );

式 ptr_vec | std::reversed | std::indirected は ptr_vec から begin() と end() iteratorを展開し, (1)reverse_iterator, (2)indirect_iteratorでラップする. この式の戻り値はラップされたiteratorを保持しているrangeであり, このrangeはそして, 第1引数にrangeを取ることが出来るstd::copy()の新しいオーバーロードに渡される。rangeによる抽象化が無ければこれを果たすにはもっと多くの手間がかかるだろう.