#数组 #可变长度 #称为 #运行时 #算法 #结构 #运行时大小

nightly runtime-sized-array

可变长度数组,也称为运行时大小

1 个不稳定发布

0.1.0 2023年4月8日

#2402 in 数据结构

GFDL-1.3-or-later

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)
}

无运行时依赖