【问题标题】:Converting 2d fixed sized array to a slice将 2d 固定大小的数组转换为切片
【发布时间】:2016-08-05 04:27:17
【问题描述】:

对于一维数组,可以将固定大小的数组转换为切片,但对于二维数组,这是否可能以一种简单的方式实现?

fn foo(r: &[&[usize]]) { }
let r = [[0usize; 10]; 10];
foo(&r); //<== error expected type `&[&[usize]]` found type `&[[usize; 10]; 10]`

【问题讨论】:

    标签: rust


    【解决方案1】:

    没有简单的方法可以做到这一点(对于琐碎的一些定义)。问题是&amp;[&amp;[usize]] 是一个切片(如jagged array),而[[0usize; 10]; 10] 是一个二维数组。二维数组中的数据是连续的,一行从前一行的末尾开始,并且所有行的元素数量相同。在交错数组中,每一行可以有不同的长度,并且这个长度必须与每一行存储在一起(在 Rust 中,切片是一个长度和一个指针)。

    也就是说,你可以改变foo的定义(这是最好的选择,因为没有额外的分配):

    // a slice of T, where T can be used as &[usize]
    fn foo<T>(r: &[T])
        where T: AsRef<[usize]>
    {
        for line in r {
            println!("{:?}", line.as_ref());
        }
    }
    
    fn main() {
        let r = [[0usize; 10]; 10];
        foo(&r);
    }
    

    或创建一个临时的切片向量:

    fn foo(r: &[&[usize]]) {
        for line in r {
            println!("{:?}", line);
        }
    }
    
    fn main() {
        let r = [[0usize; 10]; 10];
        let x: Vec<&[usize]> = r.iter().map(|v| v.as_ref()).collect();
        foo(&x);
    }
    

    【讨论】:

      猜你喜欢
      • 2015-07-28
      • 1970-01-01
      • 2021-09-04
      • 2020-12-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-01
      • 2012-08-12
      • 1970-01-01
      相关资源
      最近更新 更多