【问题标题】:How does one operate over a subset of a vector?如何对向量的子集进行操作?
【发布时间】:2017-03-18 23:28:35
【问题描述】:

我了解如何对整个向量进行操作,尽管我不认为这是惯用的 Rust:

fn median(v: &Vec<u32>) -> f32 {
    let count = v.len();
    if count % 2 == 1 {
        v[count / 2] as f32
    } else {
        (v[count / 2] as f32 + v[count / 2 - 1] as f32) / 2.0
    }
}

fn main() {
    let mut v1 = vec![3, 7, 8, 5, 12, 14, 21, 13, 18];
    v1.sort();
    println!("{:.*}", 1, median(&v1));
}

但是如果我只想对这个向量的一半进行操作呢?例如,第一个四分位数是下半部分的中位数,第三个四分位数是上半部分的中位数。我的第一个想法是构建两个新向量,但这似乎不太正确。

如何获得“一半”向量?

【问题讨论】:

  • 关于如何传递迭代器请查看here。对于您的第一个问题,您可以分一杯羹,例如let slice = &amp;v1[0..v1.len()/2]
  • One question per question, please。由于您的“接受迭代器”问题已经有重复,我刚刚删除了它。

标签: rust


【解决方案1】:

如何求向量的中位数:

fn median(numbers: &mut Vec<i32>) -> i32 {
    numbers.sort();
    let mid = numbers.len() / 2;

    if numbers.len() % 2 == 0 {
        mean(&vec![numbers[mid - 1], numbers[mid]]) as i32
    } else {
        numbers[mid]
    }

}

如何获得half一个向量:

  • 使用切片:
let slice: &[i32] = &numbers[0..numbers.len() / 2];
  • 创建一个排水迭代器
let half: Vec<i32> = numbers.drain(..numbers.len()/2).collect()

【讨论】:

    【解决方案2】:

    如前所述,您想使用Index traitRange 创建slice

    let slice = &v1[0..v1.len() / 2];
    

    这是why it is discouraged to accept a &amp;Vec 的另一个原因。当前代码需要将切片转换为分配的Vec。相反,重写它以接受切片:

    fn median(v: &[u32]) -> f32 {
        // ...
    }
    

    由于您可能有兴趣将矢量/切片分成两半并获取两部分,split_at 可能是相关的:

    let (head, tail) = v1.split_at(v1.len() / 2);
    println!("{:.*}", 1, median(head));
    println!("{:.*}", 1, median(tail));
    

    【讨论】:

      猜你喜欢
      • 2011-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多