我想初始化一个零的向量,其具有在运行时确定的特定大小.
在C中,它会像:
int main(void)
{
uint size = get_uchar();
int A[size][size];
memset(A, 0, size*size*sizeof(int));
}
Run Code Online (Sandbox Code Playgroud)
这是我在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;
}
Run Code Online (Sandbox Code Playgroud)
我发誓,旧的文档用于解释这里的from_elem()方法,并且[0 ; size] 符号的排列似乎都不起作用
我想最终将其粘贴到子串搜索算法中:
pub fn kmp(text: &str, pattern: &str) -> i64 {
let mut shifts = zeros(pattern.len()+1);
}
Run Code Online (Sandbox Code Playgroud)
and*_*man 59
要初始化给定长度的零(或任何其他常量值)向量,可以使用vec!宏:
let len = 10;
let zero_vec = vec![0; len];
Run Code Online (Sandbox Code Playgroud)
也就是说,经过几个语法修复后,您的功能对我有用:
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;
}
Run Code Online (Sandbox Code Playgroud)
uintRust 1.0中不再存在,size需要进行强制转换usize,并且需要匹配的向量类型(更改let mut zero_vec: Vec<i64>为let mut zero_vec: Vec<i32>.
VRa*_*age 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)
}
}
Run Code Online (Sandbox Code Playgroud)
你也可以使用这个iter::repeat函数,我认为这是"更惯用"(并且看起来对我来说更好):
use std::iter;
fn zeros(size: usize) -> Vec<i32> {
iter::repeat(0).take(size).collect()
}
Run Code Online (Sandbox Code Playgroud)
小智 5
您可以使用调整大小
let mut v = Vec::new();
let l = 42;
v.resize(l, 0u32);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
25361 次 |
| 最近记录: |