rust 初探 -- 常用的集合

rust 初探 – 常用的集合

Vector

存储在堆内存上的数据,运行时可以动态变大或者变小。
Vec 特性:

  • 由标准库提供,可以存储多个相同类型的值,并且值在内存中连续存放

Vector 的创建

fn main() {// Vec::new()let v: Vec<i32> = Vec::new();// 使用初始值创建,使用 vec! 宏let v1 = vec![1,2,3];
}

更新 Vector

fn main() {//这里不需要指明 vec 的类型,因为后面有 push 操作会自己推断出来let mut v = Vec::new();v.push(1);
}

删除 Vector

和其他的 struct 结构体一样,当 Vector 离开了作用域,就会被清理掉
如果涉及到引用会不一样。

读取 Vector 的元素

fn main() {let v = vec![1,2,3,4,5];let third = &v[2]; // 1. 使用索引,非法访问 panicprintln!("{}", third);match v.get(2) { // 2. get 方法,非法访问 返回 NoneSome(third) => println!("get {}", third),None => println!("not exist"),}
}
所有权和借用规则

不能在同一作用域里,对一个值不能同时有可变和不可变的引用

//vec 中内存中是连续的,新增的时候可能会重新分配,所以直接不让这样操作
fn main() {let mut v = vec![1,2,3,4,5];let third = &v[2]; //不可变的v.push(6); //mutable borrow occurs hereprintln!("{}", third);
}
遍历 Vector 的值
fn main() {let mut v = vec![1,2,3,4,5];for i in &mut v {*i += 50;}for i in v {println!("{}", i);}
}
使用 enum 来存储多种数据类型
  • enum 的变体可以附加不同类型的数据
  • enum 的变体定义在同一个 enum 类型下
enum Cell {Int(i32),Float(f64),Text(String),
}
// 因为类型不同,枚举的时候不好操作(很多个),需要使用到 trait 对象
fn main() {//编译时就知道堆上要多大的内存,而且知道所有的可能情况,编译时可以做检查let row = vec![Cell::Int(3),Cell::Float(10.1),Cell::Text(String::from("text")),];
}

字符串是什么

  • Rust 的核心语言层面,只有一个字符串类型:字符串切片 str(或&str)

  • 字符串切片:对存储在其他地方、UTF-8编码的字符串的引用

    • 字符串字面值:存储在二进制文件中,也是字符串切片
  • String 类型:

    • 来自标准库而不是核心语言
    • 可增长、可修改、可拥有

通常说的字符串是指?

String 和 &str

  • 特性:utf-8 编码

其他类型的字符串

  • OsString,OsStr,CString,Cstr
  • 还有一些其他第三方库

创建一个新的字符串

String::new()//用于创建一个空的字符串,是可变的
to_string()	//方法,可用于实现了 displag trait 的类型,包括字符串字面值
String::from() //函数,从字面值来创建字符串

更新 String

  • push_str() 方法:字符串切片
fn main() {let mut s1 = String::from("foo");s1.push_str("bar");//- push_str() 方法:字符串切片println!("{}", s1); // foobars1.push('b');//- push() 方法:单个字符println!("{}", s1); // foobarb
}
    • 操作符,拼接字符串
fn main() {let s1 = String::from("foo");let s2: String = String::from("bar");let s3 = s1 + &s2;//相当于 fn add(self, s: &str) -> String {}//&String 强制转换成 &str,解引用强制转换(deref coercion),会保留 s2 的所有权println!("{}", s3);// println!("{}", s1);//error[E0382]: borrow of moved value: `s1`// println!("{}", s2);
}
  • format!:不会取得任意参数的所有权
use std::fmt::format;fn main() {let s1 = String::from("foo");let s2: String = String::from("bar");let s3: String = String::from("car");// let s4 = s1 + "-" + &s2 + "-" + &s3;// println!("{}", s4); //foo-bar-carlet s5 = format!("{}-{}-{}", s1, s2, s3);println!("{}", s5);//foo-bar-car
}

内部表示

  • String 是对 Vex 的包装
 String::from("hola").len(); //4,返回字节数// unicode 标量值
