Rust Vec 初始化方法
Vec(動態(tài)數(shù)組)是 Rust 中最常用的集合類型。以下是各種初始化方法:
基本初始化
// 創(chuàng)建空 Vec
let mut vec1: Vec<i32> = Vec::new();
let mut vec2 = Vec::<i32>::new();
// 使用 vec! 宏
let vec3 = vec![1, 2, 3, 4, 5];
let vec4 = vec![0; 5]; // [0, 0, 0, 0, 0]
指定容量
// 預分配容量,避免重復分配
let mut vec5 = Vec::with_capacity(10);
// 檢查容量和長度
println!("容量: {}, 長度: {}", vec5.capacity(), vec5.len());
從其他集合創(chuàng)建
// 從數(shù)組
let arr = [1, 2, 3, 4];
let vec6 = arr.to_vec();
let vec7 = Vec::from(arr);
// 從切片
let slice = &[1, 2, 3];
let vec8 = slice.to_vec();
// 從迭代器
let vec9: Vec<i32> = (1..=5).collect();
let vec10 = vec![1, 2, 3].into_iter().map(|x| x * 2).collect::<Vec<i32>>();
特殊初始化
// 使用默認值填充
let vec11 = vec![String::new(); 3]; // 3個空字符串
// 使用閉包初始化
let vec12: Vec<i32> = (0..5).map(|i| i * i).collect();
// 復制現(xiàn)有 Vec
let original = vec![1, 2, 3];
let vec13 = original.clone();
不同數(shù)據(jù)類型
// 字符串 Vec
let strings = vec!["hello", "world"];
let owned_strings = vec![String::from("hello"), String::from("world")];
// 元組 Vec
let tuples = vec![(1, "a"), (2, "b"), (3, "c")];
// 結(jié)構(gòu)體 Vec
#[derive(Clone)]
struct Person { name: String, age: u32 }
let people = vec![
Person { name: "Alice".to_string(), age: 30 },
Person { name: "Bob".to_string(), age: 25 },
];
性能提示
- 使用
with_capacity()預分配已知大小 -
vec!宏在編譯時優(yōu)化 -
collect()適用于函數(shù)式編程風格
1. Vec 基礎(chǔ)
Vec<T> 是 Rust 標準庫中最常用的可增長數(shù)組類型,存儲在堆上,元素類型為 T。
let mut v: Vec<i32> = Vec::new(); // 創(chuàng)建空 Vec
let v2 = vec![1, 2, 3]; // 使用宏創(chuàng)建
2. 常用操作
添加元素
let mut v = Vec::new();
v.push(10);
v.push(20);
訪問元素
let v = vec![1, 2, 3];
println!("{}", v[0]); // 直接索引(可能 panic)
println!("{:?}", v.get(1)); // get 方法,返回 Option<&T>
遍歷
let v = vec![1, 2, 3];
for x in &v {
println!("{}", x); // 不可變借用
}
for x in &mut v {
*x += 1; // 可變借用
}
for x in v {
println!("{}", x); // 獲取所有權(quán),v 被消費
}
3. 其他常用方法
let mut v = vec![1, 2, 3];
v.pop(); // 移除并返回最后一個元素
v.insert(1, 99); // 在指定位置插入
v.remove(0); // 移除指定位置元素
v.clear(); // 清空所有元素
v.len(); // 獲取長度
v.is_empty(); // 是否為空
v.contains(&99); // 是否包含某值
4. 批量操作
let v = vec![1, 2, 3];
let v2: Vec<_> = v.iter().map(|x| x * 2).collect(); // 映射
let v3: Vec<_> = v.iter().filter(|&&x| x > 1).collect(); // 過濾
5. 與切片的關(guān)系
let v = vec![1, 2, 3];
let slice: &[i32] = &v[1..]; // Vec 可以轉(zhuǎn)換為切片
6. 性能和容量
let mut v = Vec::with_capacity(100); // 預分配容量
v.reserve(50); // 追加預留
v.shrink_to_fit(); // 縮減容量
7. 多類型 Vec
enum Value { Int(i32), Text(String) }
let v: Vec<Value> = vec![Value::Int(1), Value::Text("hi".to_string())];
8. 常見錯誤
- 越界訪問會 panic
- 獲取所有權(quán)后原 Vec 不能再用
9. 實用場景
- 動態(tài)收集數(shù)據(jù)
- 批量處理
- 作為函數(shù)參數(shù)或返回值
總結(jié)
Vec 是 Rust 最常用的動態(tài)數(shù)組類型,支持高效的插入、刪除、遍歷和批量操作,適合絕大多數(shù)需要動態(tài)存儲數(shù)據(jù)的場景。