6个版本
0.3.2 | 2023年12月18日 |
---|---|
0.3.1 | 2023年12月12日 |
0.3.0 | 2022年12月8日 |
0.2.1 | 2019年6月18日 |
0.1.0 | 2019年6月10日 |
#108 in 数据结构
1,996 每月下载量
用于 15 个 包(直接使用10个)
55KB
358 行
array2d
Array2D提供固定大小的二维数组。它比向量向量更有效且更容易使用,即 Vec<Vec<T>>
。
当使用类似网格的结构时,这很有用,这在图像处理、游戏棋盘和其他情况下很常见。当行或列可能有不同长度时,不能使用Array2D——所有行和列必须具有相同的长度。
如何使用 Array2D
创建 Array2D
创建 Array2D
有多种方法。这些包括
- 提供行或列,它们必须具有相同的大小(请参阅
from_rows
和from_columns
)。 - 提供“扁平”的元素切片,无论是按照 行主序或列主序,以及维度,这些维度必须与切片中的元素数量相匹配(请参阅
from_row_major
和from_column_major
)。 - 提供要重复放入每个位置的值(请参阅
filled_with
)。 - 提供重复调用的生成器函数,以产生填充数组的值(参见
filled_by_row_major
和filled_by_column_major
)。 - 提供一个迭代器,用于生成填充数组的值(参见
from_iter_row_major
和from_iter_column_major
)。
访问 Array2D
中的数据
Array2D
支持多种索引形式
- 使用索引语法(方括号)和一对
(usize, usize)
,超出索引范围时将引发 panic。 - 使用
get
、get_mut
和set
方法,在超出索引范围时返回Option
或Result
。 - 使用行主序或列主序版本的这些方法,即
get_row_major
、get_mut_row_major
、set_row_major
、get_column_major
、get_mut_column_major
、set_column_major
。这些方法执行与行/列非主序方法相同的任务,但只需要一个索引而不是两个。
Array2D
还支持多种迭代形式。您可以遍历
- 所有元素,无论在行主序或列主序顺序下(参见
elements_row_major_iter
和elements_column_major_iter
)。 - 单个行或列(参见
row_iter
和column_iter
)。 - 所有行或所有列(参见
rows_iter
和columns_iter
)。
从Array2D
中提取所有数据
通过几种方法可以将一个Array2D
转换回一个Vec
。您可以将数据提取为
- 行或列的
Vec
(参见as_rows
和as_columns
)。 - 元素在行主序或列主序中的“扁平”
Vec
(参见as_row_major
和as_column_major
)。
示例
use array2d::{Array2D, Error};
pub fn main() -> Result<(), Error> {
// Create an array filled with the same element.
let prefilled = Array2D::filled_with(42, 2, 3);
assert_eq!(prefilled.num_rows(), 2);
assert_eq!(prefilled.num_columns(), 3);
assert_eq!(prefilled[(0, 0)], 42);
// Create an array from the given rows. You can also use columns
// with the `columns` function
let rows = vec![vec![1, 2, 3], vec![4, 5, 6]];
let from_rows = Array2D::from_rows(&rows)?;
assert_eq!(from_rows.num_rows(), 2);
assert_eq!(from_rows.num_columns(), 3);
assert_eq!(from_rows[(1, 1)], 5);
// Create an array from a flat Vec of elements in row major or
// column major order.
let column_major = vec![1, 4, 2, 5, 3, 6];
let from_column_major =
Array2D::from_column_major(&column_major, 2, 3)?;
assert_eq!(from_column_major.num_rows(), 2);
assert_eq!(from_column_major.num_columns(), 3);
assert_eq!(from_column_major[(1, 1)], 5);
// Implements `Eq` if the element type does.
assert_eq!(from_rows, from_column_major);
// Index into an array using a tuple of usize to access or alter
// the array.
let rows = vec![vec![1, 2, 3], vec![4, 5, 6]];
let mut array = Array2D::from_rows(&rows)?;
array[(1, 1)] = 100;
// Convert the array back into a nested Vec using `as_rows` or
// `as_columns`.
let array_rows = array.as_rows();
assert_eq!(array_rows, vec![vec![1, 2, 3], vec![4, 100, 6]]);
// Convert the array back into a flat Vec using `as_row_major` or
// `as_column_major`.
let array_column_major = array.as_column_major();
assert_eq!(array_column_major, vec![1, 4, 2, 100, 3, 6]);
// Iterate over a single row or column
println!("First column:");
for element in array.column_iter(0)? {
println!("{}", element);
}
// Iterate over all rows or columns.
println!("All elements:");
for row_iter in array.rows_iter() {
for element in row_iter {
print!("{} ", element);
}
println!();
}
Ok(())
}
许可证:MIT
依赖项
~175KB