为特定大小创建一个零向量

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

在 C 语言中,它是这样的:

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

下面是我尝试用 Rust 编写的 helper 函数,但我认为分片语法 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()方法 给你和没有一个排列的 [0 ; size] 注释似乎工作

最后,我想把这个问题放到一个子串搜索算法中:

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

要初始化给定长度的零(或任何其他常量值)向量,可以使用 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>改为 let mut zero_vec: Vec<i32>)。

您还可以使用 iter::repeat函数,我认为这个函数“更加地道”(而且对我来说看起来更好) :

use std::iter;


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

这里还有另一种更简短的方法,它适用于 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)
}
}

你可以使用 调整大小

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