如何在Rust中改变向量长度?

9

笔者注:此问题早于Rust 1.0,语法和方法已经发生了变化。有些答案适用于Rust 1.0。

我有一个函数,希望能够直接修改一个向量的值。

fn f(v: &mut Vec<int>) {
    v = Vec::from_elem(10 as uint, 0i);
}

fn main() {
    let mut v: Vec<int> = Vec::new();
    f(&mut v);
}

但是代码无法编译。具体来说,我想将v的大小调整为包含10个零值元素。我做错了什么?


1
如果您想要覆盖,您需要取消引用 v,因为它是一个指针。*v = Vec::from_elem(10 as uint, 0i); - huon
2
注意:10u10 as uint的简写,但实际上,由于10是无类型的,编译器会推断它应该是一个uint并且“做正确的事情”。同样,由于Vec被推断为Vec<int>,因此只需要0而不是0i就足够了。 - Matthieu M.
2个回答

13

使用clearresize方法。(自Rust 1.0和1.5起,这似乎是正确的答案。)

fn f(v: &mut Vec<u32>) {
    // Remove all values in the vector
    v.clear();

    // Fill the vector with 10 zeros
    v.resize(10, 0);
}

fn main() {
    let mut v: Vec<u32> = Vec::new();
    f(&mut v);
    assert!(v == [0,0,0,0,0,0,0,0,0,0]);
}

3
您正在寻找grow方法。注意:此答案早于Rust 1.0,可能不再准确。其他答案仍包含有价值的信息。
let mut vec = vec![1i,2,3];
vec.grow(4, &10);
println!("{}", vec);

或者使用growclear的组合。
您可以在此处浏览文档:http://static.rust-lang.org/doc/master/std/vec/struct.Vec.html

1
谢谢!我在搜索页面中寻找“resize”,“length”和“capacity”,并浏览函数,但没有发现有用的信息。我从来没想到它会被称为“grow”! - Jim Garrison

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接