我正在努力避免复制数据,因为此程序的内存使用必须保持较低。
我见过你可以这样做:
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
本身不起作用。
答案 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]]