【问题标题】:How can I return a subset of a Vec?如何返回 Vec 的子集?
【发布时间】:2015-11-30 19:00:13
【问题描述】:

我试图避免复制数据,因为该程序的内存使用必须保持在较低水平。

我看到您可以执行以下操作:

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

但我的数据源实际上是 &amp;Vec&lt;Vec&lt;bool&gt;&gt; 而不是 &amp;Vec&lt;&amp;Vec&lt;bool&gt;&gt;'a 本身不起作用。

【问题讨论】:

    标签: vector rust subset slice lifetime


    【解决方案1】:

    您的'a 完全放错了位置。

    生命周期总是与引用一起使用,所以如果你有一个&amp;Vec&lt;Vec&lt;bool&gt;&gt;,那么生命周期'a 就在&amp; 之后。你不需要也不应该撒&amp;nilly-willy,因为你拥有的东西(i32)和你引用的东西(&amp;i32)之间有非常明显的区别。

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

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

    【讨论】:

      猜你喜欢
      • 2018-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-28
      • 1970-01-01
      • 2018-11-23
      • 1970-01-01
      相关资源
      最近更新 更多