【问题标题】:Constructing a vector of references from a 2d vector从二维向量构建引用向量
【发布时间】:2022-11-22 21:34:38
【问题描述】:

我正在尝试创建一个一维向量,其中包含对二维向量元素的引用。这是因为我后面想对网格的元素进行迭代排序,然后对数据进行一些操作。

到目前为止,我已经尝试过类似下面的东西

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 的行给出了&amp;Vec&lt;DataStruct&gt; 的数据类型,并且收集方法无法完成它的事情是可以理解的。

任何帮助将不胜感激,或者如果我只是错误地接近它。

【问题讨论】:

    标签: rust types reference


    【解决方案1】:

    Rust 不允许您存储对可变向量元素的引用。这样做的原因是向量可以增长,并且在内部它们的元素可能需要更改它们的内存位置。

    因此,您可能需要考虑另一种方法。有时存储向量索引可能是一种好方法(在您的情况下,由于您想要引用“2D 向量”,您可以存储像(usize, usize) 这样的元组)。另一种方法是使用 Box 结构(或另一个合适的 smart pointer type)作为 2D 向量中每个元素的“包装器”。

    【讨论】:

      【解决方案2】:

      一旦我清除了所有语法错误并使用 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}");
          }
      }
      

      但是在以这种方式借用时,您不能更改网格中的数据。即直到 cell_stack 被删除。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-12
        • 2017-03-24
        • 1970-01-01
        • 1970-01-01
        • 2014-06-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多