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]
}