vec的常用方法
vec自身有很多方法,另外vec還可以調用所有Slice類型的方法。
下面是vec自身提供的一些常見的方法,更多方法和它們更詳細的用法,參考官方手冊:https://doc.rust-lang.org/std/vec/struct.Vec.html。
- len():返回vec的長度(元素數量)
- is_empty():vec是否為空
- push():在vec尾部插入元素
- pop():刪除並返回vec尾部的元素,vec為空則返回None
- insert():在指定索引處插入元素
- remove():刪除指定索引處的元素並返回被刪除的元素,索引越界將panic報錯退出
- clear():清空vec
- append():將另一個vec中的所有元素追加移入vec中,移動後另一個vec變為空vec
- truncate():將vec截斷到指定長度,多餘的元素被刪除
- retain():保留滿足條件的元素,即刪除不滿足條件的元素
- drain():刪除vec中指定範圍的元素,同時返回一個迭代該範圍所有元素的迭代器
- split_off():將vec從指定索引處切分成兩個vec,索引左邊(不包括索引位置處)的元素保留在原vec中,索引右邊(包括索引位置處)的元素在返回的vec中
這些方法的用法都非常簡單,下面舉一些示例來演示它們。
len()和is_empty():
#![allow(unused)] fn main() { let v = vec![11,22,33]; assert_eq!(v.len(), 3); assert!(!v.is_empty()); }
push()、pop()、insert()、remove()和clear():
#![allow(unused)] fn main() { let mut v = vec![11,22]; v.push(33); // [11,22,33] assert_eq!(v.pop(), Some(33)); assert_eq!(v.pop(), Some(22)); assert_eq!(v.pop(), Some(11)); assert_eq!(v.pop(), None); v.insert(0, 111); // [111] v.insert(1, 222); // [111,222] v.insert(2, 333); // [111,222,333] assert_eq!(v.remove(1), 222); v.clear(); // [] }
append():
#![allow(unused)] fn main() { let mut v = vec![11,22]; let mut vv = [33,44,55].to_vec(); v.append(&mut vv); println!("{:?}", v); // [11,22,33,44,55] println!("{:?}", vv); // [] }
truncate():截斷到指定長度,多餘的元素被刪除,如果目標長度大於當前長度,則不做任何事
#![allow(unused)] fn main() { let mut v = vec![11,22,33,44]; v.truncate(2); println!("{:?}", v); // [11, 22] v.truncate(5); // 不做任何事 }
retain():
#![allow(unused)] fn main() { let mut v = vec![11, 22, 33, 44]; v.retain(|x| *x > 20); println!("{:?}", v); // [22,33,44] }
drain():刪除指定範圍的元素,同時返回該範圍所有元素的迭代器。如果刪除迭代器,則丟棄迭代器中剩餘的元素
#![allow(unused)] fn main() { let mut v = vec![11, 22, 33, 44, 55]; let mut vv = v.clone(); // 刪除中間3個元素,同時獲取到這些元素的迭代器 // 直接丟棄迭代器,所以迭代器中的元素也直接被丟棄 // 這相當於直接刪除指定範圍的元素 v.drain(1..=3); println!("{:?}", v); // [11, 55] // 將迭代器中的元素轉換為Vec<i32> let a: Vec<i32> = vv.drain(1..=3).collect(); println!("{:?}", a); // [22, 33, 44] println!("{:?}", vv); // [11, 55] }
split_off():
#![allow(unused)] fn main() { let mut v = vec![11, 22, 33, 44, 55]; let vv = v.split_off(2); println!("{:?}", v); // [11, 22] println!("{:?}", vv); // [33, 44, 55] }