2015-10-23 3 views

ответ

3

Я думаю, что код, который вы написали, делает то, о чем вы просите. Вы реверсирование VEC с Rev(), а затем вы принимаете первые 3 элементы обращенного вектора (поэтому 0, 9, 8)

Чтобы получить последние 3 в необращенном заказе вы можете skip в конец вектора минус 3-х элементов, не обращая его:

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

Предположим, что вектор 1000 элементов. Вам нужно будет пропустить 997 элементов, а затем отобразить оставшиеся 3 элемента. Я хочу пропустить 3 элемента с конца, а затем напечатать 3 элемента, всего: 6 ходов. – vigu

+0

Итераторы @vigu не позволяют вам создавать один и тот же элемент дважды, поэтому вы не можете повторять итерации назад, а затем снова итерации вперед по тем же элементам. – Shepmaster

+0

@Shepmaster компилятор оптимизирует пропустить первые 1000 элементов? – vigu

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); 
} 

конечно, неэффективность из-за вас стрелять себе в ногу, избегая случайного доступа в первую очередь ...

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); 
} 

Большим преимуществом такого подхода является то, что она не требует, чтобы пропустить через элементы, которые вы не заинтересованы в том (что может иметь большая стоимость, если не оптимизирована). Он просто сделает новый фрагмент, а затем повторит его. Другими словами, у вас есть гарантия, что он будет быстрым.

Смежные вопросы