• Rust学习——常见集合(Vec、String、HashMap)


    一、vector
    特点:一个挨着一个地存储一系列数量可变的值。
    只能存储相同类型的值。
    它在内存中彼此相邻地排列所有的值。

    常见场景:文件中的文本,购物车中商品的价格。

    vector是用泛型实现的。
    let v: Vec = Vec::new();

    let v = vec![1, 2, 3,];

    使用push方法更新值。
    释放vec时会丢弃其所有元素。

    如何读取vector元素值?

    1. 索引语法,即通过index访问,类似数组
    2. get方法,返回一个Option<&T>,所以通过match运算符去处理。

    第一种获取元素的方法需要注意越位,会引起程序崩溃。即panic。
    第二种则能很友好的在None的情况处理。

    由于在同一作用域下不能同时存在可变和不可变引用,所以在获取vector元素的不可变引用时尝试在vector末尾增加元素,则会抛出异常。

    在使用+=运算符之前必先用解引用运算符(*)获取i中的值。

    vector + 枚举可以在vector中存放不同类型的数据。

    二、字符串
    特点:字符的集合。String。

    let s = "initial contents".to_string();
    // equal to
    let s = String::from("initial contents");

    Rust中字符串使用的是UTF-8编码。

    如何更新字符串?
    1. push_str,该方法不会获取到入参的所有权
    2. push,该方法入参仅支持单个字符
    3. + 运算符,String只能和&str 相加。
    4. format! 宏,对于复杂的字符串处理,使用该方法最方便了,并且不会获取任何参数的所有权

    当把一个类型为String的字符串取引用,并与类型为String的字符串相加时,第一个类型会被Deref强制转换成&str。

    let s1 = String::from("tic");
    let s2 = String::from("tac");
    let s3 = String::from("toe");
    let s = format!("{}-{}-{}", s1, s2, s3);

    Rust字符串String本质上是一个Vec的封装。

    Rust中可以用三种方式可以理解字符串:

    1. 字节
    2. 标量值
    3. 字形簇(字母)

    遍历字符串的方法:
    1. .chars()
    2. .bytes()
    3. 获取字形簇可考虑crate.io上三方库

    三、hash map
    特点:允许将值与一个特定的键key关联,使用map数据结构。

    生成一个map的方式:
    use std::collections ::HashMap;
    let mut scores = HashMap::new();

    另一种方式:
    use std::collections ::HashMap;

    let teams = vec![String:: from("Blue"), String::from("Yellow")];
    let initial_scores = vec![10, 50];
    let scores: HashMap<_, _> = teams.iter().zip(initial_scores.iter()).collect();

    通过.get(key)方法可返回一个Option<&T>,所以通过match运算符去处理。

    类似于 vector,hash map 是同质的:所有的键必须是相同类型,值也必须都是相同类型

    hash map与所有权
    如果将值的引用插入哈希 map,这些值本身将不会被移动进哈希 map。但是这些引用指向的值必须至少在哈希 map 有效时也是有效的。

    更新hash map

    1. 覆盖:
      1. 再次插入相同的key,即覆盖
    2. 只在键无对应值时插入:
      1. 使用.entry(key).or_insert(value)方法
      2. 使用此方法可快速依据可迭代结构更新hash map,并获取具体的键值
    3. 在旧值基础上更新值:
      1. 将一个键值取出来后,使用*号解引用,然后进行赋值操作即可完成更新
    学习是一条令人时而喜极若狂、时而郁郁寡欢的道路。
  • 相关阅读:
    NoSuchMethodError 一般是jar包冲突了
    联通网络环境上无法访问http://repo1.maven.org/maven2/中央库解决,镜像库添加
    实现MySQL数据库的实时备份
    海外支付:遍布全球的Paypal
    .Net分布式缓存应用实例:Couchbase
    海外支付:抵御信用卡欺诈的CyberSource
    那些年,我们开发的接口之:QQ登录(OAuth2.0)
    ES6知识整理(一)--- let/const/箭头函数
    webpack 热更新(实施同步刷新)
    Vue状态管理vuex
  • 原文地址:https://www.cnblogs.com/tim100/p/15668205.html
Copyright © 2020-2023  润新知