迭代器
collect
和 extend
Iterator::collect
将迭代器转换为诸如 Vec
之类的集合,这通常需要进行分配。如果转换成集合之后只是再次进行迭代,应避免调用 collect
。
因此,通常最好从函数返回像 impl Iterator<Item=T>
这样的迭代器类型,而不是 Vec<T>
。请注意,有时这些返回类型需要额外的生命周期,正如这篇博文所解释的那样。
示例。
类似地,你可以使用 extend
来扩展现有集合(如 Vec
)的迭代器,而不是将迭代器收集到 Vec
中,然后使用 append
。
最后,当你编写一个迭代器时,如果可能的话,通常值得实现 Iterator::size_hint
或 ExactSizeIterator::len
方法。使用迭代器的 collect
和 extend
调用可能会减少分配,因为它们提前了解了迭代器产生的元素数量。
链式调用
chain
可能非常方便,但与单个迭代器相比,它也可能更慢。如果可能的话,对于热迭代器,最好避免使用它。
示例。
类似地,filter_map
可能比先使用 filter
再使用 map
更快。
块 (chunks)
当需要分块迭代器且块大小已知确切地能整除切片长度时,使用更快的 slice::chunks_exact
而不是 slice::chunks
。
当块大小未知确切地能整除切片长度时,仍然可以更快地使用 slice::chunks_exact
结合 ChunksExact::remainder
或手动处理多余元素。
示例 1,
示例 2。
对于相关的迭代器也是如此: