Struct smallvec::SmallVec [−][src]
pub struct SmallVec<A: Array> { /* fields omitted */ }
Expand description
A Vec
-like container that can store a small number of elements inline.
SmallVec
acts like a vector, but can store a limited amount of data inline within the
SmallVec
struct rather than in a separate allocation. If the data exceeds this limit, the
SmallVec
will “spill” its data onto the heap, allocating a new buffer to hold it.
The amount of data that a SmallVec
can store inline depends on its backing store. The backing
store can be any type that implements the Array
trait; usually it is a small fixed-sized
array. For example a SmallVec<[u64; 8]>
can hold up to eight 64-bit integers inline.
Example
use smallvec::SmallVec;
let mut v = SmallVec::<[u8; 4]>::new(); // initialize an empty vector
// The vector can hold up to 4 items without spilling onto the heap.
v.extend(0..4);
assert_eq!(v.len(), 4);
assert!(!v.spilled());
// Pushing another element will force the buffer to spill:
v.push(4);
assert_eq!(v.len(), 5);
assert!(v.spilled());
Implementations
Construct an empty vector
Construct an empty vector with enough capacity pre-allocated to store at least n
elements.
Will create a heap allocation only if n
is larger than the inline capacity.
let v: SmallVec<[u8; 3]> = SmallVec::with_capacity(100);
assert!(v.is_empty());
assert!(v.capacity() >= 100);
Construct a new SmallVec
from a Vec<A::Item>
.
Elements will be copied to the inline buffer if vec.capacity() <= A::size().
use smallvec::SmallVec;
let vec = vec![1, 2, 3, 4, 5];
let small_vec: SmallVec<[_; 3]> = SmallVec::from_vec(vec);
assert_eq!(&*small_vec, &[1, 2, 3, 4, 5]);
Constructs a new SmallVec
on the stack from an A
without
copying elements.
use smallvec::SmallVec;
let buf = [1, 2, 3, 4, 5];
let small_vec: SmallVec<_> = SmallVec::from_buf(buf);
assert_eq!(&*small_vec, &[1, 2, 3, 4, 5]);
Constructs a new SmallVec
on the stack from an A
without
copying elements. Also sets the length, which must be less or
equal to the size of buf
.
use smallvec::SmallVec;
let buf = [1, 2, 3, 4, 5, 0, 0, 0];
let small_vec: SmallVec<_> = SmallVec::from_buf_and_len(buf, 5);
assert_eq!(&*small_vec, &[1, 2, 3, 4, 5]);
Constructs a new SmallVec
on the stack from an A
without
copying elements. Also sets the length. The user is responsible
for ensuring that len <= A::size()
.
use smallvec::SmallVec;
let buf = [1, 2, 3, 4, 5, 0, 0, 0];
let small_vec: SmallVec<_> = unsafe {
SmallVec::from_buf_and_len_unchecked(buf, 5)
};
assert_eq!(&*small_vec, &[1, 2, 3, 4, 5]);
Sets the length of a vector.
This will explicitly set the size of the vector, without actually modifying its buffers, so it is up to the caller to ensure that the vector is actually the specified size.
The maximum number of elements this vector can hold inline
Returns true
if the data has spilled into a separate heap-allocated buffer.
Empty the vector and return an iterator over its former contents.
Remove an item from the end of the vector and return it, or None if empty.
Re-allocate to set the capacity to max(new_cap, inline_size())
.
Panics if new_cap
is less than the vector’s length.
Reserve capacity for additional
more elements to be inserted.
May reserve more space to avoid frequent reallocations.
If the new capacity would overflow usize
then it will be set to usize::max_value()
instead. (This means that inserting additional
new elements is not guaranteed to be
possible after calling this function.)
Reserve the minimum capacity for additional
more elements to be inserted.
Panics if the new capacity overflows usize
.
Shrink the capacity of the vector as much as possible.
When possible, this will move data from an external heap buffer to the vector’s inline storage.
Shorten the vector, keeping the first len
elements and dropping the rest.
If len
is greater than or equal to the vector’s current length, this has no
effect.
This does not re-allocate. If you want the vector’s capacity to shrink, call
shrink_to_fit
after truncating.
Extracts a slice containing the entire vector.
Equivalent to &s[..]
.
Extracts a mutable slice of the entire vector.
Equivalent to &mut s[..]
.
Remove the element at position index
, replacing it with the last element.
This does not preserve ordering, but is O(1).
Panics if index
is out of bounds.
Remove and return the element at position index
, shifting all elements after it to the
left.
Panics if index
is out of bounds.
Insert an element at position index
, shifting all elements after it to the right.
Panics if index
is out of bounds.
Insert multiple elements at position index
, shifting all following elements toward the
back.
Convert a SmallVec to a Vec, without reallocating if the SmallVec has already spilled onto the heap.
Convert the SmallVec into an A
if possible. Otherwise return Err(Self)
.
This method returns Err(Self)
if the SmallVec is too short (and the A
contains uninitialized elements),
or if the SmallVec is too long (and all the elements were spilled to the heap).
Retains only the elements specified by the predicate.
In other words, remove all elements e
such that f(&e)
returns false
.
This method operates in place and preserves the order of the retained
elements.
Removes consecutive duplicate elements.
Removes consecutive duplicate elements using the given equality relation.
pub fn dedup_by_key<F, K>(&mut self, key: F) where
F: FnMut(&mut A::Item) -> K,
K: PartialEq<K>,
pub fn dedup_by_key<F, K>(&mut self, key: F) where
F: FnMut(&mut A::Item) -> K,
K: PartialEq<K>,
Removes consecutive elements that map to the same key.
Creates a SmallVec
directly from the raw components of another
SmallVec
.
Safety
This is highly unsafe, due to the number of invariants that aren’t checked:
ptr
needs to have been previously allocated viaSmallVec
for its spilled storage (at least, it’s highly likely to be incorrect if it wasn’t).ptr
’sA::Item
type needs to be the same size and alignment that it was allocated withlength
needs to be less than or equal tocapacity
.capacity
needs to be the capacity that the pointer was allocated with.
Violating these may cause problems like corrupting the allocator’s internal data structures.
Additionally, capacity
must be greater than the amount of inline
storage A
has; that is, the new SmallVec
must need to spill over
into heap allocated storage. This condition is asserted against.
The ownership of ptr
is effectively transferred to the
SmallVec
which may then deallocate, reallocate or change the
contents of memory pointed to by the pointer at will. Ensure
that nothing else uses the pointer after calling this
function.
Examples
use std::mem;
use std::ptr;
fn main() {
let mut v: SmallVec<[_; 1]> = smallvec![1, 2, 3];
// Pull out the important parts of `v`.
let p = v.as_mut_ptr();
let len = v.len();
let cap = v.capacity();
let spilled = v.spilled();
unsafe {
// Forget all about `v`. The heap allocation that stored the
// three values won't be deallocated.
mem::forget(v);
// Overwrite memory with [4, 5, 6].
//
// This is only safe if `spilled` is true! Otherwise, we are
// writing into the old `SmallVec`'s inline storage on the
// stack.
assert!(spilled);
for i in 0..len as isize {
ptr::write(p.offset(i), 4 + i);
}
// Put everything back together into a SmallVec with a different
// amount of inline storage, but which is still less than `cap`.
let rebuilt = SmallVec::<[_; 2]>::from_raw_parts(p, len, cap);
assert_eq!(&*rebuilt, &[4, 5, 6]);
}
}
Copy the elements from a slice into a new SmallVec
.
For slices of Copy
types, this is more efficient than SmallVec::from(slice)
.
Copy elements from a slice into the vector at position index
, shifting any following
elements toward the back.
For slices of Copy
types, this is more efficient than insert
.
Copy elements from a slice and append them to the vector.
For slices of Copy
types, this is more efficient than extend
.
Resizes the vector so that its length is equal to len
.
If len
is less than the current length, the vector simply truncated.
If len
is greater than the current length, value
is appended to the
vector until its length equals len
.
Trait Implementations
Extends a collection with the contents of an iterator. Read more
extend_one
)Extends a collection with exactly one element.
extend_one
)Reserves capacity in a collection for the given number of additional elements. Read more
Extends a collection from a slice of its element type
This method returns an ordering between self
and other
values if one exists. Read more
This method tests less than (for self
and other
) and is used by the <
operator. Read more
This method tests less than or equal to (for self
and other
) and is used by the <=
operator. Read more
This method tests greater than (for self
and other
) and is used by the >
operator. Read more
Write a buffer into this writer, returning how many bytes were written. Read more
Attempts to write an entire buffer into this writer. Read more
Flush this output stream, ensuring that all intermediately buffered contents reach their destination. Read more
can_vector
)Determines if this Write
r has an efficient write_vectored
implementation. Read more
write_all_vectored
)Attempts to write multiple buffers into this writer. Read more
Writes a formatted string into this writer, returning any error encountered. Read more
Auto Trait Implementations
impl<A> RefUnwindSafe for SmallVec<A> where
A: RefUnwindSafe,
<A as Array>::Item: RefUnwindSafe,
impl<A> UnwindSafe for SmallVec<A> where
A: UnwindSafe,
<A as Array>::Item: RefUnwindSafe,
Blanket Implementations
Mutably borrows from an owned value. Read more