1 unstable release
0.1.0 | Jan 7, 2021 |
---|
#337 in No standard library
1,405 downloads per month
Used in 6 crates
(2 directly)
19KB
270 lines
vecrem
Cursor-like helper which allows removing elements from vector without moving the tail every time.
[dependencies]
vecrem = "0.1"
Compiler support: requires rustc 1.36+
lib.rs
:
Cursor-like helper which allows removing elements from vector without moving the tail every time.
Vec::remove
comparison
If you'll use common Vec::remove
to remove only some elements starting
from the head, you'll have bad times because it will copy a lot of elements:
vec's memory: [0, 1, 2, 3, 4]
> vec.remove(0);
vec's memory: [-, 1, 2, 3, 4]
vec's memory: [1, 2, 3, 4, -] // copy of 4 elements (the whole tail)
> vec.remove(1);
vec's memory: [1, -, 3, 4, -]
vec's memory: [1, 3, 4, -, -] // copy of 2 elements
> vec.remove(2);
vec's memory: [1, 3, -, -, -]
Whereas Removing
uses swap
s:
vec's memory: [0, 1, 2, 3, 4]
rem's ptr: ^
> let rem = vec.removing();
> rem.next().unwrap().remove();
vec's memory: [-, 1, 2, 3, 4]
rem's ptr: ^
> rem.next().unwrap();
vec's memory: [1, -, 2, 3, 4] // one copy of 1
rem's ptr: ^
> rem.next().unwrap().remove();
vec's memory: [1, -, -, 3, 4]
rem's ptr: ^
> rem.next().unwrap();
vec's memory: [1, 3, -, -, 4] // one copy of 3
rem's ptr: ^
> rem.next().unwrap().remove();
vec's memory: [1, 3, -, -, -]
no_std support
This crate supports #![no_std]
but requires alloc
(we are working with
vec after all)