如何返回Vec的子集?

时间:2015-09-04 14:57:29

标签: vector rust subset slice lifetime

我正在努力避免复制数据,因为此程序的内存使用必须保持较低。

我见过你可以这样做:

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本身不起作用。

1 个答案:

答案 0 :(得分:2)

您的'a只是放错地方了。

生命周期始终与引用结合使用,因此如果您有&Vec<Vec<bool>>,那么生命周期'a就会出现在&之后。由于您拥有的内容(&)与您引用的内容(i32)之间存在非常明显的差异,因此您不需要也不应该使用&i32 nilly-willy。

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

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

注意:我在collect之后删除了分号,因为您想要返回该表达式的值。

我们可以使用这个功能:

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]]