我试图创建一个一维向量,其中包含对二维向量元素的引用。这是因为我稍后要对网格元素进行迭代排序,然后对数据执行一些操作。
到目前为止,我已经尝试了如下所示的方法
let mut grid: Vec<Vec<DataStruct>> = Vec::new();
// initialise the grid
let cell_stack: Vec<&DataStruct> = &field.into_iter.flatten.collect::<Vec<&DataStruct>();
for i in 0..cell_stack.len() {
// sort
// some_func(cell_stack.pop());
}
然而,这并不起作用,因为创建cell_stack
的行给出了&Vec<DataStruct>
的数据类型,可以理解collect方法无法完成它的任务。
任何帮助都将不胜感激,或者如果我只是错误地接近它。
2条答案
按热度按时间3j86kqsm1#
Rust不允许你存储对可变向量元素的引用。更具体地说,你 * 可以 * 创建一个对元素的引用,但是你不能修改持有该元素的向量,* 当 * 你拥有“活的”引用时。原因是向量可以增长,并且在内部它们的元素可能需要改变它们的内存位置。
因此,您可能需要考虑另一种方法。有时存储矢量索引可能是一种好方法(在您的情况下,由于您希望引用一个“2D矢量”,您可以存储一个元组,如
(usize, usize)
)。另一种方法是使用Box结构体(或其他合适的smart pointer type)作为2D矢量中每个元素的“ Package 器”。omhiaaxx2#
一旦我清除了所有的语法错误并使用
iter
而不是into_iter
,这就像一个魔咒:但是当
grid
以这种方式被借用时,你不能改变它中的数据,即直到cell_stack
被删除。