vec_vec

Crates.iovec_vec
lib.rsvec_vec
version0.5.1
sourcesrc
created_at2023-10-17 00:36:59.873247
updated_at2023-10-24 22:42:58.775542
descriptionWhen dealing with `Vec>` is unavoidable.
homepage
repositoryhttps://github.com/JohnScience/vec_vec
max_upload_size
id1005393
size20,529
Dmitrii - Demenev (JohnScience)

documentation

https://docs.rs/vec_vec

README

Utilities for the nested vector

Crates.io Downloads Documentation License Dependency Status

If you think of using is crate, think again. Generally speaking, Vec<Vec<T>> is an antipattern because it is not contiguous -> not cache friendly -> slow. Nearly always, for the buffer you can and should use a newtype arround small_vec::SmallVec or Vec<T>, if possible. For example, if you have a dynamically-sized matrix, you should use the chosen contiguous buffer and maybe some data for dimensions.

However, if you believe that you have a legitimate use case for a nested vector, this crate provides a PoppingIterator, LendingIter, and LendingIterMut that you might want to use.

Example

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());
}

Also see

  • stack-trait for the stack trait with entry API, which is useful to avoid the limitations of the pre-Polonius NLL borrow checker.
Commit count: 9

cargo fmt