Iterators
collect
Iterator::collect
将一个迭代器转换为一个集合,如Vec
,它通常需要一个分配。如果该集合只是再次迭代,你应该避免调用collect
。
出于这个原因,从函数中返回一个迭代器类型,比如impl Iterator<Item=T>
,往往比Vec<T>
更好。请注意,有时这些返回类型需要额外的生存期,正如this post所解释的那样。
Example.
同样,你可以使用extend
用迭代器扩展一个现有的集合(如Vec
),而不是将迭代器收集到Vec
中,然后使用append
。
最后,当编写迭代器时,如果可能的话,实现 Iterator::size_hint
或 ExactSizeIterator::len
方法通常是值得的。使用该迭代器的 collect
和 extend
调用可能会减少分配,因为它们提前了解迭代器产生的元素数量信息。
Chaining
chain
可以非常方便,但也可能比单个迭代器慢。如果可能的话,热迭代器可能值得避免。
Example.
类似地,filter_map
可能比使用filter
和map
更快。
Chunks
当需要一个分块迭代器,并且已知分块大小恰好能整除切片长度时,应该使用更快的 slice::chunks_exact
而不是 slice::chunks
。
当分块大小不确定能否恰好整除切片长度时,仍然可以更快地使用 slice::chunks_exact
,结合 ChunksExact::remainder
或手动处理多余元素。
Example 1,
Example 2.
同样适用于相关的迭代器: