Rust中的Vector和HashMap
Vector
vector 定义在堆上,可以动态修改大小
vector使用一段连续的内存空间,且vector中只能存放相同类型的元素
vector的定义有两种方式,一种是通过
Vec::new()
来创建,一种是通过vec![]
宏来创建
vector 的定义
fn main() {
let mut v1:Vec<i32> = vec![1, 2, 3];
let mut v2: Vec<i32> = Vec::new();
v2.push(4);
v2.push(5);
v2.push(6);
v1.pop();
println!("v1: {:?}", v1);
println!("v2: {:?}", v2);
}
/* 输出:
v1: [1, 2]
v2: [4, 5, 6]
*/
常用函数
push() / append()
:向vector末尾添加一个元素pop()
移除末尾的一个元素[index]
获取指定索引位置index上的元素,如果索引越界则引发panic
异常get()
也是获取指定索引位置上的元素,但返回值是一个Option类型
HashMap
HashMap的定义
HashMap是同构的,即所有的key必须是同一种类型,所有的value也必须是同一种类型
HashMap的值也存放在堆上
use std::collections::HashMap;
fn main() {
let mut m: HashMap<i32, i32> = HashMap::new();
m.insert(1, 123);
m.insert(2, 456);
for (k, v) in &m {
println!("{}: {}", k, v);
}
}
/* 输出:
2: 456
1: 123
*/
HashMap中的常用函数
insert()
:向hashmap中插入一个键值对,如果要插入的key已经存在,则更新它的value
use std::collections::HashMap;
fn main() {
let mut m: HashMap<String, i32> = HashMap::new();
m.insert(String::from("a"), 1);
m.insert(String::from("b"), 2);
m.insert(String::from("c"), 3);
// 使用 insert 函数时, 如果要插入的 key 已经存在, 则会覆盖原来的 value
m.insert(String::from("a"), 4);
println!("{:?}", m);
}
/* 输出:
{"b": 2, "a": 4, "c": 3}
*/
get()
:获取指定的key对应的vlaue,该函数的返回值是一个Option类型
use std::collections::HashMap;
fn main() {
let mut m: HashMap<String, i32> = HashMap::new();
m.insert(String::from("a"), 1);
m.insert(String::from("b"), 2);
m.insert(String::from("c"), 3);
m.insert(String::from("d"), 4);
let a = m.get(&String::from("a"));
match a {
None => {
println!("No such key");
}
Some(v) => {
println!("Value is {}", v);
}
}
}
/* 输出:
Value is 1
*/
entry()
:检查指定的key是否已经存在,返回值为类型为enum Entry
,结合or_insert()
函数可实现:插入时先判断要插入的key是否已经存在,如果不存在则插入,如果已经存在则忽略
entry()的or_insert()
函数的返回值有两种情况:1. 如果key已经存在,返回一个到该key对应的value的一个可变引用;2:如果key不存在,则将该key和value插入到hashmap中,然后再返回一个到该value值的一个可变引用
use std::collections::HashMap;
fn main() {
let mut m: HashMap<String, i32> = HashMap::new();
m.insert(String::from("a"), 1);
m.insert(String::from("b"), 2);
m.insert(String::from("c"), 3);
// 判断要插入的 key 是否存在, 如果不存在则插入, 存在则忽略
m.entry(String::from("d")).or_insert(4);
m.entry(String::from("a")).or_insert(5);
// entry函数的or_insert函数的返回值
let e = m.entry(String::from("e")).or_insert(6);
// 通过解引用将 e 对应的值从 6 改为 100
*e = 100;
println!("{:?}", m);
}
/* 输出:
{"a": 1, "d": 4, "e": 100, "c": 3, "b": 2}
*/
评论区