为了便于开发者,rust 和其他语言一样(Java 有集合类、C++ STL等),提供常用的集合,譬如 动态数组和map,这篇文章就和大家一起捋一遍rust 里面常用的集合。
vec是最常用的动态数组。可以通过下面三种方式进行初始化。使用方式和Java 的ArrayList差不多。
let mut v = Vec::::new();
let mut v1 = vec![1,2,3];
let v2 : Vec = Vec::with_capacity(1000);
然后我们可以往vec 里面追加数据
v1.push(4);
v1.push(5);
或者指定插入到某个位置,注意下标2 后面的每个元素将会后移一位。
v1.insert(2, 100);
如果希望替换某个下标的值,和数组操作一样,可以直接通过下标操作
v1[3] = 99;
如果希望安全地获取某个下标的元素,可以通过get方法,它返回了一个Option,我们可以通过解析 Option 判断这个下标对应的数据是否存在,避免越界异常。
let r : Option<&i32> = v1.get(100);
每一个vec 都是数组长度和容量两个属性
println!("{} {}",v1.len(),v1.capacity());
VecDeque是一个双向队列。在它的头部或者尾部执行添加或者删除操作,基本操作和vec 差别不大。
fn main() {
let mut queue = VecDeque::with_capacity(6);
queue.push_back(9); //尾部添加
queue.push_front(1);//头部添加
println!("{:?}",queue.pop_front().unwrap()); //头部弹出
println!("{:?}",queue.pop_back().unwrap()); //尾部弹出
}
HashMap几乎每种语言都提供了支持,rust 当然也支持 HashMap。下面代码创建一个HashMap,其中key 是person ,value 是电话号码。
#[derive(Hash, Eq, PartialEq, Debug)]
struct Person {
first_name: String,
last_name: String,
}
impl Person {
fn new(first: &str, last: &str) -> Self {
Person {
first_name: first.to_string(),
last_name: last.to_string(),
}
}
}
fn main() {
let mut book = HashMap::new();
book.insert(Person::new("John", "Smith"), "521-8976");
book.insert(Person::new("Sandra", "Dee"), "521-9655");
book.insert(Person::new("Ted", "Baker"), "418-4165");
let p = Person::new("John", "Smith");
// 查找键对应的值
if let Some(phone) = book.get(&p) {
println!("Phone number found: {}", phone);
}
// 删除
book.remove(&p);
// 查询是否存在
println!("Find key: {}", book.contains_key(&p));
}
上面的代码比较取巧直接使用了Hash这个 derive ,当然,我们也可以手动实现一个hash方法。这个和Java 里面重写 hash 方法类似。
BTreeMap 是一个B 树,数据结构如下
rust BTreeMap的使用和上面的HashMap 差别不大,只不过不再实现hash方法,因为 BTreeMap是通过大小确定在树上的位置,所以,需要实现比较大小的能力。如下:
#[derive(Ord, PartialOrd, Eq, PartialEq, Debug)]
struct Person {
first_name: String,
last_name: String,
}
其他操作没啥区别。
页面更新:2024-02-29
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号