为特定大小创建零向量

时间:2015-04-09 04:50:35

标签: rust

我想初始化一个零的向量,其特定的大小是在运行时确定的。

在C中,它会像:

int main(void)
{
    uint size = get_uchar();
    int A[size][size];
    memset(A, 0, size*size*sizeof(int));
}

这是我在Rust中尝试编写的辅助函数,但我认为切片语法0..size冒犯了编译器。此外,它看起来比C版更冗长。有没有更惯用的方法呢?

fn zeros(size: u32) -> Vec<i32> {
    let mut zero_vec: Vec<i32> = Vec::with_capacity(size);
    for i in 0..size {
        zero_vec.push(0);
    }
    return zero_vec;
}

我发誓旧的文档用于解释from_elem()方法here并且[0 ; size] notation的所有排列似乎都无法正常工作

我想最终将其粘贴到子字符串搜索算法中:

pub fn kmp(text: &str, pattern: &str) -> i64 {
    let mut shifts = zeros(pattern.len()+1);
}

4 个答案:

答案 0 :(得分:47)

要初始化给定长度的零(或任何其他常量值)向量,可以使用vec!宏:

let len = 10;
let zero_vec = vec![0; len];

也就是说,只需几个语法修复后,您的功能对我有用:

fn zeros(size: u32) -> Vec<i32> {
    let mut zero_vec: Vec<i32> = Vec::with_capacity(size as usize);
    for i in 0..size {
        zero_vec.push(0);
    }
    return zero_vec;
}
Rust 1.0中不再存在

uint,需要将size转换为usize,并且需要匹配的向量类型(已更改let mut zero_vec: Vec<i64>到{{} 1}}。

答案 1 :(得分:13)

这是另一种方式,更短。它适用于Rust 1.0:

fn zeros(size: u32) -> Vec<i32> {
    vec![0; size as usize]
}

fn main() {
    let vec = zeros(10);
    for i in vec.iter() {
        println!("{}", i)
    }
}

答案 2 :(得分:7)

您还可以使用iter::repeat功能,我认为这是“更惯用”(并且对我来说看起来更好):

use std::iter;

fn zeros(size: usize) -> Vec<i32> {
    iter::repeat(0).take(size).collect()
}

答案 3 :(得分:2)

您可以使用resize

let mut v = Vec::new();
let l = 42;
v.resize(l, 0u32);