在没有复制的情况下使用迭代器

时间:2015-12-14 19:36:41

标签: rust

我不得不替换

let mut bo = vec![];
try!(o.read_to_end(&mut bo));
let mut bo = bo.into_iter();
let vs : Vec<_> = (&mut bo).take(BUFFER).collect();
try!(io::stdout().write(&vs));

用这个

let mut bo = vec![];
try!(o.read_to_end(&mut bo));
let mut io = 0;
let next = min(bo.len(), io + BUFFER);
try!(io::stdout().write(&bo[io..next]));

使用切片的速度是将数据复制到Vec的速度的两倍多。有没有办法在不复制的情况下使用take(n)

1 个答案:

答案 0 :(得分:1)

Iterator::take不做任何复制。另一方面,将迭代器收集到向量中,都会分配空间,然后将项目从迭代器移动到集合中。

使用切片是这里最惯用的解决方案。您希望在向量中输出一个连续的字节范围,并且切换到该向量可以为您提供几乎无法查看这些字节的范围。