2次发布
0.1.1 | 2021年7月24日 |
---|---|
0.1.0 | 2021年7月24日 |
1884 in 数据结构
6KB
69 行
环形向量
这提供了一个名为CircularVec的结构体。它是一个固定长度的Vec,提供了一个next
函数,该函数遍历vec。当它到达末尾时,而不是返回None,我们只是循环回到开始。
注意:这个结构体可能需要很多改进。虽然我确实需要这个结构体,并且我将其用于个人项目,这也是为了熟悉在crates.io上发布crate。以下列出了许多可以改进的方法。
未来工作
- 这可能不如它可能的那样高效。我们使用Vec作为内部,它可以增长,但我们不需要。
- 我们可以导出一个可以更改大小的版本。收缩语义待定。
- 这没有实现它可能实现的多个性能。请参见Vec实现的性能以获取灵感。
- API可能需要一些改进,比如将其暴露为迭代器而不是提供
next
函数。 - 可能还有很多。
lib.rs
:
这个结构体维护一个固定长度的环形Vec。你可以在初始化时提供环形Vec的项,然后永远不能改变包含的项的数量。它提供了一个next
函数,当它到达结构体的末尾时,只是循环回到开始。
CircularVec允许使用next_mut
函数就地更改包含的项,尽管对于大多数情况来说,只使用next
就足够了。要调用这些函数之一,你必须有一个CircularVec的 mutable 引用,以便它可以增加其内部计数器。
值得注意的是,CircularVec没有实现IntoIterator
,因为这会产生一个永远不会结束的迭代器,这与IntoIterator
的本意不符。因此,这里的next
函数不返回项目(T
),而是返回其引用(&T
),并且返回的是&T
而不是Option<&T>
,因为总会有一个项目可以返回。
示例用法
let mut cv: CircularVec<String> = ["hello".to_string(), "world".to_string()]
.to_vec()
.into_iter()
.collect();
assert_eq!(cv.next(), "hello");
assert_eq!(cv.next(), "world");
assert_eq!(cv.next(), "hello");
assert_eq!(cv.next(), "world");