Вы можете реструктурировать создание скопированного списка, чтобы выполнить удаление до копии:
for i in 0..10 {
let dup = your_list.iter().filter(|n| n > i).collect::<Vec<_>>();
use_it(dup);
}
Если для вашего варианта использования важно, чтобы у вас осталась отфильтрованнаяVec
, и не может изменить тип коллекции, то это, вероятно, самый полезный способ.Если фильтры являются кумулятивными, вы можете перезаписать исходную Vec
с отфильтрованной Vec
каждой итерацией, чтобы уменьшить рабочую нагрузку для каждой будущей итерации.
let mut list = your_list;
for i in 0..10 {
list = list.iter().filter(|n| n > i).collect();
use_it(list.clone());
}
Заданный вами вопрос прямо ответил, изменив способ фильтрации и дублирования вектора, но если вы можете изменить свои типы, то ответы ниже могут быть более полезными.
Если ваша use_it
функция не требуется a Vec
или срез, тогда вам может быть лучше обслужить перестройку потребителя, чтобы он взял итератор чисел, и передав your_list.iter().filter(...)
.Это не приведет к копированию или переупорядочению в памяти, а функция потребителя просто пропустит недопустимые значения.
Если вам нужно больше подсчитывать, сколько раз числа появляются в коллекции, и вам не требуется конкретно последовательноеСписок в памяти, вы можете изменить свой список в HashMap
:
use std::collections::HashMap;
let mut dict: HashMap<i32, usize> = HashMap::new();
for num in your_list {
*dict.entry(num).or_insert(0) += 1;
}
, а затем вы можете отфильтровать числа из карты с постоянным доступом, а не с линейным временем по размеру коллекции.