不允许随机访问元素。
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()
不起作用。
答案 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)
skip
和take
都不会产生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);
}
这种方法的最大优点是它不需要跳过你不感兴趣的元素(如果不进行优化,可能会有很大的成本)。它只会创建一个新切片,然后迭代它。换句话说,你可以保证它会很快。