Rust 入门 常用集合
Rust 中常见的集合
向量(vector)
允许我们一个挨着一个地储存一系列数量可变的值
- 由标准库提供
- 可储存多个值
- 存储的值必须是相同数据类型
- 值在内存中是连续存放的
创建 vector
fn main() {
// 使用构造函数创建
let v1: Vec<i32> = Vec::new();
// 使用宏创建带有初始值的向量
let v2 = vec![1, 2, 3];
}
向 vector 中添加数据
fn main() {
// 向 vector 中添加数据时, vector 必须是可变的
let mut v: Vec<i32> = Vec::new();
v.push(1);
v.push(3);
v.push(5);
v.push(7);
}
删除 vector 中的数据
fn main() {
let mut v = vec![1, 2, 3];
println!("{:?}", v);
v.remove(0); // 删除索引为0的值
println!("{:?}", v);
}
访问 vector 中的数据
fn main() {
let v = vec![1, 2, 3];
// 使用下标直接访问
println!("{}", v[0]);
// 使用get方法访问
if let Option::Some(value) = v.get(0) {
println!("{}", value);
}
}
例子
enum TableCell {
Int(i32),
Float(f64),
Text(String),
}
use TableCell::*;
fn main() {
let row = vec![
Int(3),
Float(3.14),
Text(String::from("π"))
];
}
字符串(string)
字符串是字符的集合
- String 是 byte 的集合, 在 Rust 中的表现形式为 u8
字符串是什么?
- 在 Rust 的核心语言层面, 只有一个字符串类型: 字符串切片(str或&str)
- 字符串切片: 对于存储在其他地方的UTF8编码的字符串的引用
- 字符串字面值: 存储在二进制程序中的, 属于字符串切片
字符串类型是什么?
- 字符串类型来自标准库而不是核心语言层面
- 可增长, 可修改, 可拥有所有权
- 使用UTF8编码
Rust 中的字符串指的是什么?
- String 和 &str
创建 String
fn main() {
// 一般情况下我们不会采用new的方式创建String
// 大多数情况下我们会使用初始值创建String
let mut s = String::new();
}
从初始值创建String
- 需要实现了
Display
这个 trait 的类型 - 我们常用的
&str
就实现了这个 trait
fn main() {
let s1 = "hello";
let s2 = s1.to_string();
let ss = String::from(s1);
}
向String中添加数据
fn main() {
let s = "hello";
let mut s = s.to_string();
s.push_str(" world");
s.push('!');
println!("{}", s);
}
拼接字符串
use std::ops::Add;
fn main() {
// demo 1
let hello = String::from("Hello");
let world = String::from("World");
let s = hello + &world;
println!("{}", s);
// demo 2
let hello = String::from("Hello");
let world = String::from("World");
let s = hello.add(&world);
println!("{}", s);
// demo 3
let who = String::from("小明");
let site = String::from("厕所");
let work = String::from("吃饭");
let result = format!("{}在{}{}", &who, &site, &work);
println!("{}", result);
}
访问String中的数据
fn main() {
let s = String::from("你好");
println!("字符串的长度: {}", s.len());
// 我们可以看到输出的结果为 6
// 在 UTF8 编码中, 字符串中的单个字符并不一定是占用一个字节的
// Rust 为了避免出错, 不允许使用索引的方式访问字符串中的数据
println!("\n标量");
for char in s.chars() {
println!("{}", char);
}
println!("\n字节");
for byte in s.bytes() {
println!("{}", byte);
}
}
切割String
fn main() {
let s = String::from("你好");
// 这一行会报错, 不能切割String
println!("{}", s[..3]);
// 但是我们可以切割字符串切片
println!("{}", &s[..3]);
}
哈希集合(hash map)
哈希集合允许我们将值与一个特定的键相关联
- 键值对的形式储存数据, 一个键(key)对应一个值(value)
创建 HashMap
use std::collections::HashMap;
fn main() {
let mut map: HashMap<i32, String> = HashMap::new();
}
向 HashMap 中插入数据
use std::collections::HashMap;
fn main() {
let mut map = HashMap::new();
map.insert(1, "关注".to_string());
map.insert(2, "推荐".to_string());
map.insert(3, "收藏".to_string());
map.insert(4, "转发".to_string());
}
访问 HashMap 中的数据
use std::collections::HashMap;
fn main() {
let mut map = HashMap::new();
map.insert(1, "关注".to_string());
map.insert(2, "推荐".to_string());
map.insert(3, "收藏".to_string());
map.insert(4, "转发".to_string());
if let Some(value) = map.get(&1) {
println!("{}", value);
}
}
遍历 HashMap 中的数据
use std::collections::HashMap;
fn main() {
let mut map = HashMap::new();
map.insert(1, "关注".to_string());
map.insert(2, "推荐".to_string());
map.insert(3, "收藏".to_string());
map.insert(4, "转发".to_string());
for (k, v) in &map {
println!("key:{} value:{}", k, v);
}
}
更新 HashMap 数据
use std::collections::HashMap;
fn main() {
let mut map = HashMap::new();
map.insert(1, "关注".to_string());
map.insert(2, "推荐".to_string());
map.insert(3, "收藏".to_string());
// 覆盖原有的值
map.insert(1, "记得关注".to_string());
// 忽略新的值
map.entry(2).or_insert("记得推荐".to_string());
for (k, v) in &map {
println!("key:{} value:{}", k, v);
}
}
如果对我分享的内容感兴趣的话 记得关注我得动态
求推荐 求收藏 求转发 求关注
求推荐 求收藏 求转发 求关注