建旅游网站的意义阿里云免费域名

当前位置: 首页 > news >正文

建旅游网站的意义,阿里云免费域名,网站的术语,一个域名多个网站8.5.0. 本章内容 第八章主要讲的是Rust中常见的集合。Rust中提供了很多集合类型的数据结构#xff0c;这些集合可以包含很多值。但是第八章所讲的集合与数组和元组有所不同。 第八章中的集合是存储在堆内存上而非栈内存上的#xff0c;这也意味着这些集合的数据大小无需在编…8.5.0. 本章内容 第八章主要讲的是Rust中常见的集合。Rust中提供了很多集合类型的数据结构这些集合可以包含很多值。但是第八章所讲的集合与数组和元组有所不同。 第八章中的集合是存储在堆内存上而非栈内存上的这也意味着这些集合的数据大小无需在编译时就确定在运行时它们可以动态地变大或变小。 本章主要会讲三种集合Vector、String和HashMap本文 喜欢的话别忘了点赞、收藏加关注哦加关注即可阅读全文对接下来的教程有兴趣的可以关注专栏。谢谢喵(ω) 8.5.1. 什么是HashMap HashMap的形式是HashMapK,V其中K代表键(key)V代表值(value)。HashMap以键值对的形式存储数据一个键对应一个值。很多语言都支持这样的集合数据结构但是不一定是这个叫法比如说C#中相同概念的数据结构叫字典(dictionary)。 HashMap的内部实现使用了Hash函数中文叫哈希函数这个函数决定了如何在内存中存储键与值。 在Vector中我们使用索引来访问数据但有的时候你想要的是通过键键可以是任何数据类型来寻找数据而不是通过索引或者说你不清楚这个数据在哪个索引。这种情况就可以使用HashMap。 需要注意的是HashMap是同构的也就是说在一个HashMap中所有的键必须是同一类型所有的值必须是同一类型。 8.5.2. 创建HashMap 由于HashMap不常用所以Rust并没有把它集成到预导入模块(Prelude)使用前需要引入HashMap在代码开头写上use std::collections::HashMap;创建空的HashMap使用Hash::new()函数添加数据使用insert()方法 看个例子 use std::collections::HashMap; fn main() { let mut scores:HashMapString, i32 HashMap::new();
}在这里创建了一个名为scores的变量来存储HashMap由于Rust是强语言类型它必须知道你在HashMap里存储什么数据类型。又因为没有前后文可供编译器推断所以在声明时就必须把HashMap里键和值的数据类型显式声明出来在代码中就是scores的键被设为了String类型值被设为了i32类型。 当然如果你在后文给这个HashMap上添加了数据Rust就会根据添加的数据类型自动推断键和值的数据类型。添加数据使用insert()方法。例子如下 use std::collections::HashMap; fn main() { let mut scores HashMap::new(); scores.insert(String::from(dev1ce), 0); }因为在第5行往scores里添加了键值对且键String::from(dev1ce)是String类型值0是i32(Rust默认整数是i32)类型所以编译器就会自己推断出scores是一个HashMapString, i32类型的HashMap因此第四行在声明时就不需要显式声明了。 8.5.3. 将两个Vector合为一个HashMap 在元素类型为元组的Vector上使用collect方法可以使用HashMap。换个说法假如你有两个Vector这两个Vector上的所有值都有一一对应关系这个时候就可以使用collect方法把一个Vector里的数据作为键另一个作为值放到HashMap里。如下例 use std::collections::HashMap; fn main() { let player vec![String::from(dev1ce), String::from(Zywoo)]; let initialscores vec![0, 100]; let scores: HashMap, _ player.iter().zip(initial_scores.iter()).collect();
}player这个Vector是用来存储选手名字的里面的元素是String类型initial_scores这个Vector是用来存储每个选手对应的得分的player.iter()和initial_scores.iter()是两个Vector的遍历器使用.zip()方法就可以创建一个元组的数组player.iter().zip(initial_scores.iter())就是创建一个player中的元素在前initialscores中的元素在后的元组数组想换元素位置就可以把代码中的两个迭代器呼唤位置即可。然后再使用.collect()方法来把元组转化为HashMap。最后要注意的一点是.collect()它支持转换为很多数据结构如果声明时不显式声明其类型程序就会报错这里就指明了类型是HashMap, _中的两个数据类型编译器可以根据代码也就是找两个的Vector的数据类型来推断所以这里可以写_占位符让它自行推断。 8.5.4. HashMap和所有权 对于实现了Copy trait的数据类型例如i32在内的绝大多数简单数据类型值会被复制到HashMap中原先的变量仍然可用。对于没有实现的例如String所有权会被交给HashMap。 如果将值的引用插入到HashMap值本身就不会移动。在HashMap的有效期间被引用的值必须保持有效。 8.5.5. 访问HashMap中的值 访问值可以使用get方法。get方法的参数是HashMap的键返回值是OptionV这个枚举。看个例子 use std::collections::HashMap; fn main() { let mut scores HashMap::new(); scores.insert(String::from(dev1ce), 0); scores.insert(String::from(Zywoo), 100);let player_name String::from(dev1ce); let score scores.get(player_name); match score { Some(score) println!({}, score), None println!(Player not found), };
}首先创建了一个空的HashMap叫做scores然后又通过insert方法往里面添加了两个键值对(“dev1ce”, 0)和(“Zywoo”, 100)键类型是String值类型是i32。然后又声明了名为player_name的String变量其值为dev1ce。接着就通过HashMap上的get方法在scores找player_name表示引用这个键所对应的值但是get方法返回的是Option枚举所以这里先把这个Option枚举值赋给score后面再来解包。最后使用了match表达式来处理score如果找到了对应的值score这个枚举类型就会是变体Some把Some所关联的值绑定在score上然后再打印出来。如果找不到score这个枚举类型就会是变体None这个时候就会打印Player not found。 输出 08.5.6. 遍历HashMap 遍历HashMap一般使用for循环。如下例 use std::collections::HashMap; fn main() { let mut scores HashMap::new(); scores.insert(String::from(dev1ce), 0); scores.insert(String::from(Zywoo), 100); for (k, v) in scores { println!({}: {}, k, v); }
}这个for循环使用的是HashMap的引用也就是scores,因为通常遍历之后还要继续使用这个HashMap所以使用引用就不会失去所有权前面的(k,v)是一个模式匹配第一个值就是键这里赋给了k;第二个是值,这里赋给了v。 输出 Zywoo: 100 dev1ce: 0