赞
踩
Vec,也称为vector。它允许我们在一个单独的数据结构中存储一系列相同类型的值,它们在内存中彼此相邻的排列所有的值。
不同点
相同点:
vector有两种初始化方法:使用Vec::new();函数或者使用Vec!宏
fn main() { //1:调用 Vec::new函数新建一个空的 vector 来储存 i32 类型的值 let mut v:Vec<i32> = Vec::new(); v.push(5); println!("{:?}",v); /* {} 需要被显示的类型实现 Display Trait {:?} 需要被显示的类型实现 Debug Trait */ //2: vec!宏使用初始值来创建一个 Vec let v = vec![1, 2, 3];// v 离开作用域并被丢弃, 然后新建一个vector名字也叫做v println!("{:?}", v) let v = vec![0;10]; println!("{:?}", v) //[0, 0, 0, 0, 0, 0, 0, 0, 0, 0] println!("{:?}", v[0]) //可以使用索引访问vector中的值 } // v 离开作用域并被丢弃
1、&v[index]返回一个引用, v.get(index)方法返回一个 Option<&T>。
fn main() {
let v = vec![1, 2, 3, 4, 5];
let third:&i32 = &v[2];
let gthird:Option<&i32> = v.get(2);
println!("{}, {:?}", third, gthird);
}
2、如果越界访问的话,&v[index]会panic,v.get(index)会返回None,所以如果要引用vector的元素,建议使用v.get(index)
fn main() {
let v = vec![1, 2, 3, 4, 5];
// let third:&i32 = &v[100]; //thread 'main' panicked at 'index out of bounds: the len is 5 but the index is 100'
let gthird:Option<&i32> = v.get(100);
println!("{:?}", gthird);
}
最好使用引用来循环遍历元素。引用获取值得使用权而不是控制权
fn main() { let mut v = vec![1, 2, 3, 4, 5]; for i in &mut v{ *i += 100; //为了修改可变引用所指向的值,在使用 += 运算符之前必须使用解引用运算符(*)获取 i 中的值 } for i in &v{ println!("{}", i) } let mut arr = [1, 2, 3]; for i in &mut arr{ *i += 100; } for i in &arr{ println!("{}", i) } }
如果不使用元素的引用来遍历元素。直接遍历的话,vector将会失去那一片内存的控制权
fn main() {
let v = vec![1, 2, 3, 4, 5];
for i in v{ //v将失去这块内存得所有权
println!("{}", i)
}
for i in v{ //error[E0382]: use of moved value: `v`
println!("{}", i)
}
}
enum SpreedsheetCell{
Int(i32),
Float(f64),
Text(String),
}
let row = vec![
SpreedsheetCell::Int(3),
SpreedsheetCell::Text(String::from("blue")),
SpreedsheetCell::Float(11.12),
];
参考:https://kaisery.gitbooks.io/rust-book-chinese/content/content/Vectors.html
https://kaisery.gitbooks.io/rust-book-chinese/content/content/Vectors.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。