rust 从二维向量构造参考向量

esbemjvw  于 2022-11-24  发布在  其他
关注(0)|答案(2)|浏览(157)

我试图创建一个一维向量,其中包含对二维向量元素的引用。这是因为我稍后要对网格元素进行迭代排序,然后对数据执行一些操作。
到目前为止,我已经尝试了如下所示的方法

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方法无法完成它的任务。
任何帮助都将不胜感激,或者如果我只是错误地接近它。

3j86kqsm

3j86kqsm1#

Rust不允许你存储对可变向量元素的引用。更具体地说,你 * 可以 * 创建一个对元素的引用,但是你不能修改持有该元素的向量,* 当 * 你拥有“活的”引用时。原因是向量可以增长,并且在内部它们的元素可能需要改变它们的内存位置。
因此,您可能需要考虑另一种方法。有时存储矢量索引可能是一种好方法(在您的情况下,由于您希望引用一个“2D矢量”,您可以存储一个元组,如(usize, usize))。另一种方法是使用Box结构体(或其他合适的smart pointer type)作为2D矢量中每个元素的“ Package 器”。

omhiaaxx

omhiaaxx2#

一旦我清除了所有的语法错误并使用iter而不是into_iter,这就像一个魔咒:

struct DataStruct {}
fn main() {
    let mut grid: Vec<Vec<DataStruct>> = vec![vec![DataStruct{}], vec![DataStruct{}, DataStruct{}]];

    let mut cell_stack: Vec<&DataStruct> = grid.iter().flatten().collect();

    for i in 0..cell_stack.len() {
        // some_func(cell_stack.pop());
        cell_stack.pop();
        println!("{i}");
    }
}

但是当grid以这种方式被借用时,你不能改变它中的数据,即直到cell_stack被删除。

相关问题