为特定大小创建一个零向量
Creating a vector of zeros for a specific size
我想初始化一个由运行时确定的特定大小的零向量。
在 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 and none of the permutations of the [0 ; size]
notation 似乎有效
我想最终将其加入子串搜索算法:
pub fn kmp(text: &str, pattern: &str) -> i64 {
let mut shifts = zeros(pattern.len()+1);
}
要初始化给定长度的零向量(或任何其他常量值),您可以使用 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;
}
uint
在 Rust 1.0 中不再存在,size
需要转换为 usize
,并且向量的类型需要匹配(更改为 let mut zero_vec: Vec<i64>
let mut zero_vec: Vec<i32>
.
您还可以使用 iter::repeat
函数,我认为它是 "more idiomatic"(对我来说看起来更好):
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)
}
}
您可以使用resize
let mut v = Vec::new();
let l = 42;
v.resize(l, 0u32);
我想初始化一个由运行时确定的特定大小的零向量。
在 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 and none of the permutations of the [0 ; size]
notation 似乎有效
我想最终将其加入子串搜索算法:
pub fn kmp(text: &str, pattern: &str) -> i64 {
let mut shifts = zeros(pattern.len()+1);
}
要初始化给定长度的零向量(或任何其他常量值),您可以使用 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;
}
uint
在 Rust 1.0 中不再存在,size
需要转换为 usize
,并且向量的类型需要匹配(更改为 let mut zero_vec: Vec<i64>
let mut zero_vec: Vec<i32>
.
您还可以使用 iter::repeat
函数,我认为它是 "more idiomatic"(对我来说看起来更好):
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)
}
}
您可以使用resize
let mut v = Vec::new();
let l = 42;
v.resize(l, 0u32);