#pinned #container #vec #bag #split #linked-list

orx-imp-vec

ImpVec(不可变推送向量👿),是一种允许使用共享引用添加元素的数据结构

36个版本 (11个稳定版)

2.6.0 2024年8月12日
2.5.0 2024年7月25日
2.4.0 2024年6月15日
2.0.2 2024年3月5日
0.9.7 2023年9月10日

数据结构 中排名 1579

Download history 146/week @ 2024-05-06 140/week @ 2024-05-13 17/week @ 2024-05-20 192/week @ 2024-06-10 26/week @ 2024-06-17 16/week @ 2024-07-01 50/week @ 2024-07-08 71/week @ 2024-07-15 120/week @ 2024-07-22 38/week @ 2024-07-29 120/week @ 2024-08-12

每月下载 278

MIT协议

27KB
205

orx-imp-vec

orx-imp-vec crate orx-imp-vec documentation

ImpVec(不可变推送向量👿),是一种允许使用共享引用添加元素的数据结构。

具体来说,它通过以下两个方法扩展了向量的功能

  • fn imp_push(&self, value:T)
  • fn imp_extend_from_slice(&self, slice: &[T])

注意,这两个方法都可以使用 &self 而不是 &mut self 来调用。

动机

使用共享引用向向量添加元素听起来不太寻常,确实是这样的。然而,如果我们把向量看作是事物的袋子或容器,而不是有集体意义的东西;那么,在向量的末尾添加元素或元素

  • 不会改变任何已添加的元素,因此,
  • 它并不比在作用域内创建新元素不同.

安全性

我们自然期望向向量添加元素不会影响已添加的元素。然而,由于底层内存管理,这通常不是情况。例如,std::vec::Vec 可能将已添加的元素移动到不同的内存位置,以保持向量的连续布局。

PinnedVec 阻止这种隐式改变内存位置。它保证推送和扩展方法保持已添加元素的内存位置不变。因此,在添加元素时保留对向量的引用是完全安全的。

考虑以下经典示例,它通常用于强调Rust的安全性保证,该示例无法编译

let mut vec = vec![0, 1, 2, 3];

let ref_to_first = &vec[0];
assert_eq!(ref_to_first, &0);

vec.push(4);

// does not compile due to the following reason:  cannot borrow `vec` as mutable because it is also borrowed as immutable
// assert_eq!(ref_to_first, &0);

Rust借检器的这个受欢迎的特性对于 ImpVecimp_pushimp_extend_from_slice 方法不是必需的,也不使用,因为这些方法不需要 &mut self 引用。因此,以下代码可以完美编译并安全运行。

use orx_imp_vec::prelude::*;

let mut vec = ImpVec::new();
vec.extend_from_slice(&[0, 1, 2, 3]);

let ref_to_first = &vec[0];
assert_eq!(ref_to_first, &0);

vec.imp_push(4);
assert_eq!(vec.len(), 5);

vec.imp_extend_from_slice(&[6, 7]);
assert_eq!(vec.len(), 7);

assert_eq!(ref_to_first, &0);

贡献

欢迎贡献!如果您发现错误、有问题或者认为某些地方可以改进,请打开一个 问题 或者创建一个 PR。

许可证

此库采用 MIT 许可证。详情请见 LICENSE。

依赖项

~415KB