1 个不稳定发布
0.1.0 | 2023年4月8日 |
---|
#2402 in 数据结构
29KB
329 行
可变长度数组,也称为运行时大小
提供可变长度数组(VLA),也称为可变大小或运行时大小。
它是一种数组数据结构,其长度在运行时确定(而不是在编译时)。
VLAs的主要目的是简化数值算法的编程。
注意:
与动态数组不同,VLA不能改变其大小,其大小在创建时确定一次。但它们在使用上可能比静态数组更舒适,静态数组的大小必须在编译时知道。
更重要的是,此crate提供的VLA在某些情况下比std::vec::Vec
更有效。这是因为一些优化和与C++数组的接近性,这些数组是由malloc
分配的。这就是为什么某些方法是 unsafe 的。
创建数组
use runtime_sized_array::Array;
let arr1: Array<i32> = Array::new(10).expect("cant' create new array");
let mut vec = vec![1,2,3];
let ptr = vec.as_mut_ptr();
let size = vec.len();
let arr2: Array<i32> = unsafe { Array::from_pointer(ptr, size) };
let arr3: Array<i32> = vec.into();
迭代
use runtime_sized_array::Array;
let mut array : Array<i32> = vec![1,2,3].into();
// mutable iterator
for item in array.iter_mut() {
*item += 1;
}
// immutable iterator
for item in array.iter() {
println!("{item}");
}
// immutable iterator
for item in &array {
println!("{item}");
}
// again mutable iterator
for item in &mut array {
*item *= 0;
}
访问元素
安全访问
use runtime_sized_array::Array;
let mut arr: Array<i32> = vec![1,2,4].into();
// immutable access
assert_eq!(arr.try_get(1), Some(&2));
assert_eq!(arr.try_get(10), None);
// mutable access
*arr.try_get_mut(1).unwrap() = 5;
assert_eq!(arr.try_get_mut(10), None);
// alternative mutable access
assert_eq!(try_set(1, 5), Some(()));
assert_eq!(arr.try_set(10, 4), None);
// by brackets
arr[0] = 17;
assert_eq!(arr[0], 17);
不安全访问
use runtime_sized_array::Array;
let mut arr: Array<i32> = vec![1,2,4].into();
// immutable access
unsafe { assert_eq!(arr.get(1), &2) }
// arr.get(10) - undefined behaviour
unsafe { *arr.get_mut(1) = 2; }
// *arr.get_mut(10) == 4; - undefined behaviour
// alternative mutable access
unsafe { arr.set(1, 5); }
// arr.set(10, 4); - undefined behaviour
unsafe {
*arr.get_mut_ptr(0) = 10;
assert_eq!(*arr.get_ptr(0), 10)
}