概述集合都存储在堆1中。Vector类型是标准库std提供的Vec,可以存储相同数据类型的多个值。值在内存中连续存储。创建一个Vector并使用Vec::new创建一个空向量。使用向量!创建具有初始值的vectorfnmain(){letvec:Vec=Vec::new();letvec1=vec![1,2,3];}更新Vectorpush添加成员fnmain(){letmutvec:Vec=Vec::new();vec.push(1);}pop删除最后一个成员并返回#[derive(Debug)]enumType{Int(u32),Float(f64),Text(String)}fnmain(){letmutvec=vec![Type::Int(12),Type::Float(12.2),Type::Text(String::from("haha"))];println!("{:?}",vec.pop());//Some(Text("haha"))println!("{:?}",vec);//[Int(12),Float(12.2)]}访问Vector的下标索引更灵活,但是当访问越界时,程序panicget方法会返回一个options枚举,可以处理out-越界异常,相对麻烦但安全fnmain(){letvec=vec![1,2,3];让两个=vec[1];letgetTwo=matchvec.get(1){Some(value)=>{println!("valueis{}",value);一些(价值)},无=>{println!(“无”);没有任何}};println!("{}",二);//2println!("{:?}",getTwo);//Some(2)}遍历Vectorfnmain(){letmutvec=vec![1,2,3];vec.push(4);foritemin&mutvec{println!("{}",item);*项目+=50;}println!("{:?}",vec)//[51,52,53,54]}使用enum枚举存储不同数据类型enumType{Int(u32),Float(f64),Text(String)}fnmain(){letvec=vec![Type::Int(12),Type::Float(12.2),Type::Text(String::from("haha"))];}2.StringRust中的String是字节的集合,它提供了Rust的核心语言层只提供了一种字符串类型:stringslice&strStringslice是对存储在别处的UTF-8编码字符串的引用,比如在二进制文件中的字符串字面值String类型文件由标准库提供,而不是语言级别。Rust中的字符串只有String和&str。标准库中也有两种类型。提供了其他字符串类型:OsString,OsStr,CString,CStrCreateStringfnmain(){//创建一个空字符串letstr1=String::new();//将字符串切片转换为字符串letstr2="hello,string".to_string();让str3=String::from("haha");}UpdateStringpush_strpush+format!fnmain(){letstr1=String::new();letstr2="hello,string".to_string();letstr3=String::from("哈哈");//更新字符串letmutstr4=String::from("base,");//1.连接字符串切片str4.push_str(&str3);println!("{}",str4);//base,哈哈//2.拼接单个字符str4.push('!');println!("{}",str4);//base,哈哈!//3.使用+拼接,这样会使得str4文件的所有权已经移动,所以后面不能使用letstr5=str4+&str2;println!("{}",str5);//base,haha??!hello,string//4.format!对于拼接,这个宏不会取得参数的所有权letone=String::from("one");lettwo=String::from("two");letthree=String::from("three");letmerge_str=format!("{}-{}-{}",一,二,三);println!("{}",merge_str);//一二三}访问String不支持索引access因为一个字符可能多占用一个字节,按字节索引不一定能get是我们期望的值,所以Rust直接禁止了这个方法。String是Vec的包装器。len方法获取的是String的字节数,而不是字符数。字符串单元有以下三个概念bytescalarvaluegraphemecluster——标准库没有提供获取这种形式的方法fnmain(){lettarget=String::from("target");//returnbytesIteratorforitemintarget.bytes(){/*目标的字节项目:目标的116字节项目:目标的97字节项目:目标的114字节项目:目标的103字节项目:目标的101字节项目:116*/println!("byteitemoftarget:{}",item)}//返回标量值的迭代器foritemintarget.chars(){/*charitemoftarget:tcharitemoftarget:charitemoftarget:rcharitemoftarget:gcharitemoftarget:echaritemoftarget:t*/println!("charitemoftarget:{}",item)}}你可以使用[]来切割字符串范围来创建字符串切片,但需要谨慎使用。如果切割时越过字符边界,程序会出现panic。例如目标字符串target的第二个字符占用2个字节。这时候如果它的0,1(target[0..2])字节,就会引起panicfnmain(){letsource_str=String::from("iamsourcestring");让splice_str=&source_str[0..4];println!("{}",splice_str);//iam}3.以HashMap键值对的形式存储数据HashMap不是prelude,需要使用usestr::collections::HashMap引入并创建HashMapHashMap::newcollectusestd::collections::HashMap;fnmain(){让mutmap=HashMap::new();map.insert("名称",10);打印!(“{:?}“,地图);//{"name":10}//collect创建hashmapletkeys=vec!["age","size"];让values=vec![24,12];让new_map:HashMap<_,_>=keys.iter().zip(values.iter()).collect();println!("{:?}",new_map);//{"age":24,"size":12}}获取HashMap成员hashMap[key]hashMap.get(key)usestd::collections::HashMap;fnmain(){letkeys=vec!["年龄”,“尺寸”];让values=vec![24,12];让new_map:HashMap<_,_>=keys.iter().zip(values.iter()).collect();println!("{:?}",new_map);//{“年龄”:24,“尺寸”:12}println!("{}",new_map[&"size"]);//12匹配new_map.get(&"age"){Some(v)=>println!("{}",v),//24None=>println!("None")}}遍历HashMapuse标准::collections::HashMap;fnmain(){让mutconfig=HashMap::new();配置.insert("a","A");配置.insert("b","B");配置.insert("c","C");配置.insert("d","D");for(k,v)in&config{println!("{},{}",k,v);}}UpdateHashMapentry&or_insertentry检查k是否有值,如果检测到,则返回对值的可变引用or_insert如果k为空,则插入一个新值并返回对值的可变引用usestd::collections::HashMap;fnmain(){让mutconfig=HashMap::new();配置.insert("a","A");配置.insert("b","B");配置.insert("c","C");配置.insert("d","D");//条目检查k是否为是否有value,如果检测到value存在,则返回value的变量引用//or_insert如果k为空,则插入一个新的value,返回value的变量引用config.entry("a")。or_insert("replace_A");config.entry("e").or_insert("E");/*{"a":"A","b":"B","c":"C","e":"E","d":"D",}*/println!("{:#?}",配置);//利用entry和or_insert的特性实现单词统计letwords="hellogetgetsetcleargoodbadbadyepget";让mutcount_map=HashMap::new();//split_whitespace根据空格拆分,返回一个迭代器forkeyinwords.split_whitespace(){letvalue=count_map.entry(key).or_insert(0);*值+=1;}/*{"get":3,"set":1,"hello":1,"bad":2,"good":1,"yep":1,"clear":1,}*/println!("{:#?}",count_map)}hashfunctionHashMap默认的哈希算法不是最高效的,但是安全性很好。可以指定不同的hasher来切换hash算法hasher参考BuildHashertraittype的实现