如何反向填充向量?

时间:2019-06-27 08:27:15

标签: vector rust indexoutofboundsexception populate

我有一个向量:

let v = Vec<T>::with_capacity(10);

我想用相反的顺序填充数据:

let i = 10;
while i > 0 {
    i -= 1;
    v[i] = non_pure_function(i);
}

不幸的是,这种恐慌;当使用Vec::with_capacity进行分配时,向量的实际初始长度仍为0

我怎样才能最好地做到这一点?如果我没有T的构造函数怎么办?

1 个答案:

答案 0 :(得分:1)

  

如何反向填充向量?

您可以使用VecDeque来做到这一点:

use std::collections::VecDeque;

fn main() {
    let mut v = VecDeque::new();

    for i in 0..5 {
        v.push_front(i);
    }

    for item in v {
        print!("{}", item);
    }
}

Playground


代替使用VecDeque,可以使用数组和迭代器解决此问题:

  • 声明一个包含选项类型的数组。
  • 使用索引设置数组单元格。
  • 遍历数组。
  • 过滤数组以消除None
  • 映射未包装的值
  • 将它们收集到向量中。
fn main() {
    let mut v = [None; 10];
    let mut i = 5i32;

    while i > 0 {
        i -= 1;
        v[i as usize] = Some(4i32 - i);
    }

    let reverse_populated: Vec<i32> = v
        .iter()
        .filter(|x| x.is_some())
        .map(|x| x.unwrap())
        .collect();

    for item in reverse_populated {
        print!("{:?}", item);
    }
}

Playground


  

两个输出均为:43210