为特定大小创建零向量

ell*_*iel 53 rust

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

在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>.

  • 我将Rust更新为1.0并且`让mut shift = vec![0; pattern.len()];`现在直接工作......哎呀.在此之前我有一个'错误:期望`:`,找到`.` ../search.rs:17 zero_vec.push(0);`这没有任何意义. (4认同)
  • 我自己去过那儿.当我刚开始时,很难知道我是否正在使用语法错误,或者自上次更新或自我正在阅读的文档更新后语法刚刚更改.我很高兴我们现在有了测试版,并且对1.0非常感兴趣.顺便说一句,您使用`rustup.sh`来更新Rust吗?如果是这样,你可能想要获得最新版本的脚本,它将立即获取测试版,而不是黑夜. (3认同)
  • 但是,这就是为什么我最喜欢这种语言的原因-社区的支持很棒,对我的菜鸟问题不投反对票。:)是的,我卷曲了最新的`rustup.sh`。非常感谢!现在我只需要弄清楚对字符串元素的索引访问... (2认同)

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)

  • 这与@anders的最后一部分有什么不同? (2认同)

Doo*_*nob 9

你也可以使用这个iter::repeat函数,我认为这是"更惯用"(并且看起来对我来说更好):

use std::iter;

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

  • 使用vec宏被认为是更惯用的,它是专门添加的,因为人们不想这样做. (7认同)

小智 5

您可以使用调整大小

let mut v = Vec::new();
let l = 42;
v.resize(l, 0u32);
Run Code Online (Sandbox Code Playgroud)

  • `vec!` 使用 0 分配时效率更高,因为它使用 `RawVec::with_capacity_zeroed()`,而 `.resize()` 调用使用更复杂值生成器的 `.extend_with()`。对于其他值,都使用`.extend_with()`,所以好处大致相同。 (9认同)