rust笔记8 collections基础
vec基础
具体细节在代码中,注意引用的技巧,一般使用get()
获取元素,这样如果越过边界,返回的是None
。
fn main() {let v = vec![1, 2, 3, 4, 5];let x = v.get(2); //match x {Some(3) => println!("OK"),None => println!("No"),_ => println!("Nothing"),}for i in &v { // 使用引用的方式遍历,去掉&是基于值的,每个都要复制一遍println!("{}", i);}let mut v1 = vec![1, 2, 3, 4, 5];for i in &mut v1 {*i += 10; // 必须要解引用}for i in &v1 {println!("{}", i);}// 通过枚举绑定的形式,可以让一个vec存储多个类型的值,使用match的方式获取enum Cell {Int(i32),Float(f64),Text(String),}let mut rows: Vec<Cell> = Vec::new();rows.push(Cell::Int(10));rows.push(Cell::Float(1.35));rows.push(Cell::Text(String::from("hello world !")));for i in & rows {match i {Cell::Int(val) => println!("{}", val),Cell::Float(val) => println!("{}", val),Cell::Text(val) => println!("{}", val),}}
}
注意一个易错点,vec
当元素不够的时候,会重新申请内存,然后把之前的元素复制到新内存中;这样,如果之前有引用指向某个元素,那么会报错。错误代码实例:
fn main() {let mut v = vec![3; 3];let r = &v[0];v.push(1); // 重新申请内存,导致下一句报错println!("r = {}", r);
}
字符串类型
fn main() {// 初始化的几个方式let mut s0 = String::new();let data = "initial contents";let s1 = data.to_string();let s2 = "hello world !".to_string();let s3 = String::from("hello world !");// 拼接的方式let s4 = "hello".to_string();let s5 = String::from("world");let s6 = String::from("!");// +拼接只是针对&str而言的let s7 = s4 + " " + &s5 + " " + &s6; // 此时的s4已经无效了println!("s7 = {}", s7); let s4 = "hello".to_string(); // 重新定义s4let s8 = format!("{} {} {}", s4, s5, s6); // format拼接,都是有效的println!("s8 = {}", s8);
}
字符串不能基于下标遍历,因为不同字符的编码是不一样的,rust直接在语言层面就禁止了。遍历只能通过for
循环的形式进行,代码实例:
fn main() {let s = String::from("hello, 我来自中国,Indian नमस्त");for c in s.chars() { // 遍历每个实际的字符println!("{}", c);}for c in s.bytes() { // 遍历每个编码println!("{}", c);}
}
map类型
这里仅仅介绍HashMap
的结构,基于哈希算法的。先给出几个基本的操作:
use std::collections::HashMap;fn main() {// 新建let mut nums = HashMap::new();// 简单插入nums.insert(1, String::from("one"));nums.insert(2, String::from("two"));nums.insert(3, String::from("three"));nums.insert(4, String::from("four"));// 删除nums.remove(&4);// 基于引用的遍历for (k, v) in &mut nums {println!("key = {}, value = {}", k, v);}// 基于get获取元素let v = nums.get(&1); match v { // 必须使用这种方式获取对应的值Some(val) => println!("{}", val),None => println!("No key !"),}
}
注意HashMap所有权的问题,一旦一个元素insert进入容器,那么对应的所有权就归容器所有了
还有一个基于vec
的collect
方法的构造方式,在这里给出一个代码实例:
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();
试探性插入,如果元素存在则不插入,给出代码实例:
use std::collections::HashMap;let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);scores.entry(String::from("Yellow")).or_insert(50);
scores.entry(String::from("Blue")).or_insert(50);println!("{:?}", scores);
rust笔记8 collections基础相关推荐
- rust笔记2 OwnerShip基础概念
首先,要搞清楚栈内存和堆内存对应了那些类型.rust的整型.浮点型.bool型.字面字符串型和tuple型都是栈内存上的:如果使用=,那么这些数据会拷贝一份新的内容. 然后,要了解rust的变量作用域 ...
- 【Java 系列笔记】语法基础 + Spring + Spring MVC + SpringBoot + 数据结构
Java 强化笔记目录 Java 语言基础 Java 架构师体系课程 一些课程 前端笔记:前端学习笔记 Java 语言基础 回头补基础(此基础非小白)系列,学校教的其实真的就是一些皮毛而已,怕是连门都 ...
- Stream 流 【学习笔记】Java 基础
若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 写这篇博客旨在制作笔记,方便个人在线阅览,巩固知识,无其他用途. 学习视频 [黑马 Java 基础教程] ...
- 《Java并发编程实践》学习笔记之一:基础知识
<Java并发编程实践>学习笔记之一:基础知识 1.程序与进程 1.1 程序与进程的概念 (1)程序:一组有序的静态指令,是一种静态概念: (2)进程:是一种活动,它是由一个动作序列组成 ...
- [Java入门笔记] 面向对象编程基础(二):方法详解
2019独角兽企业重金招聘Python工程师标准>>> 什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能 ...
- Python 数据分析与展示笔记1 -- Numpy 基础
Python 数据分析与展示笔记1 – NumPy 基础 Python 数据分析与展示系列笔记是笔者学习.实践Python 数据分析与展示的相关笔记 课程链接: Python 数据分析与展示 参考文档 ...
- MySQL 笔记2 -- MySQL 基础
MySQL 笔记2 – MySQL 基础 MySQL 系列笔记是笔者学习.实践MySQL数据库的笔记 课程链接: MySQL 数据库基础入门教程 参考文档: MySQL 官方文档 一.MySQL 简介 ...
- Maven-学习笔记06【基础-Maven工程servlet实例】
Java后端 学习路线 笔记汇总表[黑马程序员] 黑马程序员(腾讯微云)Maven基础讲义.pdf Maven-学习笔记01[基础-Maven基本概念] Maven-学习笔记02[基础-Maven的安 ...
- Maven-学习笔记05【基础-使用骨架创建Maven的Java工程】
Java后端 学习路线 笔记汇总表[黑马程序员] 黑马程序员(腾讯微云)Maven基础讲义.pdf Maven-学习笔记01[基础-Maven基本概念] Maven-学习笔记02[基础-Maven的安 ...
最新文章
- Java中的对象和包
- Rstudio 实现 爬虫 文本分词 个性化词云设计--我爱中国我爱党
- Java中的I/O模型总结(八股文自述)
- python补课费用_学习python阶段小总结
- 线上Java应用排查和诊断规范
- 关于WCF中间层服务器端DTO属性更新如何同步回仓储实体的处理方式
- php总是报错,php - 简单工厂模式中的问题,总是报错
- PUSHAD和POPAD,以及PUSHA和POPA
- Java字符串找出4个字节长度的字符
- asp Upload
- 我点击一个单选框时另外一个单选框里的内容属性隐藏掉_一个交通工程专业硕士研究生的总结与独白(二):交通生成预测及TransCAD操作...
- Linux中的提权操作
- EasyUI remote ajax方式提交验证
- AdaBoost(1)
- paip.python错误解决15
- LS-DYNA基础理论
- gmail谷歌邮箱开启SMTP
- hdu 4125 Moles
- [转帖]国之魂,民之魂(硬骨头六连16勇士的最后一张照片)
- c语言输入任意长度字符串,读取不定长字符串输入
热门文章
- hexo搭建个人博客_hexo 搭建个人博客
- python——pandas库之Series数据结构基础
- nlp-tutorial代码注释3-2,LSTM简介
- 第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛——A题 切蛋糕
- ~~试除法求所有约数(附模板题)
- Gitee搭建自己的图床
- 使用window.performance对应用性能监测
- 微信小程序开发——小程序分享转发
- python包管理(pip, 源码)
- 关于scanf 与 cin gets(),getline()......输入输出字符串的区别