Rust中的数组
Rust 数组知识点总结
一、数组与动态数组(Vector)的区别
-
数组(Array)
• 长度固定,声明后不可改变
• 存储在栈上,性能高
• 类型表示为[T; N]
(如[i32; 5]
) -
动态数组(Vector)
• 长度可变,可动态增减元素
• 存储在堆上,性能有额外开销
• 类型为Vec<T>
二、数组的定义与核心特性
-
三要素
• 长度固定
• 元素类型相同
• 线性连续排列 -
示例
let a = [1, 2, 3, 4, 5]; // 自动推导类型 let months: [&str; 12] = ["January", "February", ..., "December"];
三、数组的声明与初始化
-
显式类型声明
let a: [i32; 5] = [1, 2, 3, 4, 5];
-
重复值初始化
let a = [3; 5]; // 等价于 [3, 3, 3, 3, 3]
四、数组元素的访问与越界检查
-
通过索引访问
let first = a[0]; // 获取第一个元素 let second = a[1]; // 获取第二个元素
-
越界检查
• 在运行时检查索引是否合法
• 越界会导致panic
(如访问a[5]
时)
• 示例:用户输入索引时需处理潜在越界问题
五、数组切片(Slice)
-
定义与使用
• 切片是对数组的 部分连续引用
• 类型为&[T]
,具有固定大小(引用类型)let a: [i32; 5] = [1, 2, 3, 4, 5]; let slice: &[i32] = &a[1..3]; // 包含元素 2, 3
-
特点
• 长度灵活,取决于起始和结束位置
• 创建代价低(仅引用原始数据)
六、多维数组与遍历
-
多维数组声明
let arrays: [[u8; 3]; 4] = [one, two, blank1, blank2];
-
遍历与操作
for a in &arrays { for n in a.iter() { print!("{} ", n); } }
七、注意事项与常见问题
-
类型混淆问题
• 数组类型[T; N]
和切片类型[T]
不同
• 切片引用&[T]
是固定大小的类型 -
长度是类型的一部分
•[u8; 3]
和[u8; 4]
是不同类型 -
实际使用建议
• 优先使用切片引用&[T]
(如函数参数)
• 不确定长度时选择Vector
八、综合示例
fn main() {
let one = [1, 2, 3]; // 自动推导类型
let two: [u8; 3] = [1, 2, 3]; // 显式类型
let blank = [0; 3]; // 重复初始化
let arrays = [one, two, blank];// 二维数组
for a in &arrays {
for n in a.iter() {
print!("{} ", n);
}
}
}
关键总结
• 数组适合固定长度的场景(如月份、固定配置),性能优先时使用。
• 动态数组 Vector
更灵活,适用于需要增删元素的场景。
• 切片 &[T]
是操作数组数据的常用方式,兼顾安全性与灵活性。
• 注意类型系统和越界检查,避免运行时错误。