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