字节,标量值,字形簇
fn main() {let w = "测试一下";for b in w.bytes() {//字节print!("{} ", b)//230 181 139 232 175 149 228 184 128 228 184 139 }for b in w.chars() {//标量值print!("{} ", b)// 测 试 一 下}
}
访问 String
  • 不支持按索引语法形式进行访问:
    • 不同语言的字符串,其对应的字节数不同
    • 索引操作应消耗一个常量时间(O(1)),而String 无法保证,需要遍历所有内容来确定有多少个合法的字符
切割 String
s = &hello[0..4]; //但是切割必须沿着字符的边界切割,否则会panic

HashMap<K, V>

  • 键值对的形式存储数据
  • 适合场景,通过 K (任何类型)来寻找数据,而不是通过索引

创建 HashMap

use std::collections::HashMap;fn main() {//创建 HashMaplet mut scores = HashMap::new();scores.insert(String::from("bob"), 99); //会基于此推断 k,v的类型// 不在 Prelude 中,所以需要添加 use //2. collect()let team = vec![String::from("a"), String::from("b")];let t_scores = vec![10,12];let hp: HashMap<_, _> = team.iter().zip(t_scores.iter()).collect();// 需要指明 HashMap<_, _>
}
  • 数据存储在 heap 上
  • 同构的:一个 HashMap 中,所有 k 必须是同一类型,所有 v 必须是同一类型

HashMap 和所有权

  • 对于实现了 Copy trait 的类型,值会被复制到 HashMap 中
  • 对于拥有所有权的值(如 String),值会被移动,所有权会被转移给 HashMap
  • 如果将值的引用插入到 HashMap,值本身不会移动 (被引用的值需要有效)
fn main() {let name = String::from("key");let value = String::from("value");//创建 HashMaplet mut scores = HashMap::new();// scores.insert(name, value);// print!("{}:{}", name, value); // value borrowed here after movescores.insert(&name, &value);println!("{}:{}", name, value);//key:value
}

访问 HashMap

  • get 方法,参数 K,返回 Option<&V>
use std::collections::HashMap;fn main() {//创建 HashMaplet mut scores = HashMap::new();scores.insert(String::from("bob"), 90);scores.insert(String::from("lili"), 100);let name = String::from("bob");let score = scores.get(&name);match score {Some(s) => println!("{}", s), // 90None => println!("team not exist"),};
} 

遍历 HashMap

use std::collections::HashMap;fn main() {//创建 HashMaplet mut scores = HashMap::new();scores.insert(String::from("bob"), 90);scores.insert(String::from("lili"), 100);for (k, v) in &scores {println!("{}-{}", k, v)//lili-100 bob-90}
}

更新 HashMap

  • HashMap 大小可变,每个 K 只能对应一个 V
  • 更新 HashMap 中的数据,已存在 K,或者不存在 K
use std::collections::HashMap;fn main() {//创建 HashMaplet mut scores = HashMap::new();scores.insert(String::from("bob"), 90);scores.insert(String::from("lili"), 100);//1. 替换现有的 v,插入两个相同k,不同 v,前者会被后者替换//2. 只在 K 不存在时,才插入 v//使用 entry 方法,结合 or_insert scores.entry(String::from("bob")).or_insert(80);scores.entry(String::from("bob2")).or_insert(80);println!("{:#?}", scores)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/51443.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mojo模型的自动调参:深度学习优化的新境界

Mojo模型的自动调参&#xff1a;深度学习优化的新境界 深度学习模型的参数调优是提高模型性能的关键步骤之一&#xff0c;但同时也是一个耗时且复杂的过程。Mojo模型作为一个先进的深度学习框架&#xff0c;其设计理念包含了自动化调参的概念&#xff0c;以简化模型训练流程并…

2024.7.29 作业

1> 写一个日志文件&#xff0c;将程序启动后&#xff0c;每一秒的时间写入到文件中 #include <myhead.h> int main(int argc,const char *argv[]) {FILE *fp NULL;if((fpfopen("./log.txt","r"))NULL) {perror("open error1");return…

解决 Git 访问 GitHub 时的 SSL 错误

引言 在使用 Git 进行版本控制时&#xff0c;我们可能会遇到各种网络相关的错误。其中一种常见的错误是 SSL 连接问题&#xff0c;这会导致 Git 无法访问远程仓库。本文将介绍一个具体的错误 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 0&#xff0c;以及如何通过禁用 SSL 证…

Python数值计算(1)

准备总结一下通过Python进行数值计算的环境&#xff0c;先说一下数值计算的基本语法和库。 1.基本运算 Python中提供基本运算符&#xff0c;常见的加减乘除&#xff0c;唯一需要注意的是除法&#xff0c;整数除法和浮点数除法不一样。 一般除法/&#xff0c;无论参与运算的数…

【嵌入式英语教程--3】C语言中的基本数据类型

C语言中的基本数据类型 英文原文 In the C programming language, basic data types form the building blocks of any program. These include int, float, char, and bool. The int type is used for integer values, float for floating-point numbers, char for single c…

相机拍摄如何正确曝光

不同场景下的曝光思路 数码时代&#xff0c;我们并不需要准确曝光&#xff0c;我们只需要用单张或者多张照片&#xff0c;记录下场景的全部亮度信息直方图可以辅助我们确认&#xff0c;是否完整记录下了场景的亮度信息正常光比环境&#xff0c;提倡“向右曝光”。大光比环境&a…

通信系统的均衡技术

1、摘要 在通信系统中&#xff0c;信号从发送端发出&#xff0c;经过信道&#xff0c;到达接收端&#xff0c;而在传输的过程中&#xff0c;信号会发生失真&#xff0c;产生失真的原因有很多&#xff0c;包括阻抗不匹配&#xff0c;干扰等。为了优化信号质量&#xff0c;需要进…

【PyTorch笔记】训练时显存一直增加到 out-of-memory?真相了!

最近用 Pytorch 训模型的过程中&#xff0c;发现总是训练几轮后&#xff0c;出现显存爆炸 out-of-memory 的问题&#xff0c;询问了 ChatGPT、查找了各种文档。。。 在此记录这次 debug 之旅&#xff0c;希望对有类似问题的小伙伴有一点点帮助。 问题描述&#xff1a; 训练过…

mysql的唯一索引和普通索引有什么区别

在MySQL中&#xff0c;唯一索引&#xff08;UNIQUE Index&#xff09;和普通索引&#xff08;普通索引&#xff0c;也称为非唯一索引&#xff09;有一些关键的区别。以下是它们的比较以及性能分析&#xff1a; 唯一索引与普通索引的区别 唯一性&#xff1a; 唯一索引&#xff…

也来聊一聊反复开关空调是否更费电

文章目录 为了制造噱头而刻意开展的毫无实际价值的实验空调制冷的基本原理空调主要耗电部件分析空调主要耗电阶段分析启动阶段&#xff1a;瞬时功率较高&#xff0c;但持续时间较短制冷运行阶段&#xff1a;压缩机持续运行&#xff0c;耗电量最大温度达到设定值后的阶段&#x…

深入探索非线性数据结构:树与图的世界

在数据结构的广阔天地中&#xff0c;非线性结构以其独特的逻辑关系和广泛的应用场景&#xff0c;成为计算机科学领域的重要组成部分。其中&#xff0c;树和图作为两种典型的非线性数据结构&#xff0c;不仅深刻影响了算法的设计与分析&#xff0c;也广泛应用于各种实际问题的解…

基于tkinter的学生信息管理系统之登录界面和主界面菜单设计

目录 一、tkinter的介绍 二、登陆界面的设计 1、登陆界面完整代码 2、部分代码讲解 3、登录的数据模型设计 4、效果展示 三、学生主界面菜单设计 1、学生主界面菜单设计完整代码 2、 部分代码讲解 3、效果展示 四、数据库的模型设计 欢迎大家进来学习和支持&#xff01…

灯具外贸公司用什么企业邮箱好

灯具外贸公司面对海外市场的推广、产品销售、客户沟通、市场信息收集等多重需求&#xff0c;选择一个合适的企业邮箱显得尤为重要。本文将介绍灯具外贸公司为什么应选择Zoho Mail企业邮箱&#xff0c;并详细探讨其优势和功能。 一、公司背景 广东省深圳市光明新区&#xff0c…

持久化存储:Mojo模型中模型保存与加载的艺术

持久化存储&#xff1a;Mojo模型中模型保存与加载的艺术 在机器学习项目中&#xff0c;模型的持久化存储是一个关键环节&#xff0c;它允许我们将训练好的模型保存下来&#xff0c;并在需要时重新加载使用。Mojo模型&#xff0c;作为一个虚构的高级机器学习框架&#xff0c;支…

Redis 安装和数据类型

Redis 安装和数据类型 一、Redis 1、Redis概念 redis 缓存中间件&#xff1a;缓存数据库 nginx web服务 php 转发动态请求 tomcat web页面&#xff0c;也可以转发动态请求 springboot 自带tomcat 数据库不支持高并发&#xff0c;一旦访问量激增&#xff0c;数据库很快就…

vTESTstudio中如何添加DLL文件?

文章目录 一、CANoe添加DLL二、vTESTstudio中添加DLL1.手动添加2.代码添加 一、CANoe添加DLL 在CANoe中添加DLL的路径如下图&#xff0c;在Simulation Setup中选择需要添加的节点&#xff0c;右键选择Configuration进行添加DLL。 二、vTESTstudio中添加DLL 1.手动添加 在打…

java中 VO DTO BO PO DAO

VO、DTO、BO、PO、DO、POJO 数据模型的理解和实际使用_vo dto bo-CSDN博客 深入理解Java Web开发中的PO、VO、DTO、DAO和BO概念_java dto dao-CSDN博客

【计算机网络】WireShark和简单http抓包实验

一&#xff1a;实验目的 1&#xff1a;熟悉WireShark的安装流程和界面操作流程。 2&#xff1a;学会简单http的抓取和过滤&#xff0c;并分析导出结果。 二&#xff1a;实验仪器设备及软件 硬件&#xff1a; Windows 2019操作系统的计算机等。 软件&#xff1a;WireShark、…

【算法/训练】:动态规划(线性DP)

一、路径类 1. 字母收集 思路&#xff1a; 1、预处理 对输入的字符矩阵我们按照要求将其转换为数字分数&#xff0c;由于只能往下和往右走&#xff0c;因此走到&#xff08;i&#xff0c;j&#xff09;的位置要就是从&#xff08;i - 1&#xff0c; j&#xff09;往下走&#…

vector清空

https://www.zhihu.com/question/592055868/answer/2967078686