Делаю задачу для тренировки, в последнем for выскакивает ошибка о выходе за границы вектора :
thread '
Не могу понять, почему так происходит, в цикле for не проверяется результат len() при каждом новом проходе цикла?
fn main(){ let e = 0.005; let n = 30; let mut vector: Vec
Я переделал под while и всё работает, но заводить счётчик до цикла как-то не красиво, да и i+=1; тоже, можно ли как-то это оформить посимпотичнее? Вот что получилось вместо последнего for
let mut i=0; while( i < vector.len() ){ if vector[i] < e { println!("{:?}", vector[i]); vector.remove(i); } i+=1; }
Ответ
В добавление советую внимательно прочитать документацию по Vec и Iterator. Практически всегда, когда хочется сделать for i in 0..vec.len() в расте нужно использовать итерирование по вектору напрямую или какой-то метод самого вектора или итератора от него. В частности в данном случае гораздо лучше использовать Vec::retain(), а для построения Iterator::collect() и Iterator::map()
let mut vector = (0..n).map(|i| 1./(i as f32 + 1.).powf(2.0)).collect::
Плюс ещё в том, что если использовать библиотечные методы и итераторы, то не будет сгенерирован код для проверки выхода индекса за границы массива (bounds check), как при использовании операции индексирования []
Комментариев нет:
Отправить комментарий