我如何 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]]
我尽量避免复制数据,因为必须将此程序的内存使用保持在较低水平。
我看到你可以这样做:
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]]