#fixed-length #vec #next #circular #io #iterator #items

circular_vec

一个固定长度的向量,提供了无限循环的next函数

2次发布

0.1.1 2021年7月24日
0.1.0 2021年7月24日

1884 in 数据结构

MIT 许可证

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");

无运行时依赖