У меня есть структура, содержащая двумерную сетку, представленную одним Vec<u8>
, потому что wasm_bindgen
не поддерживает <Vec<Vec<T>>
. Например, сетка:
0 1
2 3
хранится как Vec<u8>
с элементами [0, 1, 2, 3]
( порядок старших строк ).
Я хочу быть возможность изменить ширину сетки; если новая ширина меньше, сетка должна удалять столбцы справа, если новая ширина больше, сетка должна заполнять новые столбцы нулями. Элементы могут быть добавлены или удалены в нескольких местах в Vec
.
Чтобы установить ширину сетки, я разбиваю на Vec
, превращая куски в векторы, изменяя размеры векторов и выравнивая векторы .
struct Matrix {
grid: Vec<u8>,
width: usize,
height: usize,
}
impl Matrix {
pub fn set_width(&mut self, new_width: usize) {
self.grid = self
.grid
.chunks_exact(self.width)
.flat_map(|chunk| {
let mut chunk_vec = chunk.to_vec();
chunk_vec.resize(new_width, 0);
chunk_vec
})
.collect();
self.width = new_width;
}
}
Есть ли более эффективный способ сделать это? Я думаю, что блоки, вероятно, выделяют много памяти для больших размеров сетки, поскольку все они превращаются в Vec
с.
Установка высоты намного проще, так как Vec
потребуется только быть расширенным или усеченным:
pub fn set_height(&mut self, new_height: usize) {
self.grid.resize(self.width * new_height, 0);
self.height = new_height;
}