イテレータ
(原文)
collect
と extend
Iterator::collect
はイテレータを Vec
のようなコレクション型に変換します。これは通常割り当てを必要とします。もしコレクション型がその後再びイテレートされるだけなのであれば、collect
の呼び出しは避けるべきです。
上記の理由から、Vec<T>
よりも impl Iterator<Item=T>
といったイテレータ型を関数から返した方が多くの場合好ましいです。ただ、この記事で説明されているように、そういった返り値には追加のライフタイム注釈が必要となる場合があることに注意してください。
同様に、イテレータを Vec
にして append
を使うよりも、イテレータを使って既存のコレクション型(Vec
など)を拡張するために extend
を使った方が良いでしょう。
最後に、イテレータを書くときは、可能であれば Iterator::size_hint
か ExactSizeIterator::len
メソッドを実装した方が多くの場合好ましいです。その理由として、イテレータによって生成される要素数についての事前情報が手に入るため、イテレータを使う collect
や extend
といった呼び出しにおいてより小さな割り当てを行える、というものがあります。
チェイン
chain
はとても便利ですが、単一のイテレータより遅くなることがあります。可能であればホットなイテレータに対しては使用を避けるべきでしょう。
同様に、map
に続けて filter
を使うよりも、filter_map
を使用した方が高速になることがあります。