侧边栏壁纸
博主头像
喵记博主等级

行动起来,活在当下

  • 累计撰写 18 篇文章
  • 累计创建 4 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Rust(十):Vector和HashMap

张秋平
2024-02-15 / 0 评论 / 0 点赞 / 31 阅读 / 3800 字

Rust中的Vector和HashMap

Vector

  • vector 定义在堆上,可以动态修改大小

  • vector使用一段连续的内存空间,且vector中只能存放相同类型的元素

  • vector的定义有两种方式,一种是通过Vec::new() 来创建,一种是通过vec![]宏来创建

vector 的定义

fn main() {
    let mut v1:Vec<i32> = vec![1, 2, 3];
    let mut v2: Vec<i32> = Vec::new();

    v2.push(4);
    v2.push(5);
    v2.push(6);

    v1.pop();

    println!("v1: {:?}", v1);
    println!("v2: {:?}", v2);
}

/* 输出:
v1: [1, 2]
v2: [4, 5, 6]
*/

常用函数

  1. push() / append() :向vector末尾添加一个元素

  2. pop() 移除末尾的一个元素

  3. [index] 获取指定索引位置index上的元素,如果索引越界则引发panic异常

  4. get() 也是获取指定索引位置上的元素,但返回值是一个Option类型

HashMap

HashMap的定义

  • HashMap是同构的,即所有的key必须是同一种类型,所有的value也必须是同一种类型

  • HashMap的值也存放在堆上

use std::collections::HashMap;

fn main() {
    let mut m: HashMap<i32, i32> = HashMap::new();
    m.insert(1, 123);
    m.insert(2, 456);

    for (k, v) in &m {
        println!("{}: {}", k, v);
    }
}

/* 输出:
2: 456
1: 123
*/

HashMap中的常用函数

  1. insert() :向hashmap中插入一个键值对,如果要插入的key已经存在,则更新它的value

use std::collections::HashMap;

fn main() {
    let mut m: HashMap<String, i32> = HashMap::new();
    m.insert(String::from("a"), 1);
    m.insert(String::from("b"), 2);
    m.insert(String::from("c"), 3);

    // 使用 insert 函数时, 如果要插入的 key 已经存在, 则会覆盖原来的 value
    m.insert(String::from("a"), 4);
    println!("{:?}", m);
}

/* 输出:
{"b": 2, "a": 4, "c": 3}
*/
  1. get() :获取指定的key对应的vlaue,该函数的返回值是一个Option类型

use std::collections::HashMap;

fn main() {
    let mut m: HashMap<String, i32> = HashMap::new();
    m.insert(String::from("a"), 1);
    m.insert(String::from("b"), 2);
    m.insert(String::from("c"), 3);
    m.insert(String::from("d"), 4);

    let a = m.get(&String::from("a"));
    match a {
        None => {
            println!("No such key");
        }
        Some(v) => {
            println!("Value is {}", v);
        }
    }
}

/* 输出:
Value is 1
*/
  1. entry() :检查指定的key是否已经存在,返回值为类型为enum Entry ,结合or_insert() 函数可实现:插入时先判断要插入的key是否已经存在,如果不存在则插入,如果已经存在则忽略

  • entry()的or_insert() 函数的返回值有两种情况:1. 如果key已经存在,返回一个到该key对应的value的一个可变引用;2:如果key不存在,则将该key和value插入到hashmap中,然后再返回一个到该value值的一个可变引用

use std::collections::HashMap;

fn main() {
    let mut m: HashMap<String, i32> = HashMap::new();
    m.insert(String::from("a"), 1);
    m.insert(String::from("b"), 2);
    m.insert(String::from("c"), 3);

    // 判断要插入的 key 是否存在, 如果不存在则插入, 存在则忽略
    m.entry(String::from("d")).or_insert(4);
    m.entry(String::from("a")).or_insert(5);

    // entry函数的or_insert函数的返回值
    let e = m.entry(String::from("e")).or_insert(6);
    // 通过解引用将 e 对应的值从 6 改为 100
    *e = 100;

    println!("{:?}", m);
}

/* 输出:
{"a": 1, "d": 4, "e": 100, "c": 3, "b": 2}
*/

0

评论区