Vectors

欢马劈雪     最近更新时间:2020-08-04 05:37:59

171

vectors.md
commit 5b9dd6a016adb5ed67e150643fb7e21dcc916845

“Vector”是一个动态或“可增长”的数组,被实现为标准库类型Vec<T>(其中<T>是一个[泛型](Generics 泛型.md)语句)。vector总是在堆上分配数据。vector与切片就像String&str一样。你可以使用vec!宏来创建它:

let v = vec![1, 2, 3, 4, 5]; // v: Vec<i32>

(与我们之前使用println!宏时不一样,我们在vec!中使用中括号[]。为了方便,Rust 允许你使用上述各种情况。)

对于重复初始值有另一种形式的vec!

let v = vec![0; 10]; // ten zeroes

访问元素

为了vector特定索引的值,我们使用[]

let v = vec![1, 2, 3, 4, 5];

println!("The third element of v is {}", v[2]);

索引从0开始,所以第3个元素是v[2]

另外值得注意的是你必须用usize类型的值来索引:

let v = vec![1, 2, 3, 4, 5];

let i: usize = 0;
let j: i32 = 0;

// works
v[i];

// doesn’t
v[j];

用非usize类型索引的话会给出类似如下的错误:

error: the trait `core::ops::Index<i32>` is not implemented for the type
`collections::vec::Vec<_>` [E0277]
v[j];
^~~~
note: the type `collections::vec::Vec<_>` cannot be indexed by `i32`
error: aborting due to previous error

信息中有很多标点符号,不过核心意思是:你不能用i32来索引。

越界访问(Out-of-bounds Access)

如果你尝试访问并不存在的索引:

let v = vec![1, 2, 3];
println!("Item 7 is {}", v[7]);

那么当前的线程会 [panic](Concurrency 并发.md#恐慌(panics))并输出如下信息:

thread '<main>' panicked at 'index out of bounds: the len is 3 but the index is 7'

如果你想处理越界错误而不是 panic,你可以使用像getget_mut这样的方法,他们当给出一个无效的索引时返回None

let v = vec![1, 2, 3];
match v.get(7) {
    Some(x) => println!("Item 7 is {}", x),
    None => println!("Sorry, this vector is too short.")
}

迭代

展开阅读全文