36个版本 (22个稳定版本)
新 3.5.0 | 2024年8月22日 |
---|---|
3.2.0 | 2024年7月25日 |
2.12.0 | 2024年6月28日 |
2.6.0 | 2024年3月24日 |
0.4.3 | 2023年9月8日 |
#925 在 数据结构
每月2,636次下载
用于 11 crates
79KB
1.5K SLoC
orx-pinned-vec
PinnedVec
trait定义了向量的接口,保证向量化元素除非明确更改,否则都会固定在其内存位置。
A. 元素固定保证
PinnedVec
保证了其元素的位置不会隐式改变。
具体来说,假设一个固定的向量化当前有n
个元素
方法 | 预期行为 |
---|---|
push(new_element) |
不改变前n 个元素的内存位置 |
extend_from_slice(slice) |
不改变前n 个元素的内存位置 |
insert(a,new_element) |
不改变前a 个元素的内存位置,其中a <= n ;插入元素右侧的元素可能会改变,通常向右移动 |
pop() |
不改变前n-1 个元素的内存位置,第n 个元素被移除 |
remove(a) |
不改变前a 个元素的内存位置,其中a < n ;移除元素右侧的元素可能会改变,通常向左移动 |
truncate(a) |
不改变前a 个元素的内存位置,其中a < n |
PinnedVec
trait本身不能提供元素固定的保证;因此,它可以被认为是一个标记trait。
然而,此crate还提供了测试函数以断言这些保证
pub fn test_pinned_vec<P: PinnedVec<usize>>(pinned_vec: P, test_vec_len: usize) {
// ...
}
此函数对特定实现P
进行广泛的测试,如果上述任何保证没有得到满足,则会失败。
请注意,std::vec::Vec
在增长期间不提供固定元素保证。您可能会找到一个包装结构体JustVec
,它实际上就是标准vec:[源代码](https://github.com/orxfun/orx-pinned-vec/blob/main/src/pinned_vec_tests/test_all.rs)。正如预期的那样,test_pinned_vec
方法对这个结构体失败了。
B. 动机
在许多情况下,固定元素都是至关重要的。
- 它对于启用高效、方便且安全的自引用集合至关重要,使用瘦引用,请参阅
SelfRefCol
获取详细信息,以及其特殊情况,例如LinkedList
。 - 对于并发程序来说非常重要,因为它消除了与元素隐式带到不同内存位置相关的安全问题。这有助于减少和解决并发复杂性,并导致高效的并发数据结构。请参阅
ConcurrentIter
、ConcurrentBag
或ConcurrentOrderedBag
,这些并发数据结构是建立在固定向量固定元素保证之上的。 - 它对于允许一个不可变的推送向量至关重要;即
ImpVec
。当所需的集合是一个事物袋或容器而不是具有集体意义时,这是一个非常有用的操作。在这种情况下,ImpVec
允许避免某些借用检查复杂性、堆分配和宽指针,如Box
或Rc
等。
C. 实现
许可证
此库根据MIT许可证授权。有关详细信息,请参阅LICENSE。