1.只能存储相同类型的数据,在内存中是连续存放,往vector里面添加元素时,可能这块地方不够,换个地方存储,所以你借用(引用)之后就不能修改vector。
2.vector的创建:let v: Vec
这是一个空的vector,需要指明数据具体格式。
使用初始值的方式创建:let v=vec![1,2,3];
使用vec!宏。
3.更新vector,向里面添加元素,使用push的方法。
let mut v=Vec::new();
v.push(1);//如果没有这句,上面是错误的,因为没有指定数据类型。
删除vector:vector也有作用域,超出范围就会删除。
4.读取vector的元素:
有引用和get()方法
fn main() {
let v=vec![1,2,3,4,5];
let third:&i32=&v[2]; //变量是引用的方式,不会影响vector
println!("{}",third);
match v.get(2){ //get返回的是Option枚举
Some(third)=>println!("{}",third),
None=>println!("no"),
}
}
//建议使用下面的方式,上面的越界会照成程序panic奔溃。
5.遍历vector的值。
for i in &v{} //不可变遍历
let mut v=vec![100,20,20];
for i in &mut v{
*i+=50;} //可变遍历
6.vector+enum的实例
使用enum可以存放不同的数据类型。
enum Cell{
Int(i32),
Float(f64),
Text(String),
}
fn main(){
let row=vec![
Cell::Int(3),
Cell::Float(3.2),
Cell::Text(String::from("blue")),
];
}
1.str (或&str)是来自rust核心语言层面,都是以字符串切片的形式存在就是字符串字面值(就是你随便写的let s=“scsc”;)
String类型来自于标准库,可增长、可修改、可拥有。都使用UTF-8编码
2.创建
to_string()或者new()
let hello=String::from("hello");
3.更新string
s.push_str(“bar”);尾部链接字符串切片
s.push(“l”)方法,添加单个字符。
+:连接字符串
使用的是fn add(self,s:&str)->String{}
let s3=s1+&s2;
s1的所有权没有了,后面无法使用,但是s2可以继续使用。
let s=format!("{}-{}-{}",s1,s2,s3);
println!("{}",s);//format是返回并不输出,而且format不会取得任何变量得所有权,
//后面可以继续使用。
4.String类型不可以使用索引下标访问s[0]。
因为索引和Unicode标量值并不是都可以一个一个对应的,一个索引可以只对应半个Unicode标量值。
Rust有三种看待字符串的方式:字节(w.bytes()),标量值(w.chars()),字形簇(比较复杂,没有提供功能)。
最后一个Rust不允许对String进行索引的原因:索引操作应该只消耗一个常量的时间,而String无法保证,需要遍历所有的内容,来确定有多少个合法的字符。
5.切割String,创建字符串的切片。
如果切割超过了字符边界,就会有panic出现。
let hello="abcdef";
let s=&hello[0..4];
1.创建hashmap
use std::collections::HashMap;
let mut scores:HashMap<String,i32>=HashMap::new();
scores.insert(String::from("Blue"),10);
没有内置的宏来创建,数据存储在heap上。同构的:所有的K必须是同一种类型,所有的V必须是同一种类型。
还可以通过colect方法来创建hashmap。
use std::collections::HashMap;
fn main(){
let teams=vec![String::from("blue"),String::from("yellow")];
let intilal_scores=vec![10,50];
let scores:HashMap<_,_>=
teams.iter().zip(intilal_scores.iter()).collect();
}
2.hashmap和所有权:
对于基础数据类型(i32),值会被复制到hashmap中。
对于拥有权的值(如String),值会被移动,交给Hashmap。
如果将值的引用插入到hashmap中,值本身不会移动。
map.insert(&filed_name,&filed_value);
3.访问hashmap中的值。
get方法返回值是option枚举。
use std::collections::HashMap;
fn main(){
let mut scores=HashMap::new();
scores.insert(String::from("blue"),10);
scores.insert(String::from("yellow"),50);
let team_name=String::from("blue");
let score=scores.get(&team_name);
match score{
Some(s)=>println!("{}",s),//s是value。
None=>println!("team not exist"),
}
}
4.遍历hashmap:
for (k,v) in &scores{
println!("{}:{}",k,v);}
5.更新hashmap中的数据
k已经存在,对应一个v有以下三种方式
替换现有的v
保留现有的v,忽略新的v
合并现有的v和新的v
k不存在,直接添加就行。
entry方法:检查指定的key是否对应一个v,参数为k,返回enum_entry:代表值是否存在。
use std::collections::HashMap;
fn main(){
let mut scores=HashMap::new();
scores.insert(String::from("blue"),10);
let e=scores.entry(String::from("yellow"));
println!("{:?}",e);
e.or_insert(50);
scores.entry(String::from("blue")).or_insert(50);
println!("{:?}",scores);
}
Entry(VacantEntry(“yellow”))
{“blue”: 10, “yellow”: 50}
6.词频统计:
use std::collections::HashMap;
fn main(){
let text="hello world wonderful world";
let mut map=HashMap::new();
for word in text.split_whitespace(){
let count =map.entry(word).or_insert(0);
*count+=1;
println!("{}",count);
}
println!("{:#?}",map);
}
1
1
1
2
{
“hello”: 1,
“world”: 2,
“wonderful”: 1,
}