vec的基本使用
创建向量有几种方式:
Vec::new()创建空的vecVec::with_capacity()创建空的vec,并将其容量设置为指定的数量vec![]宏创建并初始化vec(中括号可以换为小括号或大括号)vec![v;n]创建并初始化vec,共n个元素,每个元素都初始化为v
fn main(){
let mut v1 = Vec::new();
// 追加元素时,将根据所追加的元素推导v1的数据类型Vec<i32>
v1.push(1); // push()向vec尾部追加元素
v1.push(2);
v1.push(3);
v1.push(4);
assert_eq!(v1, [1,2,3,4]) // vec可以直接和数组进行比较
// v2的类型推导为:Vec<i32>
let v2 = vec![1,2,3,4];
assert_eq!(v2, [1,2,3,4]);
let v3 = vec!(3;4); // 等价于vec![3,3,3,3]
assert_eq!(v3, [3,3,3,3]);
// 创建容量为10的空vec
let mut v4 = Vec::with_capacity(10);
v4.push(33);
}
访问和遍历vec
可以使用索引来访问vec中的元素。索引越界访问时,将在运行时panic报错。
索引是usize类型的值,因此不接受负数索引。
fn main(){
let v = vec![11,22,33,44];
let n: usize = 3;
println!("{},{}", v[0], v[n]);
// 越界,报错
// 运行错误而非编译错误,因为运行期间才知道vec长度
// println!("{}", v[9]);
}
如果不想要在越界访问vec时panic中断程序,可使用:
get()来获取指定索引处的元素引用或范围内元素的引用,如果索引越界,返回None。get_mut()来获取元素的可变引用或范围内元素的可变引用,如果索引越界,返回None。
这两个方法的返回值可能是所取元素的引用,也可能是None,此处不对None展开介绍,相关的细节要留到Option类型中介绍。这里只需要知道,当所调用函数的返回值可能是一个具体值,也可能是None时,需要对这两种可能的返回值进行处理。比较简单的一种处理方式是在该函数返回结果上使用unwrap()方法:当成功返回具体值时,unwrap()将返回该值,当返回None时, unwrap()将panic报错退出。
例如:
fn main(){
let v = [11,22,33,44];
// 取得index=3处元素,成功,于是unwrap()提取得到44
let n = v.get(3).unwrap();
println!("{}", n);
// 取得index=4处元素,失败,于是panic报错
// let nn = v.get(4).unwrap();
}
另外,Vec是可迭代的,可以直接使用for x in vec {}来遍历vec。
#![allow(unused)]
fn main() {
let v = vec![11,22,33,44];
for i in v {
println!("{}", i);
}
}