Rust集合类型(vector,string,hashmap)

一、Vector

1.只能存储相同类型的数据,在内存中是连续存放,往vector里面添加元素时,可能这块地方不够,换个地方存储,所以你借用(引用)之后就不能修改vector。

2.vector的创建:let v: Vec=Vec::new();这是一个空的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];

3.HashMap类型

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,
}

你可能感兴趣的:(Rust学习笔记,rust,开发语言,后端)