#slice #chunk #vector

slicedvec

用于遍历切片的分区向量

6个版本

0.2.3 2023年6月1日
0.2.2 2023年6月1日
0.2.1 2023年5月31日
0.1.1 2023年5月29日

#2244 in 数据结构

Download history • Rust 包仓库 118/week @ 2024-03-12 • Rust 包仓库 4/week @ 2024-04-02 • Rust 包仓库

每月60次下载

MIT许可证

265KB
419

slicedvec

这是一个Rust crate,它提供了一个类型 SlicedVec<T>,它使用单个 Vec<Vec<T>> 进行存储,以模拟 Vec<Vec<T>> 的某些方面。其主要目的是支持交换-删除习惯用法。当反复创建和销毁许多对象时,可以使用交换-删除习惯用法来消除大多数分配。但是,如果存储的对象本身进行分配,则不适用,例如,当使用 Vec<Vec<Vec<T>>


lib.rs:

提供了两个结构:SlicedVecSlicedSlab。目标用例是需要反复构建和丢弃短、运行时大小的浮点数序列。除非使用池或其他机制,否则使用 Vec<Vec<T>> 可能会导致分配器抖动。《SlicedVec》将运行时大小的切片集合存储在一个向量中。它模拟了一个 Vec<&[T]>,但拥有并管理自己的存储。提供了常数时间、非顺序保持的插入和删除方法。重复生成 pushswap_remove(或 swap_truncate) 不会分配,因为存储容量将根据需要增长。

SlicedSlab 是基于 SlicedVec 构建的,并返回分配值序列的稳定键。当一个序列被插入到片块中时,它会返回一个键。可以使用该键从片块中检索或删除序列。删除操作仅将槽标记为未占用,后续的插入将覆盖它而不需要分配。请注意,删除序列的元素将推迟到插入到该位置。如果片块变得过于稀疏,提供了重新键和压缩片块的方法。空槽存储在 BTreeSet 中,因此大多数操作具有与开放槽数量对数复杂度相关的复杂度。在大多数情况下,开放槽集将非常小,并且完全位于缓存中。如果它变得过大,则需要压缩以提高性能。始终插入到可用最低等级槽位中的优势超过了 BTreeSet 的小成本,因为它减少了碎片化。

示例

use rand::{rngs::SmallRng, Rng, SeedableRng};
use slicedvec::SlicedVec;
let mut rng = SmallRng::from_entropy();
let mut x1 = SlicedVec::with_capacity(1000, 20);
x1.push_vec(
    std::iter::repeat_with(|| rng.gen())
    .take(20 * 1000)
    .collect::<Vec<_>>(),
);
let x1_insert: Vec<Vec<usize>> =
    std::iter::repeat_with(|| std::iter::repeat_with(|| rng.gen()).take(20).collect())
        .take(500)
        .collect();
for i in 0..500 { x1.swap_truncate(i) }
for i in 0..500 { x1.push(&x1_insert[i]) }

无运行时依赖