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


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

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

Vec

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

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从入门到放弃(十):集合

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

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

其他操作没啥区别。

展开阅读全文

页面更新:2024-02-29

标签:下标   尾部   数组   标的   头部   差别   入门   元素   大小   位置   常用   语言   操作   代码   方式   方法   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top