【05】RUST常用的集合&函数&宏&类型

文章目录

常用集合

Vec

  • 堆上连续内存
  • vector可能出现扩容,把老元素copy到内存新位置
    • 因此不允许let first = &v[0];作用域内调用v.push(4);
rust 复制代码
// 定义
let v: Vec<i32> = Vec::new();
let v = vec![1, 2, 3];	// 使用vec!宏定义

// 增加元素
v.push(4);

// 取数值
v[2]; // 下标索引
v.get(2); // 调用get

// 越界时不会panic,会返回None
v.get(100);
v[100];

// 遍历
for i in &v{
	// 不可变遍历元素
	println!("{i}");
}
for i in &mut v{
	// 可变遍历元素
	*i += 50;
}
// 融合枚举可以往vec中填充多种数据类型
enum SpreadsheetCell {
	Int(i32),
	Float(f64),
	Text(String),
}

let row = vec![
	SpreadsheetCell::Init(3),
	SpreadsheetCell::Text("x_x"),
	SpreadsheetCell::Float(3.1415926),
	];

String

String 字符串字面值 str
let s = String:::new();let s = String::from("string");let s = "string".to_string(); "string" let s1: &str = "hello";let s2 = String::from("world"); let s2_slice: &str = &s2;
堆分配的、可变的 UTF-8 字符串。本质是对 Vec 的封装,但保证内容为合法 UTF-8。 用双引号 "..." 表示的硬编码字符串。 对一段 UTF-8 字节序列的引用,通常以 &str 形式出现。

RUST中使用UTF-8编码,字符长度可变。

rust 复制代码
let mut  s = String::new();
let data = "initial contents";
let s = data.to_string(); // .to_string();用于任何实现了 Display trait 的类型
let s = "initial contents".to_string();
let mut s = String::from("foo");
s.push_str("bar");

// push_str不获取所有权,为获取一个单独的字符作为参数,并附加到 String 中。
let mut s1 = String::from("foo");
let s2 = "bar";
s1.push_str(s2);
println!("s2 is {s2}");//s2依旧有效

// + 获取了s1所有权fn add(self, s: &str) -> String {} 
let s1 = String::from("Hello, ");
let s2 = String::from("world!");
let s3 = s1 + &s2; //这里&s2发生强制类型转换为&str
// 注意 s1 被移动了,不能继续使用

//更为复杂的字符串链接,可以使用 format! 宏拼接
let s1 = String::from("tic");
let s2 = String::from("tac");
let s3 = String::from("toe");
let s = format!("{s1}-{s2}-{s3}");

// 索引字符串,不建议,UTF-8编码长度不固定,需要程序员确保正确

// 遍历字符串
// 按照字符遍历 2 字符
for c in "Зд".chars() {
	println!("{c}");
}
// 按照字节遍历 4 字节
for b in "Зд".bytes() {
	println!("{b}");
}

HashMap

默认使用SipHash进行,可以抵御涉及哈希表(hash table)的拒绝服务(Denial of Service, DoS)攻击。

rust 复制代码
use std::collections::HashMap;
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);

// 根据key查询数值
let team_name = String::from("Blue");
let score = scores.get(&team_name).copied().unwrap_or(0);
// get返回Option<&V>
// 调用 copied 方法来获取一个Option<i32>,没有key时会返回 None
// 调用 unwrap_or 在 scores 中没有该键所对应的项时将其设置为零


// 遍历数据
for (key, value) in &scores {
	println!("{key}: {value}");
}

// 插入后所有权归HashMap所有
use std::collections::HashMap;
let field_name = String::from("Favorite color");
let field_value = String::from("Blue");
let mut map = HashMap::new();
map.insert(field_name, field_value);
// 这里 field_name 和 field_value 不再有

// 多次插入,会新的覆盖老的。
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Blue"), 25);


//Entry 的 or_insert 方法在键对应的值存在时就返回这个值的可变引用,如果不存在则将参数作为新值插入并返回新值的可变引用。
// entry只有在没有key的时候才进行插入
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.entry(String::from("Yellow")).or_insert(50);
scores.entry(String::from("Blue")).or_insert(50);
// 根据key已有的value更新
let mut map = HashMap::new();
for word in text.split_whitespace() {
	let count = map.entry(word).or_insert(0);
	*count += 1;
}

打印

  • dbg!()
    • 格式打印,()获取参数所有权,并返回表达式所有权。
    • 打印到标准错误控制台流stderr
  • println!()
    • ()接受引用
    • 打印到标准输出控制台流stdout

类型

Option<T>

  • 用于空值检查 (因为编译器会保证T类似一定非空值)
相关推荐
爱是小小的癌5 分钟前
数据结构与算法之排序算法-快速排序(分治)
java·开发语言·数据结构·算法·排序算法
不能只会打代码1 小时前
Python人工智能技术全景:从基础框架到DeepSeek的突破性创新
开发语言·人工智能·python·deepseek
清风吹雨泡泡1 小时前
HCIA-10.生成树 STP 3/3
开发语言·php
pink大呲花1 小时前
利用ES6 Set去重
开发语言·javascript·es6
蓝色洛特1 小时前
【matlab优化算法-17期】基于DBO算法的微电网多目标优化调度
开发语言·算法·matlab
天天进步20152 小时前
Java全栈项目实战:在线课程评价系统开发
java·开发语言
ONE_PUNCH_Ge2 小时前
Python 量化
开发语言·python
Mr-Wanter2 小时前
使用 JFreeChart 创建动态图表:从入门到实战
开发语言·python·信息可视化
Strive_Sun2 小时前
Windows 下搭建 googletest 测试框架(C/C++)
c语言·开发语言·c++·windows
fly spider2 小时前
Java 中 ArrayList 和 LinkedList 有什么区别?
java·开发语言·集合