Если Vec<Veci32>>
- это то, что вы действительно хотите, то это довольно хороший способ сделать это.Любой другой подход (кроме кода unsafe
, см. Ниже) вряд ли будет значительно быстрее или использует заметно меньше памяти.Независимо от фактического кода, каждый вложенный Vec
является новым выделением памяти, и все данные необходимо будет скопировать - и это, по сути, все, что делает ваш код.
Более «ржавый» способ представления2D структура, подобная этой, представляет собой Vec
срезов в исходных данных.Таким образом, вы не копируете и не выделяете новые ресурсы.
let v_slices: Vec<&[i32]> = v.chunks(3).collect();
println!("{:?}", v_slices); // [[1, 1, 1], [2, 2, 2], [3, 3, 3]]
Редактировать: У меня здесь есть дополнительный бит с некоторым кодом unsafe
, который преобразует Vec<i32>
в Vec<Vec<i32>>
без перераспределения.Тем не менее, было отмечено, что он по-прежнему имеет неопределенное поведение и что проблема в основном не решаема