JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

rust从入门到放弃(十):集合

wys521 2024-12-27 16:47:42 精选教程 28 ℃ 0 评论


为了便于开发者,rust 和其他语言一样(Java 有集合类、C++ STL等),提供常用的集合,譬如 动态数组和map,这篇文章就和大家一起捋一遍rust 里面常用的集合。

Vec

vec是最常用的动态数组。可以通过下面三种方式进行初始化。使用方式和Java 的ArrayList差不多。

    let mut v = Vec::<i32>::new();
    let mut v1 = vec![1,2,3];
    let v2 : Vec<String> = 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

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

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

BTreeMap 是一个B 树,数据结构如下

rust BTreeMap的使用和上面的HashMap 差别不大,只不过不再实现hash方法,因为 BTreeMap是通过大小确定在树上的位置,所以,需要实现比较大小的能力。如下:

#[derive(Ord, PartialOrd, Eq, PartialEq, Debug)]
struct Person {
    first_name: String,
    last_name: String, 
}

其他操作没啥区别。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表