我如何 return Vec 的子集?

How can I return a subset of a Vec?

我尽量避免复制数据,因为必须将此程序的内存使用保持在较低水平。

我看到你可以这样做:

fn subset<'a>(csv: &Vec<&'a Vec<bool>>, indices: &Vec<usize>) -> Vec<&'a Vec<bool>> {
    indices.iter().map(|&i| &csv[i]).collect();
}

但我的数据源实际上是 &Vec<Vec<bool>> 而不是 &Vec<&Vec<bool>> 并且 'a 本身不起作用。

您的 'a 完全放错了地方。

生命周期总是与引用结合使用,因此如果您有 &Vec<Vec<bool>>,那么生命周期 'a 紧跟在 & 之后。你不需要,也不应该随意地&,因为你拥有的东西(i32)和你引用的东西(&i32)之间有非常明显的区别。

因此,您函数的正确版本是:

fn subset<'a>(csv: &'a Vec<Vec<bool>>, indices: &Vec<usize>) -> Vec<&'a Vec<bool>> {
    indices.iter().map(|&i|&csv[i]).collect()
}

注:我去掉了collect后面的分号,因为你想要return那个表达式的值。

我们可以使用这个函数:

fn main() {
    let vec = vec!(
        vec!(false, false, false),
        vec!(false, false, true ),
        vec!(false, true , true ),
        vec!(false, true , false),
        vec!(true , true , false),
        vec!(true , true , true ),
        vec!(true , false, true ),
        vec!(true , false, false)
    );

    let indices = vec!(1, 3, 5, 7);

    let sub = subset(&vec, &indices);

    println!("{:?}", sub);
}

哪个produces:

[[false, false, true], [false, true, false], [true, true, true], [true, false, false]]