Делаю задачу для тренировки, в последнем for выскакивает ошибка о выходе за границы вектора :
thread '<main>' panicked at 'index out of bounds: the len is 22 but the index is 22', ../src/libcollections/vec.rs:1106*
Не могу понять, почему так происходит, в цикле for не проверяется результат len() при каждом новом проходе цикла?
fn main(){
let e = 0.005;
let n = 30;
let mut vector: Vec<f32>;
vector = Vec::new();
for i in 0..n {
let result:f32 = 1./(i as f32 + 1.).powf(2.0);
vector.push( result );
}
for i in 0..vector.len(){
println!("len:{:?}", vector.len());
if vector[i] < e {
println!("{:?}", vector[i]);
vector.remove(i);
}
}
}
Я переделал под while и всё работает, но заводить счётчик до цикла как-то не красиво, да и i+=1; тоже, можно ли как-то это оформить посимпотичнее? Вот что получилось вместо последнего for
let mut i=0;
while( i < vector.len() ){
if vector[i] < e {
println!("{:?}", vector[i]);
vector.remove(i);
}
i+=1;
}
(0..n).filter(|&i| i % step == 0), или, в случае вектора:vec.into_iter().enumerate().filter(|&(i, _)| i % step == 0). В последнем случае с enumerate будет итератор по кортежам из индекса и элемента. – kstep Dec 24 '15 at 07:38into_iter()поглощает вектор и позволяет итераторировать по значению. Если вектор ещё будет нужен, то надо использоватьiter()илиiter_mut(), которые только заимствуют вектор, но итераторы будут по ссылке на элементы. – kstep Dec 24 '15 at 07:42