6 个版本
使用旧的 Rust 2015
0.2.4 | 2017 年 5 月 27 日 |
---|---|
0.2.3 | 2017 年 5 月 26 日 |
0.1.0 | 2017 年 5 月 22 日 |
#2270 在 数据结构 中
32KB
376 行
此包提供了一种锯齿数组,即与 Box<[Box<[T]>]>
语义上等效的类型,但实现了更好的内存局部性和更少的堆分配。
示例
extern crate jagged_array;
extern crate streaming_iterator;
use std::iter::FromIterator;
use jagged_array::{Jagged2, Jagged2Builder};
use streaming_iterator::StreamingIterator;
// Create a builder object for the array, and append some data.
// Each `extend` call builds another row.
let mut builder = Jagged2Builder::new();
builder.extend(&[1, 2, 3]); // row 0 = [1, 2, 3]
builder.extend(vec![4]); // row 1 = [4]
builder.extend(&[]); // row 2 = []
builder.extend(5..7); // row 3 = [5, 6]
// Finalize the builder into a non-resizable jagged array.
let mut a: Jagged2<u32> = builder.into();
// Alternatively, we could have created the same array from a Vec<Vec<T>> type:
let alt_form = Jagged2::from_iter(vec![
vec![1, 2, 3],
vec![4],
vec![],
vec![5, 6],
]);
assert_eq!(a, alt_form);
// Indexing is done in [row, column] form and supports `get` and `get_mut` variants.
assert_eq!(a[[1, 0]], 4);
*a.get_mut([1, 0]).unwrap() = 11;
assert_eq!(a.get([1, 0]), Some(&11));
// Whole rows can also be accessed and modified
assert_eq!(a.get_row(3), Some(&[5, 6][..]));
a.get_row_mut(3).unwrap()[1] = 11;
// Note that although elements are modifiable, the structure is not;
// items cannot be inserted into rows, nor can new rows be added.
// Iteration via `StreamingIterator`s. See the docs for more detail.
let mut iter = a.stream();
while let Some(row) = iter.next() {
println!("row: {:?}", row);
}
文档
文档可以在 docs.rs 上找到
基准测试
$ cargo bench
test bench_access_jag ... bench: 109 ns/iter (+/- 4)
test bench_access_vec ... bench: 122 ns/iter (+/- 4)
test bench_collect_jag ... bench: 2,619 ns/iter (+/- 177)
test bench_collect_vec ... bench: 3,638 ns/iter (+/- 854)
test bench_flat_len_jag ... bench: 0 ns/iter (+/- 0)
test bench_flat_len_vec ... bench: 50 ns/iter (+/- 5)
test bench_serde_jag ... bench: 343,839 ns/iter (+/- 36,172)
test bench_serde_vec ... bench: 378,089 ns/iter (+/- 37,954)
*_jag
表示 Jagged2<u32>
实现的运行时间,*_vec
表示 Vec<Vec<u32>>
的运行时间。有关更多详细信息,请参阅 benches/jagged2.rs。
许可证
此存储库中的代码采用以下其中之一许可:
- Apache 许可证 2.0(《https://apache.ac.cn/licenses/LICENSE-2.0》)
- MIT 许可证(《http://opensource.org/licenses/MIT》)
任选其一。
贡献
除非你明确声明,否则任何有意提交以包含在此存储库中的贡献,根据 Apache-2.0 许可证定义,应按上述方式双重许可,无需附加条款或条件。
依赖项
~210–455KB
~11K SLoC