使用迭代器,如何跳过多个值然后显示其余值?

时间:2015-10-23 16:03:14

标签: iterator rust

不允许随机访问元素。

let vec = vec![1,2,3,4,5,6,7,8,9,0];
let n = 3;
for v in vec.iter().rev().take(n) {
    println!("{}", v);
}
// this printed: 0, 9, 8
// need: 8, 9, 0

for v in vec.iter().rev().skip(n).rev()不起作用。

3 个答案:

答案 0 :(得分:3)

我认为您编写的代码符合您的要求。 你正在用rev()反转vec,然后你取反向矢量的前3个元素(因此0,9,8)

要以非反转顺序获取最后3个,你可以func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) { replyHandler(["message": "Hello Watch!"]) } 到向量的末尾减去3个元素,而不反转它:

skip

答案 1 :(得分:2)

skiptake都不会产生DoubleEndIterator,您必须:

  • skip,跳过项目数为O(N)
  • collect .rev().take()的结果,然后是rev,即要打印的项目数量为O(N),并且需要为它们分配内存

skip很明显,所以让我来说明收集:

let vec = vec![1,2,3,4,5,6,7,8,9,0];
let vec: Vec<_> = vec.iter().rev().take(3).collect();
for v in vec.iter().rev() {
    println!("{}", v);
}

当然,效率低下的原因是你首先避免随意进入,从而使自己陷入脚步......

答案 2 :(得分:1)

根据评论,我想你想要专门迭代Vec或切片的元素。如果是这种情况,您可以使用范围切片,如下所示:

let vec = vec![1,2,3,4,5,6,7,8,9,0];
let n = vec.len() - 3;
for v in &vec[n..] {
    println!("{}", v);
}

这种方法的最大优点是它不需要跳过你不感兴趣的元素(如果不进行优化,可能会有很大的成本)。它只会创建一个新切片,然后迭代它。换句话说,你可以保证它会很快。