rust学习九.3-集合之哈希映射表

打印 上一主题 下一主题

主题 884|帖子 884|积分 2652

这里介绍的哈希映射表(HashMap)并非是java那样的万用表,限制很大。
不过,话说回来,rust应该是有雷同java那样的映射表,不过不是这个哈希映射表。现在先评论哈希映射表吧。
 
一、构成和界说

HashMap 是最不常用的,所以并没有被 prelude 自动引用。标准库中对 HashMap 的支持也相对较少,例如,并没有内建的构建宏。
必须在代码前use下:
use std::collections::HashMap;
通过有关工具,我们知道哈希映射表内部代码是如许的:


 

和其它语言相比,没有什么特别的,显著的不同,都是包罗数组(雷同数组之类的)、属性、一些公共的方法。
 
rust的哈希映射表具有许许多多的的方法/属性,例如:

 

 
以上只是部分。
可见,rust的创建者们还是挺费心的,并保持了他们的一贯风格:为开辟者们提供了有点尽善尽美的各种实现。
java的实现某种程度看起来更加得简洁。
rust提供了那么多的实现,部分缘故原由也是因为它独有复杂的所有转题目导致的,rust力图让程序员不要在写代码的时候想着哈希表的值所有权的题目
 
二、根本操作

究竟上,如前文所言,rust为哈希映射表提供了居多的方法,所以这里有仅仅是列出比力常用的一些,又或者就是作者例文中给出的。
插入
insert
很紧张的一点:键范例必须一致,值范例必须一致,否则会报错:

一个很贴心的提示: expected &str ,found Vec...
如果硬要插入不同的,也是间接的,例如插入Option类的值,但那样让一个值变得复杂了。
 
 
访问单个成员
get(&o)
get_mut(&o)
还有许多。
注意,rust的创建者们很喜欢使用Option来包装返回值。大概Option应该改名为万用塑料袋。
 
删除
remove
修改
键是不可修改的,只能修改值。所以所谓的修改就是覆盖值,这个和java等语言的操作是一样的,插入雷同的键及其值会天然覆盖已有的,从而达到修改值得目的。
简单一点,就是再次insert
打印
如果是简单得,那么println!("{:?}",xxx),或者再稍微复杂一些: println!("{:#?}",xxx).
遍历
有常见的会合方式:
遍历键集合、便利值集合、迭代器、  (K,V) IN ()
其它
清空.-clear
 
三、所有权

即:创建一个变量v,然后作为一个值放入哈希表,那么v值的所有权归归于谁?
凡是复杂的范例(或者说复合范例)都有如许的题目。 我们只需要记着几个根本点即可。
根据第四章的紧张规则:

  • 一个值(不是变量)一定要有所有者
  • 而且任意时候,一个值只能有一个所有者
  • 值所有者离开作用域后,持有的值会被立刻释放
如果不做特殊处理,所有权就会发生转移-这是毋庸置疑的。
所以,insert之后,原来的值得所有权会发生转移...
当然,如果你的键或者值属于栈范例的,就不会有这个题目,因为所有权这个事情从来都属于堆范例。
 
四、示例

 
  1. /**
  2. * map 也就是大部分语言中具有的类型,中文称为映射表
  3. * 内部的实现并没有什么本质的区别:一个数组或者类似数组的东西,加上一堆方法。
  4. * 根据具体的情况,可以细分为许多子类型的映射表,就好像java那样
  5. *
  6. * 一、哈希映射表的定义/创建
  7. *    1.所有键的类型必须一致,所有值的类型必须是一致,这和java是大不一样的。  rust应该也有和java对应的,但应该不是哈希映射表
  8. *
  9. * 二、映射表的基本操作
  10. *
  11. * 三、映射表的一些特殊操作
  12. *
  13. * 四、映射表的一些特殊操作
  14. *
  15. * 五、映射表的小结
  16. *
  17. */
  18. use std::collections::HashMap;
  19. use std::any::type_name;
  20. fn print_type_of<T>(_: &T) {
  21.     println!("The type is: {}", type_name::<T>());
  22. }
  23. fn main(){
  24.     let mut family=HashMap::new();
  25.     family.insert(String::from("父亲"),"lzf");
  26.     family.insert(String::from("母亲"),"hxl");
  27.     family.insert(String::from("女儿"),"lml");
  28.     family.insert(String::from("男儿"),"lql");
  29.     println!("{:?}",&family);
  30.     let mut  sun=Vec::new();sun.push("阿大");sun.push("阿二");
  31.     //family.insert(String::from("孙辈"),sun);  //这样是会报错的
  32.     //println!("{:?}",&family);
  33.     println!("{:#?}",&family); //更好的格式
  34.     let mut scores=HashMap::new();
  35.     let g_bad:String=String::from("差");
  36.     let g_mid:String=String::from("中");
  37.     let g_good:String=String::from("良");
  38.     let g_excellent:String=String::from("优");
  39.     let g_perfect:String=String::from("完美");
  40.     scores.insert(String::from("101"),g_bad);   //g_bad被夺取所有权了
  41.     scores.insert(String::from("102"),g_mid);
  42.     scores.insert(String::from("103"),g_excellent);
  43.     scores.insert(String::from("104"),g_good);
  44.     scores.insert(String::from("105"),g_perfect);
  45.     println!("{:#?}",&scores);
  46.     println!("get方法会返回一个不可修改的对象");
  47.     let s103=scores.get("103"); //返回的是一个Option
  48.     println!("103的成绩:{}",s103.unwrap());
  49.     //s103=Some(&String::from("说不清"));  // 这是不可修改,会报错
  50.     let s106=scores.get("106"); //访问一个不存在,会返回None
  51.     println!("106的成绩:{}",s106.unwrap_or(&String::from("不存在")));
  52.     let  mut_s104=scores.get_mut("104");
  53.     print_type_of(&mut_s104);
  54.     println!("现在104的成绩:{}",mut_s104.unwrap());
  55.    
  56.     //println!("{}",g_bad); //g_bad被夺取所有权了,所以这里会报错的   
  57.     print_hm_use_forkv(&scores);
  58.     print_hm_use_forvalues(&scores);
  59. }
  60. fn print_hm_use_forkv(hm:&HashMap<String,String>){
  61.     for (k,v) in hm{
  62.         println!("{}:{}",k,v);
  63.     }
  64. }
  65. fn print_hm_use_forvalues(hm:&HashMap<String,String>){
  66.     for value in hm.values() {
  67.         println!("{}",value);
  68.     }
  69. }
复制代码
 
五、小结


  • 固然和大部分语言雷同,但是还是有不小范围性。用起来不是那么友好。这都是拜所有权所赐
  • 团体上,还是比力方便。但需要特别注意所有权题目
  • rust提供了充足丰富的函数来处理各种需要

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

知者何南

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表