7 个版本 (4 个破坏性版本)
0.5.1 | 2023 年 10 月 24 日 |
---|---|
0.5.0 | 2023 年 10 月 24 日 |
0.4.1 | 2023 年 10 月 20 日 |
0.3.0 | 2023 年 10 月 20 日 |
0.1.0 | 2023 年 10 月 17 日 |
#884 在 Rust 模式
每月 54 次下载
20KB
364 行
嵌套向量的工具
如果你认为需要使用这个 crate,再考虑一下。一般来说,Vec<Vec<T>>
是一种反模式,因为它不是连续的 -> 不是缓存友好的 -> 慢。几乎总是,对于缓冲区,你可以并应该使用一个 small_vec::SmallVec
或 Vec<T>
,如果可能的话。例如,如果你有一个动态大小的矩阵,你应该使用所选的连续缓冲区以及可能的一些维度数据。
然而,如果你认为你有使用嵌套向量的合法用例,这个 crate 提供了你可能想要使用的 PoppingIterator
,LendingIter
和 LendingIterMut
。
示例
use vec_vec::VecVecExt;
fn main() {
let mut v = vec![vec![2, 3, 5], vec![], vec![7, 11, 13]];
let mut iter = v.popping_iter();
assert_eq!(iter.next(), Some(13));
drop(iter);
assert_eq!(v, vec![vec![2, 3, 5], vec![], vec![7, 11]]);
let mut iter = v.popping_iter();
assert_eq!(iter.next(), Some(11));
assert_eq!(iter.container(), &vec![vec![2, 3, 5], vec![], vec![7]]);
assert_eq!(iter.next(), Some(7));
assert_eq!(iter.container(), &vec![vec![2, 3, 5], vec![], vec![]]);
assert_eq!(iter.next(), Some(5));
assert_eq!(iter.container(), &vec![vec![2, 3]]);
assert_eq!(iter.next(), Some(3));
assert_eq!(iter.container(), &vec![vec![2]]);
assert_eq!(iter.next(), Some(2));
assert_eq!(iter.container(), &vec![vec![]]);
assert_eq!(iter.next(), None);
assert_eq!(iter.container(), &Vec::<Vec<_>>::new());
}
另请参阅
stack-trait
,它提供了带有入口 API 的栈 trait,这对于避免预 Polonius NLL 借用检查器的限制很有用。
依赖关系
~1.5MB
~37K SLoC