Rust эффективно портировать большой вектор в вектор векторов - PullRequest
0 голосов
/ 29 января 2019

Я хочу разделить большой вектор на вектор векторов.Я знаю о chunks (), но не уверен, что лучше всего перейти от итератора к 2D Vec.Я нашел следующее, чтобы работать, но есть ли лучший способ написать это?

let v: Vec<i32> = vec![1,1,1,2,2,2,3,3,3];
let v_chunked: Vec<Vec<i32>> = v.chunks(3).map(|x| x.to_vec()).collect();

println!("{:?}", v_chunked); // [[1, 1, 1], [2, 2, 2], [3, 3, 3]]

https://play.rust -lang.org /? Version = stable & mode = debug & edition = 2018 & gist = 5031d4d0e43470242b8304d483967a25

Обновление: первоначальный вопрос был немного широким.Операция, похожая на приведенный выше пример, была одной из самых медленных частей моей программы после профилирования, и мне было интересно, как ее улучшить.С помощью комментариев я обнаружил, что хранение данных как 1D vec в моей структуре намного более эффективно.Затем, чтобы удобно с этим справиться, я использую куски и по мере необходимости работаю с vec срезов внутри тел функций, используя данные.

1 Ответ

0 голосов
/ 29 января 2019

Если 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>> без перераспределения.Тем не менее, было отмечено, что он по-прежнему имеет неопределенное поведение и что проблема в основном не решаема

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...