Iterator

コンテナクラスのeachメソッドなどによって生成されます。

多くのメソッドはIteratorを返すため、メソッドチェーンを形成することでイテレートする要素範囲を狭めることが出来ます。

また、Iteratorのメソッドには、要素を引数として呼び出す関数(的なもの)をpredなどという形で引数として渡すことが出来るものが多いですが、これには関数・メソッド・ラムダ式を使うことが出来ます。特にラムダ式は単純な内容であれば簡潔に書くことが出来るので、Iteratorのメソッドを使うのであれば積極的に使うこととなるかと思います。

traditionalなfor文を使った方が動作は速いです。ただし、差はそこまで大きくないのでどちらでも良いと思います(その差が大きく響いてくるならC++への移植も視野に入れましょう)。

Bug

正確な条件・対象バージョン未確認

Iterable継承クラス(ArrayなりStringなり)のeachで取得したIteratorを何かの変数に代入してそれのメソッドを使おうとすると、うまく動きません。

array : [0, 1, 2, 3];
// うまく動く
array.each.with_index.find(|i,x| x==3).p;
// うまく動かない(かも?)
iter : array.each;
iter.with_index.find(|i,x| x==3).p;

Example

array : (0..19)[];
 
// 偶数を前半に、奇数を後半にもってくる
array.with_index.filter(|i,x| x%2==0).chain(array.with_index.filter(|i, x| x%2==1)).with_index{|current, prev, it|
    %f[%d : %d => %d](it, prev, current).p;
}

こんなコード書く人はいないと思いますが、いろいろ使ってみた一例です。

Method

XtalC++namedescription
oxscan
ooip要素をn個デバッグプリントする
oojoin要素をセパレータで連結した文字列を返す
oowith_index(i, it)を返すイテレータを返す
oocollect/map要素を変換した要素を返すイテレータを返す
ooselect選別された要素を返すイテレータを返す
oofilter選別された要素を返すイテレータを返す
oobreak_iftrueを返すまでイテレートするイテレータを返す
ootaketimes回イテレートするイテレータを返す
oozip並列にイテレートするイテレータを返す
oochain直列にイテレートするイテレータを返す
oocycleイテレートする要素をがなくなったら最初からになるイテレータを返す
oomax_elementイテレートする要素の最大の値を返す
oomin_elementイテレートする要素の最小の値を返す
oofindイテレートする要素から検索し、一致する値を返す
ooinject
oowith_prev(前回の要素, 今回の要素)を要素とするイテレータを返す
reference/iterator.txt · 最終更新: 2012/09/24 20:38 by sukai
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0