Professional Documents
Culture Documents
Vec in std__vec - Rust
Vec in std__vec - Rust
Examples
assert_eq!(vec.len(), 2);
assert_eq!(vec[0], 1);
assert_eq!(vec.pop(), Some(2));
assert_eq!(vec.len(), 1);
vec[0] = 7;
assert_eq!(vec[0], 7);
vec.extend([1, 2, 3]);
for x in &vec {
println!("{x}");
}
assert_eq!(vec, [7, 1, 2, 3]);
It can also initialize each element of a Vec<T> with a given value. This may be more efficient than performing allocation and
initialization in separate steps, especially when initializing a vector of zeros:
Indexing
The Vec type allows access to values by index, because it implements the Index trait. An example will be more explicit:
However be careful: if you try to access an index which isn’t in the Vec , your software will panic! You cannot do this:
Use get and get_mut if you want to check whether the index is in the Vec .
Slicing
A Vec can be mutable. On the other hand, slices are read-only objects. To get a slice, use & . Example:
fn read_slice(slice: &[usize]) {
// ...
}
In Rust, it’s more common to pass slices as arguments rather than vectors when you just want to provide read access. The same
goes for String and &str .
The capacity of a vector is the amount of space allocated for any future elements that will be added onto the vector. This is not to
be confused with the length of a vector, which specifies the number of actual elements within the vector. If a vector’s length
exceeds its capacity, its capacity will automatically be increased, but its elements will have to be reallocated.
For example, a vector with capacity 10 and length 0 would be an empty vector with space for 10 more elements. Pushing 10 or
fewer elements onto the vector will not change its capacity or cause reallocation to occur. However, if the vector’s length is
increased to 11, it will have to reallocate, which can be slow. For this reason, it is recommended to use Vec::with_capacity
whenever possible to specify how big the vector is expected to get.
Guarantees
Due to its incredibly fundamental nature, Vec makes a lot of guarantees about its design. This ensures that it’s as low-overhead
as possible in the general case, and can be correctly manipulated in primitive ways by unsafe code. Note that these guarantees
refer to an unqualified Vec<T> . If additional type parameters are added (e.g., to support custom allocators), overriding their
defaults may change the behavior.
Most fundamentally, Vec is and always will be a (pointer, capacity, length) triplet. No more, no less. The order of these fields is
completely unspecified, and you should use the appropriate methods to modify these. The pointer will never be null, so this
type is null-pointer-optimized.
However, the pointer might not actually point to allocated memory. In particular, if you construct a Vec with capacity 0 via
Vec::new , vec![] , Vec::with_capacity(0) , or by calling shrink_to_fit on an empty Vec, it will not allocate
memory. Similarly, if you store zero-sized types inside a Vec , it will not allocate space for them. Note that in this case the Vec
might not report a capacity of 0. Vec will allocate if and only if mem::size_of::<T>() * capacity() > 0 . In general,
Vec ’s allocation details are very subtle — if you intend to allocate memory using a Vec and use it for something else (either to
pass to unsafe code, or to build your own memory-backed collection), be sure to deallocate this memory by using
from_raw_parts to recover the Vec and then dropping it.
If a Vec has allocated memory, then the memory it points to is on the heap (as defined by the allocator Rust is configured to use
by default), and its pointer points to len initialized, contiguous elements in order (what you would see if you coerced it to a
slice), followed by capacity - len logically uninitialized, contiguous elements.
A vector containing the elements 'a' and 'b' with capacity 4 can be visualized as below. The top part is the Vec struct, it
contains a pointer to the head of the allocation in the heap, length and capacity. The bottom part is the allocation on the heap, a
contiguous memory block.
Vec will never perform a “small optimization” where elements are actually stored on the stack for two reasons:
It would make it more difficult for unsafe code to correctly manipulate a Vec . The contents of a Vec wouldn’t have a stable
address if it were only moved, and it would be more difficult to determine if a Vec had actually allocated memory.
It would penalize the general case, incurring an additional branch on every access.
Vec will never automatically shrink itself, even if completely empty. This ensures no unnecessary allocations or deallocations
occur. Emptying a Vec and then filling it back up to the same len should incur no calls to the allocator. If you wish to free up
unused memory, use shrink_to_fit or shrink_to .
push and insert will never (re)allocate if the reported capacity is sufficient. push and insert will (re)allocate if len ==
capacity . That is, the reported capacity is completely accurate, and can be relied on. It can even be used to manually free the
memory allocated by a Vec if desired. Bulk insertion methods may reallocate, even when not necessary.
Vec does not guarantee any particular growth strategy when reallocating when full, nor when reserve is called. The current
strategy is basic and it may prove desirable to use a non-constant growth factor. Whatever strategy is used will of course
guarantee O(1) amortized push .
vec![x; n] , vec![a, b, c, d] , and Vec::with_capacity(n) , will all produce a Vec with exactly the requested
capacity. If len == capacity , (as is the case for the vec! macro), then a Vec<T> can be converted to and from a
Box<[T]> without reallocating or moving the elements.
Vec will not specifically overwrite any data that is removed from it, but also won’t specifically preserve it. Its uninitialized
memory is scratch space that it may use however it wants. It will generally just do whatever is most efficient or otherwise easy to
implement. Do not rely on removed data to be erased for security purposes. Even if you drop a Vec , its buffer may simply be
reused by another allocation. Even if you zero a Vec ’s memory first, that might not actually happen because the optimizer does
not consider this a side-effect that must be preserved. There is one case which we will not break, however: using unsafe code
to write to the excess capacity, and then increasing the length to match, is always valid.
Currently, Vec does not guarantee the order in which elements are dropped. The order has changed in the past and may change
again.
Implementations
impl<T> Vec<T>
The vector will not allocate until elements are pushed onto it.
Examples
The vector will be able to hold at least capacity elements without reallocating. This method is allowed to allocate for more
elements than capacity . If capacity is 0, the vector will not allocate.
It is important to note that although the returned vector has the minimum capacity specified, the vector will have a zero length.
For an explanation of the difference between length and capacity, see Capacity and reallocation.
If it is important to know the exact allocated capacity of a Vec , always use the capacity method after construction.
For Vec<T> where T is a zero-sized type, there will be no allocation and the capacity will always be usize::MAX .
Panics
Panics if the new capacity exceeds isize::MAX bytes.
Examples
// The vector contains no items, even though it has capacity for more
assert_eq!(vec.len(), 0);
assert!(vec.capacity() >= 10);
Safety
This is highly unsafe, due to the number of invariants that aren’t checked:
ptr must have been allocated using the global allocator, such as via the alloc::alloc function.
T needs to have the same alignment as what ptr was allocated with. ( T having a less strict alignment is not sufficient, the
alignment really needs to be equal to satisfy the dealloc requirement that memory must be allocated and deallocated with
the same layout.)
The size of T times the capacity (ie. the allocated size in bytes) needs to be the same size as the pointer was allocated
with. (Because similar to alignment, dealloc must be called with the same layout size .)
length needs to be less than or equal to capacity .
The first length values must be properly initialized values of type T .
capacity needs to be the capacity that the pointer was allocated with.
The allocated size in bytes must be no larger than isize::MAX . See the safety documentation of pointer::offset .
These requirements are always upheld by any ptr that has been allocated via Vec<T> . Other allocation sources are allowed if
the invariants are upheld.
Violating these may cause problems like corrupting the allocator’s internal data structures. For example it is normally not safe
to build a Vec<u8> from a pointer to a C char array with length size_t , doing so is only safe if the array was initially
allocated by a Vec or String . It’s also not safe to build one from a Vec<u16> and its length, because the allocator cares about
the alignment, and these two types have different alignments. The buffer was allocated with alignment 2 (for u16 ), but after
turning it into a Vec<u8> it’ll be deallocated with alignment 1. To avoid these issues, it is often preferable to do
casting/transmuting using slice::from_raw_parts instead.
The ownership of ptr is effectively transferred to the Vec<T> 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::ptr;
use std::mem;
unsafe {
// Overwrite memory with 4, 5, 6
for i in 0..len {
ptr::write(p.add(i), 4 + i);
}
fn main() {
let layout = Layout::array::<u32>(16).expect("overflow cannot happen");
mem.write(1_000_000);
Vec::from_raw_parts(mem, 1, 16)
};
assert_eq!(vec, &[1_000_000]);
assert_eq!(vec.capacity(), 16);
}
The vector will not allocate until elements are pushed onto it.
Examples
#![feature(allocator_api)]
use std::alloc::System;
Constructs a new, empty Vec<T, A> with at least the specified capacity with the provided allocator.
The vector will be able to hold at least capacity elements without reallocating. This method is allowed to allocate for more
elements than capacity . If capacity is 0, the vector will not allocate.
It is important to note that although the returned vector has the minimum capacity specified, the vector will have a zero length.
For an explanation of the difference between length and capacity, see Capacity and reallocation.
If it is important to know the exact allocated capacity of a Vec , always use the capacity method after construction.
For Vec<T, A> where T is a zero-sized type, there will be no allocation and the capacity will always be usize::MAX .
Panics
Panics if the new capacity exceeds isize::MAX bytes.
Examples
#![feature(allocator_api)]
use std::alloc::System;
// The vector contains no items, even though it has capacity for more
assert_eq!(vec.len(), 0);
assert!(vec.capacity() >= 10);
Creates a Vec<T, A> directly from a pointer, a capacity, a length, and an allocator.
Safety
This is highly unsafe, due to the number of invariants that aren’t checked:
These requirements are always upheld by any ptr that has been allocated via Vec<T, A> . Other allocation sources are
allowed if the invariants are upheld.
Violating these may cause problems like corrupting the allocator’s internal data structures. For example it is not safe to build a
Vec<u8> from a pointer to a C char array with length size_t . It’s also not safe to build one from a Vec<u16> and its length,
because the allocator cares about the alignment, and these two types have different alignments. The buffer was allocated with
alignment 2 (for u16 ), but after turning it into a Vec<u8> it’ll be deallocated with alignment 1.
The ownership of ptr is effectively transferred to the Vec<T> 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
#![feature(allocator_api)]
use std::alloc::System;
use std::ptr;
use std::mem;
unsafe {
// Overwrite memory with 4, 5, 6
for i in 0..len {
ptr::write(p.add(i), 4 + i);
}
#![feature(allocator_api)]
fn main() {
let layout = Layout::array::<u32>(16).expect("overflow cannot happen");
mem.write(1_000_000);
assert_eq!(vec, &[1_000_000]);
assert_eq!(vec.capacity(), 16);
}
Returns the raw pointer to the underlying data, the length of the vector (in elements), and the allocated capacity of the data (in
elements). These are the same arguments in the same order as the arguments to from_raw_parts .
After calling this function, the caller is responsible for the memory previously managed by the Vec . The only way to do this is
to convert the raw pointer, length, and capacity back into a Vec with the from_raw_parts function, allowing the destructor
to perform the cleanup.
Examples
#![feature(vec_into_raw_parts)]
let v: Vec<i32> = vec![-1, 0, 1];
Returns the raw pointer to the underlying data, the length of the vector (in elements), the allocated capacity of the data (in
elements), and the allocator. These are the same arguments in the same order as the arguments to from_raw_parts_in .
After calling this function, the caller is responsible for the memory previously managed by the Vec . The only way to do this is
to convert the raw pointer, length, and capacity back into a Vec with the from_raw_parts_in function, allowing the
destructor to perform the cleanup.
Examples
#![feature(allocator_api, vec_into_raw_parts)]
use std::alloc::System;
Returns the total number of elements the vector can hold without reallocating.
Examples
Reserves capacity for at least additional more elements to be inserted in the given Vec<T> . The collection may reserve
more space to speculatively avoid frequent reallocations. After calling reserve , capacity will be greater than or equal to
self.len() + additional . Does nothing if capacity is already sufficient.
Panics
Panics if the new capacity exceeds isize::MAX bytes.
Examples
Reserves the minimum capacity for at least additional more elements to be inserted in the given Vec<T> . Unlike reserve ,
this will not deliberately over-allocate to speculatively avoid frequent allocations. After calling reserve_exact , capacity will
be greater than or equal to self.len() + additional . Does nothing if the capacity is already sufficient.
Note that the allocator may give the collection more space than it requests. Therefore, capacity can not be relied upon to be
precisely minimal. Prefer reserve if future insertions are expected.
Panics
Panics if the new capacity exceeds isize::MAX bytes.
Examples
Tries to reserve capacity for at least additional more elements to be inserted in the given Vec<T> . The collection may
reserve more space to speculatively avoid frequent reallocations. After calling try_reserve , capacity will be greater than or
equal to self.len() + additional if it returns Ok(()) . Does nothing if capacity is already sufficient. This method
preserves the contents even if an error occurs.
Errors
If the capacity overflows, or the allocator reports a failure, then an error is returned.
Examples
use std::collections::TryReserveError;
// Now we know this can't OOM in the middle of our complex work
output.extend(data.iter().map(|&val| {
val * 2 + 5 // very complicated
}));
Ok(output)
}
Tries to reserve the minimum capacity for at least additional elements to be inserted in the given Vec<T> . Unlike
try_reserve , this will not deliberately over-allocate to speculatively avoid frequent allocations. After calling
try_reserve_exact , capacity will be greater than or equal to self.len() + additional if it returns Ok(()) . Does
nothing if the capacity is already sufficient.
Note that the allocator may give the collection more space than it requests. Therefore, capacity can not be relied upon to be
precisely minimal. Prefer try_reserve if future insertions are expected.
Errors
If the capacity overflows, or the allocator reports a failure, then an error is returned.
Examples
use std::collections::TryReserveError;
// Now we know this can't OOM in the middle of our complex work
output.extend(data.iter().map(|&val| {
val * 2 + 5 // very complicated
}));
Ok(output)
}
It will drop down as close as possible to the length but the allocator may still inform the vector that there is space for a few more
elements.
Examples
If the current capacity is less than the lower limit, this is a no-op.
Examples
If the vector has excess capacity, its items will be moved into a newly-allocated buffer with exactly the right capacity.
Examples
Shortens the vector, keeping the first len elements and dropping the rest.
If len is greater or equal to the vector’s current length, this has no effect.
The drain method can emulate truncate , but causes the excess elements to be returned instead of dropped.
Note that this method has no effect on the allocated capacity of the vector.
Examples
Truncating a five element vector to two elements:
No truncation occurs when len is greater than the vector’s current length:
Equivalent to &s[..] .
Examples
Examples
Returns a raw pointer to the vector’s buffer, or a dangling raw pointer valid for zero sized reads if the vector didn’t allocate.
The caller must ensure that the vector outlives the pointer this function returns, or else it will end up pointing to garbage.
Modifying the vector may cause its buffer to be reallocated, which would also make any pointers to it invalid.
The caller must also ensure that the memory the pointer (non-transitively) points to is never written to (except inside an
UnsafeCell ) using this pointer or any pointer derived from it. If you need to mutate the contents of the slice, use
as_mut_ptr .
This method guarantees that for the purpose of the aliasing model, this method does not materialize a reference to the
underlying slice, and thus the returned pointer will remain valid when mixed with other calls to as_ptr and as_mut_ptr .
Note that calling other methods that materialize mutable references to the slice, or mutable references to specific elements you
are planning on accessing through this pointer, as well as writing to those elements, may still invalidate this pointer. See the
second example below for how this guarantee can be used.
Examples
unsafe {
for i in 0..x.len() {
assert_eq!(*x_ptr.add(i), 1 << i);
}
}
Returns an unsafe mutable pointer to the vector’s buffer, or a dangling raw pointer valid for zero sized reads if the vector didn’t
allocate.
The caller must ensure that the vector outlives the pointer this function returns, or else it will end up pointing to garbage.
Modifying the vector may cause its buffer to be reallocated, which would also make any pointers to it invalid.
This method guarantees that for the purpose of the aliasing model, this method does not materialize a reference to the
underlying slice, and thus the returned pointer will remain valid when mixed with other calls to as_ptr and as_mut_ptr .
Note that calling other methods that materialize references to the slice, or references to specific elements you are planning on
accessing through this pointer, may still invalidate this pointer. See the second example below for how this guarantee can be
used.
Examples
unsafe {
let mut v = vec![0];
let ptr1 = v.as_mut_ptr();
ptr1.write(1);
let ptr2 = v.as_mut_ptr();
ptr2.write(2);
// Notably, the write to `ptr2` did *not* invalidate `ptr1`:
ptr1.write(3);
}
This is a low-level operation that maintains none of the normal invariants of the type. Normally changing the length of a vector
is done using one of the safe operations instead, such as truncate , resize , extend , or clear .
Safety
Examples
This method can be useful for situations in which the vector is serving as a buffer for other code, particularly over FFI:
While the following example is sound, there is a memory leak since the inner vectors were not freed prior to the set_len call:
Normally, here, one would use clear instead to correctly drop the contents and thus not leak memory.
This does not preserve ordering, but is O(1). If you need to preserve the element order, use remove instead.
Panics
Panics if index is out of bounds.
Examples
assert_eq!(v.swap_remove(1), "bar");
assert_eq!(v, ["foo", "qux", "baz"]);
assert_eq!(v.swap_remove(0), "foo");
assert_eq!(v, ["baz", "qux"]);
Inserts an element at position index within the vector, shifting all elements after it to the right.
Panics
Panics if index > len .
Examples
Removes and returns the element at position index within the vector, shifting all elements after it to the left.
Note: Because this shifts over the remaining elements, it has a worst-case performance of O(n). If you don’t need the order of
elements to be preserved, use swap_remove instead. If you’d like to remove elements from the beginning of the Vec , consider
using VecDeque::pop_front instead.
Panics
Panics if index is out of bounds.
Examples
In other words, remove all elements e for which f(&e) returns false . This method operates in place, visiting each element
exactly once in the original order, and preserves the order of the retained elements.
Examples
Because the elements are visited exactly once in the original order, external state may be used to decide which elements to keep.
Retains only the elements specified by the predicate, passing a mutable reference to it.
In other words, remove all elements e such that f(&mut e) returns false . This method operates in place, visiting each
element exactly once in the original order, and preserves the order of the retained elements.
Examples
Removes all but the first of consecutive elements in the vector that resolve to the same key.
Examples
vec.dedup_by_key(|i| *i / 10);
Removes all but the first of consecutive elements in the vector satisfying a given equality relation.
The same_bucket function is passed references to two elements from the vector and must determine if the elements compare
equal. The elements are passed in opposite order from their order in the slice, so if same_bucket(a, b) returns true , a is
removed.
Examples
let mut vec = vec!["foo", "bar", "Bar", "baz", "bar"];
vec.dedup_by(|a, b| a.eq_ignore_ascii_case(b));
Panics
Panics if the new capacity exceeds isize::MAX bytes.
Examples
Appends an element if there is sufficient spare capacity, otherwise an error is returned with the element.
Unlike push this method will not reallocate when there’s insufficient capacity. The caller should use reserve or
try_reserve to ensure that there is enough capacity.
Examples
A manual, panic-free alternative to FromIterator :
#![feature(vec_push_within_capacity)]
use std::collections::TryReserveError;
fn from_iter_fallible<T>(iter: impl Iterator<Item=T>) -> Result<Vec<T>, TryReserveError> {
let mut vec = Vec::new();
for value in iter {
if let Err(value) = vec.push_within_capacity(value) {
vec.try_reserve(1)?;
// this cannot fail, the previous line either returned or added at least 1 free sl
let _ = vec.push_within_capacity(value);
}
}
Ok(vec)
}
assert_eq!(from_iter_fallible(0..100), Ok(Vec::from_iter(0..100)));
Removes the last element from a vector and returns it, or None if it is empty.
If you’d like to pop the first element, consider using VecDeque::pop_front instead.
Examples
Moves all the elements of other into self , leaving other empty.
Panics
Panics if the new capacity exceeds isize::MAX bytes.
Examples
Removes the specified range from the vector in bulk, returning all removed elements as an iterator. If the iterator is dropped
before being fully consumed, it drops the remaining removed elements.
The returned iterator keeps a mutable borrow on the vector to optimize its implementation.
Panics
Panics if the starting point is greater than the end point or if the end point is greater than the length of the vector.
Leaking
If the returned iterator goes out of scope without being dropped (due to mem::forget , for example), the vector may have lost
and leaked elements arbitrarily, including elements outside the range.
Examples
Note that this method has no effect on the allocated capacity of the vector.
Examples
v.clear();
assert!(v.is_empty());
Examples
Examples
v.push(1);
assert!(!v.is_empty());
Returns a newly allocated vector containing the elements in the range [at, len) . After the call, the original vector will be left
containing the elements [0, at) with its previous capacity unchanged.
Panics
Panics if at > len .
Examples
If new_len is greater than len , the Vec is extended by the difference, with each additional slot filled with the result of calling
the closure f . The return values from f will end up in the Vec in the order they have been generated.
This method uses a closure to create new values on every push. If you’d rather Clone a given value, use Vec::resize . If you
want to use the Default trait to generate values, you can pass Default::default as the second argument.
Examples
Consumes and leaks the Vec , returning a mutable reference to the contents, &'a mut [T] . Note that the type T must outlive
the chosen lifetime 'a . If the type has only static references, or none at all, then this may be chosen to be 'static .
As of Rust 1.57, this method does not reallocate or shrink the Vec , so the leaked allocation may include unused capacity that is
not part of the returned slice.
This function is mainly useful for data that lives for the remainder of the program’s life. Dropping the returned reference will
cause a memory leak.
Examples
Simple usage:
Examples
🔬
pub fn split_at_spare_mut(&mut self) -> (&mut [T], &mut [MaybeUninit<T>])
Returns vector content as a slice of T , along with the remaining spare capacity of the vector as a slice of MaybeUninit<T> .
The returned spare capacity slice can be used to fill the vector with data (e.g. by reading from a file) before marking the data as
initialized using the set_len method.
Note that this is a low-level API, which should be used with care for optimization purposes. If you need to append data to a Vec
you can use push , extend , extend_from_slice , extend_from_within , insert , append , resize or resize_with ,
depending on your exact needs.
Examples
#![feature(vec_split_at_spare)]
If new_len is greater than len , the Vec is extended by the difference, with each additional slot filled with value . If
new_len is less than len , the Vec is simply truncated.
This method requires T to implement Clone , in order to be able to clone the passed value. If you need more flexibility (or want
to rely on Default instead of Clone ), use Vec::resize_with . If you only need to resize to a smaller size, use
Vec::truncate .
Examples
Iterates over the slice other , clones each element, and then appends it to this Vec . The other slice is traversed in-order.
Note that this function is same as extend except that it is specialized to work with slices instead. If and when Rust gets
specialization this function will likely be deprecated (but still available).
Examples
Panics
Panics if the starting point is greater than the end point or if the end point is greater than the length of the vector.
Examples
vec.extend_from_within(2..);
assert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4]);
vec.extend_from_within(..2);
assert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4, 0, 1]);
vec.extend_from_within(4..8);
assert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4, 0, 1, 4, 2, 3, 4]);
Panics
Panics if the length of the resulting vector would overflow a usize .
This is only possible when flattening a vector of arrays of zero-sized types, and thus tends to be irrelevant in practice. If
size_of::<T>() > 0 , this will never panic.
Examples
#![feature(slice_flatten)]
Removes consecutive repeated elements in the vector according to the PartialEq trait implementation.
Examples
vec.dedup();
Creates a splicing iterator that replaces the specified range in the vector with the given replace_with iterator and yields the
removed items. replace_with does not need to be the same length as range .
range is removed even if the iterator is not consumed until the end.
It is unspecified how many elements are removed from the vector if the Splice value is leaked.
The input iterator replace_with is only consumed when the Splice value is dropped.
Panics
Panics if the starting point is greater than the end point or if the end point is greater than the length of the vector.
Examples
🔬
F: FnMut(&mut T) -> bool,
If the closure returns true, then the element is removed and yielded. If the closure returns false, the element will remain in the
vector and will not be yielded by the iterator.
If the returned ExtractIf is not exhausted, e.g. because it is dropped without iterating or the iteration short-circuits, then the
remaining elements will be retained. Use retain with a negated predicate if you do not need the returned iterator.
let mut i = 0;
while i < vec.len() {
if some_predicate(&mut vec[i]) {
let val = vec.remove(i);
// your code here
} else {
i += 1;
}
}
But extract_if is easier to use. extract_if is also more efficient, because it can backshift the elements of the array in
bulk.
Note that extract_if also lets you mutate every element in the filter closure, regardless of whether you choose to keep or
remove it.
Examples
Splitting an array into evens and odds, reusing the original allocation:
#![feature(extract_if)]
let mut numbers = vec![1, 2, 3, 4, 5, 6, 8, 9, 11, 13, 14, 15];
Checks if all bytes in this slice are within the ASCII range.
🔬
pub fn as_ascii(&self) -> Option<&[AsciiChar]>
If this slice is_ascii , returns it as a slice of ASCII characters, otherwise returns None .
🔬
pub unsafe fn as_ascii_unchecked(&self) -> &[AsciiChar]
This is a nightly-only experimental API. (ascii_char #110998)
Converts this slice of bytes into a slice of ASCII characters, without checking whether they’re valid.
Safety
Every byte in the slice must be in 0..=127 , or else this is UB.
ASCII letters ‘a’ to ‘z’ are mapped to ‘A’ to ‘Z’, but non-ASCII letters are unchanged.
To return a new uppercased value without modifying the existing one, use to_ascii_uppercase .
ASCII letters ‘A’ to ‘Z’ are mapped to ‘a’ to ‘z’, but non-ASCII letters are unchanged.
To return a new lowercased value without modifying the existing one, use to_ascii_lowercase .
Examples
let s = b"0\t\r\n'\"\\\x9d";
let escaped = s.escape_ascii().to_string();
assert_eq!(escaped, "0\\t\\r\\n\\'\\\"\\\\\\x9d");
Examples
#![feature(byte_slice_trim_ascii)]
Examples
#![feature(byte_slice_trim_ascii)]
Returns a byte slice with leading and trailing ASCII whitespace bytes removed.
Examples
#![feature(byte_slice_trim_ascii)]
This sort is in-place (i.e. does not allocate), O(n * log(n)) worst-case, and uses the ordering defined by f32::total_cmp .
Current implementation
This uses the same sorting algorithm as sort_unstable_by .
Examples
#![feature(sort_floats)]
let mut v = [2.6, -5e-8, f32::NAN, 8.29, f32::INFINITY, -1.0, 0.0, -f32::INFINITY, -0.0];
v.sort_floats();
let sorted = [-f32::INFINITY, -1.0, -5e-8, -0.0, 0.0, 2.6, 8.29, f32::INFINITY, f32::NAN];
assert_eq!(&v[..8], &sorted[..8]);
assert!(v[8].is_nan());
This sort is in-place (i.e. does not allocate), O(n * log(n)) worst-case, and uses the ordering defined by f64::total_cmp .
Current implementation
This uses the same sorting algorithm as sort_unstable_by .
Examples
#![feature(sort_floats)]
let mut v = [2.6, -5e-8, f64::NAN, 8.29, f64::INFINITY, -1.0, 0.0, -f64::INFINITY, -0.0];
v.sort_floats();
let sorted = [-f64::INFINITY, -1.0, -5e-8, -0.0, 0.0, 2.6, 8.29, f64::INFINITY, f64::NAN];
assert_eq!(&v[..8], &sorted[..8]);
assert!(v[8].is_nan());
Examples
Examples
Examples
Returns a mutable pointer to the first element of the slice, or None if it is empty.
Examples
Returns the first and all the rest of the elements of the slice, or None if it is empty.
Examples
Returns the first and all the rest of the elements of the slice, or None if it is empty.
Examples
Returns the last and all the rest of the elements of the slice, or None if it is empty.
Examples
Returns the last and all the rest of the elements of the slice, or None if it is empty.
Examples
Examples
Examples
Returns the first N elements of the slice, or None if it has fewer than N elements.
Examples
#![feature(slice_first_last_chunk)]
Returns a mutable reference to the first N elements of the slice, or None if it has fewer than N elements.
Examples
#![feature(slice_first_last_chunk)]
Returns the first N elements of the slice and the remainder, or None if it has fewer than N elements.
Examples
#![feature(slice_first_last_chunk)]
Examples
#![feature(slice_first_last_chunk)]
🔬
pub fn split_last_chunk<const N: usize>(&self) -> Option<(&[T; N], &[T])>
This is a nightly-only experimental API. (slice_first_last_chunk #111774)
Returns the last N elements of the slice and the remainder, or None if it has fewer than N elements.
Examples
#![feature(slice_first_last_chunk)]
Returns the last and all the rest of the elements of the slice, or None if it is empty.
Examples
#![feature(slice_first_last_chunk)]
#![feature(slice_first_last_chunk)]
Examples
#![feature(slice_first_last_chunk)]
If given a position, returns a reference to the element at that position or None if out of bounds.
If given a range, returns the subslice corresponding to that range, or None if out of bounds.
Examples
pub fn get_mut<I>(
&mut self,
index: I
) -> Option<&mut <I as SliceIndex<[T]>>::Output>
where
I: SliceIndex<[T]>,
Returns a mutable reference to an element or subslice depending on the type of index (see get ) or None if the index is out of
bounds.
Examples
Safety
Calling this method with an out-of-bounds index is undefined behavior even if the resulting reference is not used.
You can think of this like .get(index).unwrap_unchecked() . It’s UB to call .get_unchecked(len) , even if you
immediately convert to a pointer. And it’s UB to call .get_unchecked(..len + 1) , .get_unchecked(..=len) , or
similar.
Examples
let x = &[1, 2, 4];
unsafe {
assert_eq!(x.get_unchecked(1), &2);
}
Safety
Calling this method with an out-of-bounds index is undefined behavior even if the resulting reference is not used.
You can think of this like .get_mut(index).unwrap_unchecked() . It’s UB to call .get_unchecked_mut(len) , even if
you immediately convert to a pointer. And it’s UB to call .get_unchecked_mut(..len + 1) ,
.get_unchecked_mut(..=len) , or similar.
Examples
unsafe {
let elem = x.get_unchecked_mut(1);
*elem = 13;
}
assert_eq!(x, &[1, 13, 4]);
The caller must ensure that the slice outlives the pointer this function returns, or else it will end up pointing to garbage.
The caller must also ensure that the memory the pointer (non-transitively) points to is never written to (except inside an
UnsafeCell ) using this pointer or any pointer derived from it. If you need to mutate the contents of the slice, use
as_mut_ptr .
Modifying the container referenced by this slice may cause its buffer to be reallocated, which would also make any pointers to it
invalid.
Examples
unsafe {
for i in 0..x.len() {
assert_eq!(x.get_unchecked(i), &*x_ptr.add(i));
}
}
pub fn as_mut_ptr(&mut self) -> *mut T
The caller must ensure that the slice outlives the pointer this function returns, or else it will end up pointing to garbage.
Modifying the container referenced by this slice may cause its buffer to be reallocated, which would also make any pointers to it
invalid.
Examples
unsafe {
for i in 0..x.len() {
*x_ptr.add(i) += 2;
}
}
assert_eq!(x, &[3, 4, 6]);
The returned range is half-open, which means that the end pointer points one past the last element of the slice. This way, an
empty slice is represented by two equal pointers, and the difference between the two pointers represents the size of the slice.
See as_ptr for warnings on using these pointers. The end pointer requires extra caution, as it does not point to a valid element
in the slice.
This function is useful for interacting with foreign interfaces which use two pointers to refer to a range of elements in memory,
as is common in C++.
It can also be useful to check if a pointer to an element refers to an element of this slice:
assert!(a.as_ptr_range().contains(&x));
assert!(!a.as_ptr_range().contains(&y));
The returned range is half-open, which means that the end pointer points one past the last element of the slice. This way, an
empty slice is represented by two equal pointers, and the difference between the two pointers represents the size of the slice.
See as_mut_ptr for warnings on using these pointers. The end pointer requires extra caution, as it does not point to a valid
element in the slice.
This function is useful for interacting with foreign interfaces which use two pointers to refer to a range of elements in memory,
as is common in C++.
Panics
Panics if a or b are out of bounds.
Examples
Arguments
Safety
Calling this method with an out-of-bounds index is undefined behavior. The caller has to ensure that a < self.len() and b <
self.len() .
Examples
#![feature(slice_swap_unchecked)]
Examples
Examples
Examples
Returns an iterator over all contiguous windows of length size . The windows overlap. If the slice is shorter than size , the
iterator returns no values.
Panics
Panics if size is 0.
Examples
let slice = ['l', 'o', 'r', 'e', 'm'];
let mut iter = slice.windows(3);
assert_eq!(iter.next().unwrap(), &['l', 'o', 'r']);
assert_eq!(iter.next().unwrap(), &['o', 'r', 'e']);
assert_eq!(iter.next().unwrap(), &['r', 'e', 'm']);
assert!(iter.next().is_none());
There’s no windows_mut , as that existing would let safe code violate the “only one &mut at a time to the same thing” rule.
However, you can sometimes use Cell::as_slice_of_cells in conjunction with windows to accomplish something
similar:
use std::cell::Cell;
let mut array = ['R', 'u', 's', 't', ' ', '2', '0', '1', '5'];
let slice = &mut array[..];
let slice_of_cells: &[Cell<char>] = Cell::from_mut(slice).as_slice_of_cells();
for w in slice_of_cells.windows(3) {
Cell::swap(&w[0], &w[2]);
}
assert_eq!(array, ['s', 't', ' ', '2', '0', '1', '5', 'u', 'R']);
pub fn chunks(&self, chunk_size: usize) -> Chunks<'_, T> ⓘ
Returns an iterator over chunk_size elements of the slice at a time, starting at the beginning of the slice.
The chunks are slices and do not overlap. If chunk_size does not divide the length of the slice, then the last chunk will not
have length chunk_size .
See chunks_exact for a variant of this iterator that returns chunks of always exactly chunk_size elements, and rchunks
for the same iterator but starting at the end of the slice.
Panics
Panics if chunk_size is 0.
Examples
Returns an iterator over chunk_size elements of the slice at a time, starting at the beginning of the slice.
The chunks are mutable slices, and do not overlap. If chunk_size does not divide the length of the slice, then the last chunk
will not have length chunk_size .
See chunks_exact_mut for a variant of this iterator that returns chunks of always exactly chunk_size elements, and
rchunks_mut for the same iterator but starting at the end of the slice.
Panics
Panics if chunk_size is 0.
Examples
Returns an iterator over chunk_size elements of the slice at a time, starting at the beginning of the slice.
The chunks are slices and do not overlap. If chunk_size does not divide the length of the slice, then the last up to
chunk_size-1 elements will be omitted and can be retrieved from the remainder function of the iterator.
Due to each chunk having exactly chunk_size elements, the compiler can often optimize the resulting code better than in the
case of chunks .
See chunks for a variant of this iterator that also returns the remainder as a smaller chunk, and rchunks_exact for the same
iterator but starting at the end of the slice.
Panics
Panics if chunk_size is 0.
Examples
Returns an iterator over chunk_size elements of the slice at a time, starting at the beginning of the slice.
The chunks are mutable slices, and do not overlap. If chunk_size does not divide the length of the slice, then the last up to
chunk_size-1 elements will be omitted and can be retrieved from the into_remainder function of the iterator.
Due to each chunk having exactly chunk_size elements, the compiler can often optimize the resulting code better than in the
case of chunks_mut .
See chunks_mut for a variant of this iterator that also returns the remainder as a smaller chunk, and rchunks_exact_mut
for the same iterator but starting at the end of the slice.
Panics
Panics if chunk_size is 0.
Examples
Splits the slice into a slice of N -element arrays, assuming that there’s no remainder.
Safety
This may only be called when
Examples
#![feature(slice_as_chunks)]
let slice: &[char] = &['l', 'o', 'r', 'e', 'm', '!'];
let chunks: &[[char; 1]] =
// SAFETY: 1-element chunks never have remainder
unsafe { slice.as_chunks_unchecked() };
assert_eq!(chunks, &[['l'], ['o'], ['r'], ['e'], ['m'], ['!']]);
let chunks: &[[char; 3]] =
// SAFETY: The slice length (6) is a multiple of 3
unsafe { slice.as_chunks_unchecked() };
assert_eq!(chunks, &[['l', 'o', 'r'], ['e', 'm', '!']]);
Splits the slice into a slice of N -element arrays, starting at the beginning of the slice, and a remainder slice with length strictly
less than N .
Panics
Panics if N is 0. This check will most probably get changed to a compile time error before this method gets stabilized.
Examples
#![feature(slice_as_chunks)]
let slice = ['l', 'o', 'r', 'e', 'm'];
let (chunks, remainder) = slice.as_chunks();
assert_eq!(chunks, &[['l', 'o'], ['r', 'e']]);
assert_eq!(remainder, &['m']);
If you expect the slice to be an exact multiple, you can combine let - else with an empty slice pattern:
#![feature(slice_as_chunks)]
let slice = ['R', 'u', 's', 't'];
let (chunks, []) = slice.as_chunks::<2>() else {
panic!("slice didn't have even length")
};
assert_eq!(chunks, &[['R', 'u'], ['s', 't']]);
Splits the slice into a slice of N -element arrays, starting at the end of the slice, and a remainder slice with length strictly less
than N .
Panics
Panics if N is 0. This check will most probably get changed to a compile time error before this method gets stabilized.
Examples
#![feature(slice_as_chunks)]
let slice = ['l', 'o', 'r', 'e', 'm'];
let (remainder, chunks) = slice.as_rchunks();
assert_eq!(remainder, &['l']);
assert_eq!(chunks, &[['o', 'r'], ['e', 'm']]);
The chunks are array references and do not overlap. If N does not divide the length of the slice, then the last up to N-1
elements will be omitted and can be retrieved from the remainder function of the iterator.
Panics
Panics if N is 0. This check will most probably get changed to a compile time error before this method gets stabilized.
Examples
#![feature(array_chunks)]
let slice = ['l', 'o', 'r', 'e', 'm'];
let mut iter = slice.array_chunks();
assert_eq!(iter.next().unwrap(), &['l', 'o']);
assert_eq!(iter.next().unwrap(), &['r', 'e']);
assert!(iter.next().is_none());
assert_eq!(iter.remainder(), &['m']);
Splits the slice into a slice of N -element arrays, assuming that there’s no remainder.
Safety
This may only be called when
The slice splits exactly into N -element chunks (aka self.len() % N == 0 ).
N != 0 .
Examples
#![feature(slice_as_chunks)]
let slice: &mut [char] = &mut ['l', 'o', 'r', 'e', 'm', '!'];
let chunks: &mut [[char; 1]] =
// SAFETY: 1-element chunks never have remainder
unsafe { slice.as_chunks_unchecked_mut() };
chunks[0] = ['L'];
assert_eq!(chunks, &[['L'], ['o'], ['r'], ['e'], ['m'], ['!']]);
let chunks: &mut [[char; 3]] =
// SAFETY: The slice length (6) is a multiple of 3
unsafe { slice.as_chunks_unchecked_mut() };
chunks[1] = ['a', 'x', '?'];
assert_eq!(slice, &['L', 'o', 'r', 'a', 'x', '?']);
pub fn as_chunks_mut<const N: usize>(&mut self) -> (&mut [[T; N]], &mut [T])
Splits the slice into a slice of N -element arrays, starting at the beginning of the slice, and a remainder slice with length strictly
less than N .
Panics
Panics if N is 0. This check will most probably get changed to a compile time error before this method gets stabilized.
Examples
#![feature(slice_as_chunks)]
let v = &mut [0, 0, 0, 0, 0];
let mut count = 1;
🔬
pub fn as_rchunks_mut<const N: usize>(&mut self) -> (&mut [T], &mut [[T; N]])
Splits the slice into a slice of N -element arrays, starting at the end of the slice, and a remainder slice with length strictly less
than N .
Panics
Panics if N is 0. This check will most probably get changed to a compile time error before this method gets stabilized.
Examples
#![feature(slice_as_chunks)]
let v = &mut [0, 0, 0, 0, 0];
let mut count = 1;
Returns an iterator over N elements of the slice at a time, starting at the beginning of the slice.
The chunks are mutable array references and do not overlap. If N does not divide the length of the slice, then the last up to N-1
elements will be omitted and can be retrieved from the into_remainder function of the iterator.
Panics
Panics if N is 0. This check will most probably get changed to a compile time error before this method gets stabilized.
Examples
#![feature(array_chunks)]
let v = &mut [0, 0, 0, 0, 0];
let mut count = 1;
Returns an iterator over overlapping windows of N elements of a slice, starting at the beginning of the slice.
Panics
Panics if N is 0. This check will most probably get changed to a compile time error before this method gets stabilized.
Examples
#![feature(array_windows)]
let slice = [0, 1, 2, 3];
let mut iter = slice.array_windows();
assert_eq!(iter.next().unwrap(), &[0, 1]);
assert_eq!(iter.next().unwrap(), &[1, 2]);
assert_eq!(iter.next().unwrap(), &[2, 3]);
assert!(iter.next().is_none());
pub fn rchunks(&self, chunk_size: usize) -> RChunks<'_, T> ⓘ 1.31.0 ·
Returns an iterator over chunk_size elements of the slice at a time, starting at the end of the slice.
The chunks are slices and do not overlap. If chunk_size does not divide the length of the slice, then the last chunk will not
have length chunk_size .
See rchunks_exact for a variant of this iterator that returns chunks of always exactly chunk_size elements, and chunks
for the same iterator but starting at the beginning of the slice.
Panics
Panics if chunk_size is 0.
Examples
Returns an iterator over chunk_size elements of the slice at a time, starting at the end of the slice.
The chunks are mutable slices, and do not overlap. If chunk_size does not divide the length of the slice, then the last chunk
will not have length chunk_size .
See rchunks_exact_mut for a variant of this iterator that returns chunks of always exactly chunk_size elements, and
chunks_mut for the same iterator but starting at the beginning of the slice.
Panics
Panics if chunk_size is 0.
Examples
Returns an iterator over chunk_size elements of the slice at a time, starting at the end of the slice.
The chunks are slices and do not overlap. If chunk_size does not divide the length of the slice, then the last up to
chunk_size-1 elements will be omitted and can be retrieved from the remainder function of the iterator.
Due to each chunk having exactly chunk_size elements, the compiler can often optimize the resulting code better than in the
case of rchunks .
See rchunks for a variant of this iterator that also returns the remainder as a smaller chunk, and chunks_exact for the same
iterator but starting at the beginning of the slice.
Panics
Panics if chunk_size is 0.
Examples
Returns an iterator over chunk_size elements of the slice at a time, starting at the end of the slice.
The chunks are mutable slices, and do not overlap. If chunk_size does not divide the length of the slice, then the last up to
chunk_size-1 elements will be omitted and can be retrieved from the into_remainder function of the iterator.
Due to each chunk having exactly chunk_size elements, the compiler can often optimize the resulting code better than in the
case of chunks_mut .
See rchunks_mut for a variant of this iterator that also returns the remainder as a smaller chunk, and chunks_exact_mut
for the same iterator but starting at the beginning of the slice.
Panics
Panics if chunk_size is 0.
Examples
🔬
F: FnMut(&T, &T) -> bool,
Returns an iterator over the slice producing non-overlapping runs of elements using the predicate to separate them.
The predicate is called on two elements following themselves, it means the predicate is called on slice[0] and slice[1]
then on slice[1] and slice[2] and so on.
Examples
#![feature(slice_group_by)]
#![feature(slice_group_by)]
🔬
F: FnMut(&T, &T) -> bool,
Returns an iterator over the slice producing non-overlapping mutable runs of elements using the predicate to separate them.
The predicate is called on two elements following themselves, it means the predicate is called on slice[0] and slice[1]
then on slice[1] and slice[2] and so on.
Examples
#![feature(slice_group_by)]
#![feature(slice_group_by)]
Panics
Panics if mid > len .
Examples
{
let (left, right) = v.split_at(0);
assert_eq!(left, []);
assert_eq!(right, [1, 2, 3, 4, 5, 6]);
}
{
let (left, right) = v.split_at(2);
assert_eq!(left, [1, 2]);
assert_eq!(right, [3, 4, 5, 6]);
}
{
let (left, right) = v.split_at(6);
assert_eq!(left, [1, 2, 3, 4, 5, 6]);
assert_eq!(right, []);
}
pub fn split_at_mut(&mut self, mid: usize) -> (&mut [T], &mut [T])
The first will contain all indices from [0, mid) (excluding the index mid itself) and the second will contain all indices from
[mid, len) (excluding the index len itself).
Panics
Panics if mid > len .
Examples
Divides one slice into two at an index, without doing bounds checking.
The first will contain all indices from [0, mid) (excluding the index mid itself) and the second will contain all indices from
[mid, len) (excluding the index len itself).
Safety
Calling this method with an out-of-bounds index is undefined behavior even if the resulting reference is not used. The caller has
to ensure that 0 <= mid <= self.len() .
Examples
#![feature(slice_split_at_unchecked)]
unsafe {
let (left, right) = v.split_at_unchecked(0);
assert_eq!(left, []);
assert_eq!(right, [1, 2, 3, 4, 5, 6]);
}
unsafe {
let (left, right) = v.split_at_unchecked(2);
assert_eq!(left, [1, 2]);
assert_eq!(right, [3, 4, 5, 6]);
}
unsafe {
let (left, right) = v.split_at_unchecked(6);
assert_eq!(left, [1, 2, 3, 4, 5, 6]);
assert_eq!(right, []);
}
pub unsafe fn split_at_mut_unchecked(
&mut self,
mid: usize
) -> (&mut [T], &mut [T])
🔬 This is a nightly-only experimental API. (slice_split_at_unchecked #76014)
Divides one mutable slice into two at an index, without doing bounds checking.
The first will contain all indices from [0, mid) (excluding the index mid itself) and the second will contain all indices from
[mid, len) (excluding the index len itself).
Safety
Calling this method with an out-of-bounds index is undefined behavior even if the resulting reference is not used. The caller has
to ensure that 0 <= mid <= self.len() .
Examples
#![feature(slice_split_at_unchecked)]
The array will contain all indices from [0, N) (excluding the index N itself) and the slice will contain all indices from [N,
len) (excluding the index len itself).
Panics
Panics if N > len .
Examples
#![feature(split_array)]
{
let (left, right) = v.split_array_ref::<0>();
assert_eq!(left, &[]);
assert_eq!(right, [1, 2, 3, 4, 5, 6]);
}
{
let (left, right) = v.split_array_ref::<2>();
assert_eq!(left, &[1, 2]);
assert_eq!(right, [3, 4, 5, 6]);
}
{
let (left, right) = v.split_array_ref::<6>();
assert_eq!(left, &[1, 2, 3, 4, 5, 6]);
assert_eq!(right, []);
}
pub fn split_array_mut<const N: usize>(&mut self) -> (&mut [T; N], &mut [T])
Divides one mutable slice into an array and a remainder slice at an index.
The array will contain all indices from [0, N) (excluding the index N itself) and the slice will contain all indices from [N,
len) (excluding the index len itself).
Panics
Panics if N > len .
Examples
#![feature(split_array)]
Divides one slice into an array and a remainder slice at an index from the end.
The slice will contain all indices from [0, len - N) (excluding the index len - N itself) and the array will contain all
indices from [len - N, len) (excluding the index len itself).
Panics
Panics if N > len .
Examples
#![feature(split_array)]
{
let (left, right) = v.rsplit_array_ref::<0>();
assert_eq!(left, [1, 2, 3, 4, 5, 6]);
assert_eq!(right, &[]);
}
{
let (left, right) = v.rsplit_array_ref::<2>();
assert_eq!(left, [1, 2, 3, 4]);
assert_eq!(right, &[5, 6]);
}
{
let (left, right) = v.rsplit_array_ref::<6>();
assert_eq!(left, []);
assert_eq!(right, &[1, 2, 3, 4, 5, 6]);
}
pub fn rsplit_array_mut<const N: usize>(&mut self) -> (&mut [T], &mut [T; N])
🔬 This is a nightly-only experimental API. (split_array #90091)
Divides one mutable slice into an array and a remainder slice at an index from the end.
The slice will contain all indices from [0, len - N) (excluding the index N itself) and the array will contain all indices from
[len - N, len) (excluding the index len itself).
Panics
Panics if N > len .
Examples
#![feature(split_array)]
Returns an iterator over subslices separated by elements that match pred . The matched element is not contained in the
subslices.
Examples
If the first element is matched, an empty slice will be the first item returned by the iterator. Similarly, if the last element in the
slice is matched, an empty slice will be the last item returned by the iterator:
assert_eq!(iter.next().unwrap(), &[10]);
assert_eq!(iter.next().unwrap(), &[]);
assert_eq!(iter.next().unwrap(), &[20]);
assert!(iter.next().is_none());
Returns an iterator over mutable subslices separated by elements that match pred . The matched element is not contained in
the subslices.
Examples
Returns an iterator over subslices separated by elements that match pred . The matched element is contained in the end of the
previous subslice as a terminator.
Examples
If the last element of the slice is matched, that element will be considered the terminator of the preceding slice. That slice will
be the last item returned by the iterator.
assert_eq!(iter.next().unwrap(), &[3]);
assert_eq!(iter.next().unwrap(), &[10, 40, 33]);
assert!(iter.next().is_none());
Examples
Returns an iterator over subslices separated by elements that match pred , starting at the end of the slice and working
backwards. The matched element is not contained in the subslices.
Examples
Returns an iterator over mutable subslices separated by elements that match pred , starting at the end of the slice and working
backwards. The matched element is not contained in the subslices.
Examples
Returns an iterator over subslices separated by elements that match pred , limited to returning at most n items. The matched
element is not contained in the subslices.
The last element returned, if any, will contain the remainder of the slice.
Examples
Print the slice split once by numbers divisible by 3 (i.e., [10, 40] , [20, 60, 50] ):
Returns an iterator over mutable subslices separated by elements that match pred , limited to returning at most n items. The
matched element is not contained in the subslices.
The last element returned, if any, will contain the remainder of the slice.
Examples
Returns an iterator over subslices separated by elements that match pred limited to returning at most n items. This starts at
the end of the slice and works backwards. The matched element is not contained in the subslices.
The last element returned, if any, will contain the remainder of the slice.
Examples
Print the slice split once, starting from the end, by numbers divisible by 3 (i.e., [50] , [10, 40, 30, 20] ):
Returns an iterator over subslices separated by elements that match pred limited to returning at most n items. This starts at
the end of the slice and works backwards. The matched element is not contained in the subslices.
The last element returned, if any, will contain the remainder of the slice.
Examples
🔬
F: FnMut(&T) -> bool,
Splits the slice on the first element that matches the specified predicate.
If any matching elements are resent in the slice, returns the prefix before the match and suffix after. The matching element
itself is not included. If no elements match, returns None .
Examples
#![feature(slice_split_once)]
let s = [1, 2, 3, 2, 4];
assert_eq!(s.split_once(|&x| x == 2), Some((
&[1][..],
&[3, 2, 4][..]
)));
assert_eq!(s.split_once(|&x| x == 0), None);
🔬
F: FnMut(&T) -> bool,
Splits the slice on the last element that matches the specified predicate.
If any matching elements are resent in the slice, returns the prefix before the match and suffix after. The matching element
itself is not included. If no elements match, returns None .
Examples
#![feature(slice_split_once)]
let s = [1, 2, 3, 2, 4];
assert_eq!(s.rsplit_once(|&x| x == 2), Some((
&[1, 2, 3][..],
&[4][..]
)));
assert_eq!(s.rsplit_once(|&x| x == 0), None);
Returns true if the slice contains an element with the given value.
This operation is O(n).
Examples
If you do not have a &T , but some other value that you can compare with one (for example, String implements
PartialEq<str> ), you can use iter().any :
Examples
Examples
If the slice starts with prefix , returns the subslice after the prefix, wrapped in Some . If prefix is empty, simply returns the
original slice.
Examples
If the slice ends with suffix , returns the subslice before the suffix, wrapped in Some . If suffix is empty, simply returns the
original slice.
Examples
Binary searches this slice for a given element. If the slice is not sorted, the returned result is unspecified and meaningless.
If the value is found then Result::Ok is returned, containing the index of the matching element. If there are multiple
matches, then any one of the matches could be returned. The index is chosen deterministically, but is subject to change in
future versions of Rust. If the value is not found then Result::Err is returned, containing the index where a matching
element could be inserted while maintaining sorted order.
assert_eq!(s.binary_search(&13), Ok(9));
assert_eq!(s.binary_search(&4), Err(7));
assert_eq!(s.binary_search(&100), Err(13));
let r = s.binary_search(&1);
assert!(match r { Ok(1..=4) => true, _ => false, });
If you want to find that whole range of matching items, rather than an arbitrary matching one, that can be done using
partition_point :
If you want to insert an item to a sorted vector, while maintaining sort order, consider using partition_point :
The comparator function should return an order code that indicates whether its argument is Less , Equal or Greater the
desired target. If the slice is not sorted or if the comparator function does not implement an order consistent with the sort order
of the underlying slice, the returned result is unspecified and meaningless.
If the value is found then Result::Ok is returned, containing the index of the matching element. If there are multiple
matches, then any one of the matches could be returned. The index is chosen deterministically, but is subject to change in
future versions of Rust. If the value is not found then Result::Err is returned, containing the index where a matching
element could be inserted while maintaining sorted order.
Assumes that the slice is sorted by the key, for instance with sort_by_key using the same key extraction function. If the slice
is not sorted by the key, the returned result is unspecified and meaningless.
If the value is found then Result::Ok is returned, containing the index of the matching element. If there are multiple
matches, then any one of the matches could be returned. The index is chosen deterministically, but is subject to change in
future versions of Rust. If the value is not found then Result::Err is returned, containing the index where a matching
element could be inserted while maintaining sorted order.
Examples
Looks up a series of four elements in a slice of pairs sorted by their second elements. The first is found, with a uniquely
determined position; the second and third are not found; the fourth could match any position in [1, 4] .
let s = [(0, 0), (2, 1), (4, 1), (5, 1), (3, 1),
(1, 2), (2, 3), (4, 5), (5, 8), (3, 13),
(1, 21), (2, 34), (4, 55)];
Sorts the slice, but might not preserve the order of equal elements.
This sort is unstable (i.e., may reorder equal elements), in-place (i.e., does not allocate), and O(n * log(n)) worst-case.
Current implementation
The current algorithm is based on pattern-defeating quicksort by Orson Peters, which combines the fast average case of
randomized quicksort with the fast worst case of heapsort, while achieving linear time on slices with certain patterns. It uses
some randomization to avoid degenerate cases, but with a fixed seed to always provide deterministic behavior.
It is typically faster than stable sorting, except in a few special cases, e.g., when the slice consists of several concatenated sorted
sequences.
Examples
v.sort_unstable();
assert!(v == [-5, -3, 1, 2, 4]);
Sorts the slice with a comparator function, but might not preserve the order of equal elements.
This sort is unstable (i.e., may reorder equal elements), in-place (i.e., does not allocate), and O(n * log(n)) worst-case.
The comparator function must define a total ordering for the elements in the slice. If the ordering is not total, the order of the
elements is unspecified. An order is a total order if it is (for all a , b and c ):
For example, while f64 doesn’t implement Ord because NaN != NaN , we can use partial_cmp as our sort function when
we know the slice doesn’t contain a NaN .
let mut floats = [5f64, 4.0, 1.0, 3.0, 2.0];
floats.sort_unstable_by(|a, b| a.partial_cmp(b).unwrap());
assert_eq!(floats, [1.0, 2.0, 3.0, 4.0, 5.0]);
Current implementation
The current algorithm is based on pattern-defeating quicksort by Orson Peters, which combines the fast average case of
randomized quicksort with the fast worst case of heapsort, while achieving linear time on slices with certain patterns. It uses
some randomization to avoid degenerate cases, but with a fixed seed to always provide deterministic behavior.
It is typically faster than stable sorting, except in a few special cases, e.g., when the slice consists of several concatenated sorted
sequences.
Examples
// reverse sorting
v.sort_unstable_by(|a, b| b.cmp(a));
assert!(v == [5, 4, 3, 2, 1]);
Sorts the slice with a key extraction function, but might not preserve the order of equal elements.
This sort is unstable (i.e., may reorder equal elements), in-place (i.e., does not allocate), and O(m * n * log(n)) worst-case, where
the key function is O(m).
Current implementation
The current algorithm is based on pattern-defeating quicksort by Orson Peters, which combines the fast average case of
randomized quicksort with the fast worst case of heapsort, while achieving linear time on slices with certain patterns. It uses
some randomization to avoid degenerate cases, but with a fixed seed to always provide deterministic behavior.
Due to its key calling strategy, sort_unstable_by_key is likely to be slower than sort_by_cached_key in cases where the
key function is expensive.
Examples
v.sort_unstable_by_key(|k| k.abs());
assert!(v == [1, 2, -3, 4, -5]);
Reorder the slice such that the element at index is at its final sorted position.
This reordering has the additional property that any value at position i < index will be less than or equal to any value at a
position j > index . Additionally, this reordering is unstable (i.e. any number of equal elements may end up at position
index ), in-place (i.e. does not allocate), and runs in O(n) time. This function is also known as “kth element” in other libraries.
It returns a triplet of the following from the reordered slice: the subslice prior to index , the element at index , and the
subslice after index ; accordingly, the values in those two subslices will respectively all be less-than-or-equal-to and greater-
than-or-equal-to the value of the element at index .
Current implementation
The current algorithm is an introselect implementation based on Pattern Defeating Quicksort, which is also the basis for
sort_unstable . The fallback algorithm is Median of Medians using Tukey’s Ninther for pivot selection, which guarantees
linear runtime for all inputs.
Panics
Panics when index >= len() , meaning it always panics on empty slices.
Examples
// We are only guaranteed the slice will be one of the following, based on the way we sort
// about the specified index.
assert!(v == [-3, -5, 1, 2, 4] ||
v == [-5, -3, 1, 2, 4] ||
v == [-3, -5, 1, 4, 2] ||
v == [-5, -3, 1, 4, 2]);
Reorder the slice with a comparator function such that the element at index is at its final sorted position.
This reordering has the additional property that any value at position i < index will be less than or equal to any value at a
position j > index using the comparator function. Additionally, this reordering is unstable (i.e. any number of equal
elements may end up at position index ), in-place (i.e. does not allocate), and runs in O(n) time. This function is also known as
“kth element” in other libraries.
It returns a triplet of the following from the slice reordered according to the provided comparator function: the subslice prior to
index , the element at index , and the subslice after index ; accordingly, the values in those two subslices will respectively all
be less-than-or-equal-to and greater-than-or-equal-to the value of the element at index .
Current implementation
The current algorithm is an introselect implementation based on Pattern Defeating Quicksort, which is also the basis for
sort_unstable . The fallback algorithm is Median of Medians using Tukey’s Ninther for pivot selection, which guarantees
linear runtime for all inputs.
Panics
Panics when index >= len() , meaning it always panics on empty slices.
Examples
Reorder the slice with a key extraction function such that the element at index is at its final sorted position.
This reordering has the additional property that any value at position i < index will be less than or equal to any value at a
position j > index using the key extraction function. Additionally, this reordering is unstable (i.e. any number of equal
elements may end up at position index ), in-place (i.e. does not allocate), and runs in O(n) time. This function is also known as
“kth element” in other libraries.
It returns a triplet of the following from the slice reordered according to the provided key extraction function: the subslice prior
to index , the element at index , and the subslice after index ; accordingly, the values in those two subslices will respectively
all be less-than-or-equal-to and greater-than-or-equal-to the value of the element at index .
Current implementation
The current algorithm is an introselect implementation based on Pattern Defeating Quicksort, which is also the basis for
sort_unstable . The fallback algorithm is Median of Medians using Tukey’s Ninther for pivot selection, which guarantees
linear runtime for all inputs.
Panics
Panics when index >= len() , meaning it always panics on empty slices.
Examples
// Return the median as if the array were sorted according to absolute value.
v.select_nth_unstable_by_key(2, |a| a.abs());
// We are only guaranteed the slice will be one of the following, based on the way we sort
// about the specified index.
assert!(v == [1, 2, -3, 4, -5] ||
v == [1, 2, -3, -5, 4] ||
v == [2, 1, -3, 4, -5] ||
v == [2, 1, -3, -5, 4]);
🔬
T: PartialEq,
Moves all consecutive repeated elements to the end of the slice according to the PartialEq trait implementation.
Returns two slices. The first contains no consecutive repeated elements. The second contains all the duplicates in no specified
order.
Examples
#![feature(slice_partition_dedup)]
🔬
F: FnMut(&mut T, &mut T) -> bool,
Moves all but the first of consecutive elements to the end of the slice satisfying a given equality relation.
Returns two slices. The first contains no consecutive repeated elements. The second contains all the duplicates in no specified
order.
The same_bucket function is passed references to two elements from the slice and must determine if the elements compare
equal. The elements are passed in opposite order from their order in the slice, so if same_bucket(a, b) returns true , a is
moved at the end of the slice.
If the slice is sorted, the first returned slice contains no duplicates.
Examples
#![feature(slice_partition_dedup)]
let mut slice = ["foo", "Foo", "BAZ", "Bar", "bar", "baz", "BAZ"];
pub fn partition_dedup_by_key<K, F>(&mut self, key: F) -> (&mut [T], &mut [T])
where
F: FnMut(&mut T) -> K,
🔬
K: PartialEq,
Moves all but the first of consecutive elements to the end of the slice that resolve to the same key.
Returns two slices. The first contains no consecutive repeated elements. The second contains all the duplicates in no specified
order.
Examples
#![feature(slice_partition_dedup)]
let mut slice = [10, 20, 21, 30, 30, 20, 11, 13];
Rotates the slice in-place such that the first mid elements of the slice move to the end while the last self.len() - mid
elements move to the front. After calling rotate_left , the element previously at index mid will become the first element in
the slice.
Panics
This function will panic if mid is greater than the length of the slice. Note that mid == self.len() does not panic and is a
no-op rotation.
Complexity
Takes linear (in self.len() ) time.
Examples
Rotating a subslice:
let mut a = ['a', 'b', 'c', 'd', 'e', 'f'];
a[1..5].rotate_left(1);
assert_eq!(a, ['a', 'c', 'd', 'e', 'b', 'f']);
Rotates the slice in-place such that the first self.len() - k elements of the slice move to the end while the last k elements
move to the front. After calling rotate_right , the element previously at index self.len() - k will become the first
element in the slice.
Panics
This function will panic if k is greater than the length of the slice. Note that k == self.len() does not panic and is a no-op
rotation.
Complexity
Takes linear (in self.len() ) time.
Examples
Rotating a subslice:
Examples
This method uses a closure to create new values. If you’d rather Clone a given value, use fill . If you want to use the
Default trait to generate values, you can pass Default::default as the argument.
Examples
Panics
This function will panic if the two slices have different lengths.
Examples
Cloning two elements from a slice into another:
Rust enforces that there can only be one mutable reference with no immutable references to a particular piece of data in a
particular scope. Because of this, attempting to use clone_from_slice on a single slice will result in a compile failure:
To work around this, we can use split_at_mut to create two distinct sub-slices from a slice:
let mut slice = [1, 2, 3, 4, 5];
{
let (left, right) = slice.split_at_mut(2);
left.clone_from_slice(&right[1..]);
}
Panics
This function will panic if the two slices have different lengths.
Examples
Copying two elements from a slice into another:
Rust enforces that there can only be one mutable reference with no immutable references to a particular piece of data in a
particular scope. Because of this, attempting to use copy_from_slice on a single slice will result in a compile failure:
To work around this, we can use split_at_mut to create two distinct sub-slices from a slice:
{
let (left, right) = slice.split_at_mut(2);
left.copy_from_slice(&right[1..]);
}
Copies elements from one part of the slice to another part of itself, using a memmove.
src is the range within self to copy from. dest is the starting index of the range within self to copy to, which will have the
same length as src . The two ranges may overlap. The ends of the two ranges must be less than or equal to self.len() .
Panics
This function will panic if either range exceeds the end of the slice, or if the end of src is before the start.
Examples
Copying four bytes within a slice:
bytes.copy_within(1..5, 8);
Panics
This function will panic if the two slices have different lengths.
Example
Swapping two elements across slices:
let mut slice1 = [0, 0];
let mut slice2 = [1, 2, 3, 4];
slice1.swap_with_slice(&mut slice2[2..]);
Rust enforces that there can only be one mutable reference to a particular piece of data in a particular scope. Because of this,
attempting to use swap_with_slice on a single slice will result in a compile failure:
To work around this, we can use split_at_mut to create two distinct mutable sub-slices from a slice:
{
let (left, right) = slice.split_at_mut(2);
left.swap_with_slice(&mut right[1..]);
}
This method splits the slice into three distinct slices: prefix, correctly aligned middle slice of a new type, and the suffix slice.
How exactly the slice is split up is not specified; the middle part may be smaller than necessary. However, if this fails to return a
maximal middle part, that is because code is running in a context where performance does not matter, such as a sanitizer
attempting to find alignment bugs. Regular code running in a default (debug or release) execution will return a maximal middle
part.
This method has no purpose when either input element T or output element U are zero-sized and will return the original slice
without splitting anything.
Safety
This method is essentially a transmute with respect to the elements in the returned middle slice, so all the usual caveats
pertaining to transmute::<T, U> also apply here.
Examples
Basic usage:
unsafe {
let bytes: [u8; 7] = [1, 2, 3, 4, 5, 6, 7];
let (prefix, shorts, suffix) = bytes.align_to::<u16>();
// less_efficient_algorithm_for_bytes(prefix);
// more_efficient_algorithm_for_aligned_shorts(shorts);
// less_efficient_algorithm_for_bytes(suffix);
}
pub unsafe fn align_to_mut<U>(&mut self) -> (&mut [T], &mut [U], &mut [T]) 1.30.0 ·
Transmute the mutable slice to a mutable slice of another type, ensuring alignment of the types is maintained.
This method splits the slice into three distinct slices: prefix, correctly aligned middle slice of a new type, and the suffix slice.
How exactly the slice is split up is not specified; the middle part may be smaller than necessary. However, if this fails to return a
maximal middle part, that is because code is running in a context where performance does not matter, such as a sanitizer
attempting to find alignment bugs. Regular code running in a default (debug or release) execution will return a maximal middle
part.
This method has no purpose when either input element T or output element U are zero-sized and will return the original slice
without splitting anything.
Safety
This method is essentially a transmute with respect to the elements in the returned middle slice, so all the usual caveats
pertaining to transmute::<T, U> also apply here.
Examples
Basic usage:
unsafe {
let mut bytes: [u8; 7] = [1, 2, 3, 4, 5, 6, 7];
let (prefix, shorts, suffix) = bytes.align_to_mut::<u16>();
// less_efficient_algorithm_for_bytes(prefix);
// more_efficient_algorithm_for_aligned_shorts(shorts);
// less_efficient_algorithm_for_bytes(suffix);
}
Split a slice into a prefix, a middle of aligned SIMD types, and a suffix.
This is a safe wrapper around slice::align_to , so has the same weak postconditions as that method. You’re only assured
that self.len() == prefix.len() + middle.len() * LANES + suffix.len() .
That said, this is a safe method, so if you’re only writing safe code, then this can at most cause incorrect logic, not unsoundness.
Panics
This will panic if the size of the SIMD type is different from LANES times that of the scalar.
At the time of writing, the trait restrictions on Simd<T, LANES> keeps that from ever happening, as only power-of-two
numbers of lanes are supported. It’s possible that, in the future, those restrictions might be lifted in a way that would make it
possible to see panics from this method for something like LANES == 3 .
Examples
#![feature(portable_simd)]
use core::simd::prelude::*;
Split a mutable slice into a mutable prefix, a middle of aligned SIMD types, and a mutable suffix.
This is a safe wrapper around slice::align_to_mut , so has the same weak postconditions as that method. You’re only
assured that self.len() == prefix.len() + middle.len() * LANES + suffix.len() .
That said, this is a safe method, so if you’re only writing safe code, then this can at most cause incorrect logic, not unsoundness.
Panics
This will panic if the size of the SIMD type is different from LANES times that of the scalar.
At the time of writing, the trait restrictions on Simd<T, LANES> keeps that from ever happening, as only power-of-two
numbers of lanes are supported. It’s possible that, in the future, those restrictions might be lifted in a way that would make it
possible to see panics from this method for something like LANES == 3 .
🔬
T: PartialOrd,
Note that if Self::Item is only PartialOrd , but not Ord , the above definition implies that this function returns false if
any two consecutive items are not comparable.
Examples
#![feature(is_sorted)]
let empty: [i32; 0] = [];
assert!([1, 2, 2, 9].is_sorted());
assert!(![1, 3, 2, 4].is_sorted());
assert!([0].is_sorted());
assert!(empty.is_sorted());
assert!(![0.0, 1.0, f32::NAN].is_sorted());
🔬
F: FnMut(&'a T, &'a T) -> Option<Ordering>,
Checks if the elements of this slice are sorted using the given comparator function.
Instead of using PartialOrd::partial_cmp , this function uses the given compare function to determine the ordering of
two elements. Apart from that, it’s equivalent to is_sorted ; see its documentation for more information.
🔬
K: PartialOrd,
Checks if the elements of this slice are sorted using the given key extraction function.
Instead of comparing the slice’s elements directly, this function compares the keys of the elements, as determined by f . Apart
from that, it’s equivalent to is_sorted ; see its documentation for more information.
Examples
#![feature(is_sorted)]
Returns the index of the partition point according to the given predicate (the index of the first element of the second partition).
The slice is assumed to be partitioned according to the given predicate. This means that all elements for which the predicate
returns true are at the start of the slice and all elements for which the predicate returns false are at the end. For example, [7,
15, 3, 5, 4, 12, 6] is partitioned under the predicate x % 2 != 0 (all odd numbers are at the start, all even at the end).
If this slice is not partitioned, the returned result is unspecified and meaningless, as this method performs a kind of binary
search.
assert_eq!(i, 4);
assert!(v[..i].iter().all(|&x| x < 5));
assert!(v[i..].iter().all(|&x| !(x < 5)));
If all elements of the slice match the predicate, including if the slice is empty, then the length of the slice will be returned:
If you want to insert an item to a sorted vector, while maintaining sort order:
pub fn take<R, 'a>(self: &mut &'a [T], range: R) -> Option<&'a [T]>
where
R: OneSidedRange<usize>,
🔬 This is a nightly-only experimental API. (slice_take #62280)
Removes the subslice corresponding to the given range and returns a reference to it.
Returns None and does not modify the slice if the given range is out of bounds.
Note that this method only accepts one-sided ranges such as 2.. or ..6 , but not 2..6 .
Examples
Taking the first three elements of a slice:
#![feature(slice_take)]
assert_eq!(slice, &['d']);
assert_eq!(first_three, &['a', 'b', 'c']);
#![feature(slice_take)]
#![feature(slice_take)]
assert_eq!(None, slice.take(5..));
assert_eq!(None, slice.take(..5));
assert_eq!(None, slice.take(..=4));
let expected: &[char] = &['a', 'b', 'c', 'd'];
assert_eq!(Some(expected), slice.take(..4));
pub fn take_mut<R, 'a>(self: &mut &'a mut [T], range: R) -> Option<&'a mut [T]>
where
🔬
R: OneSidedRange<usize>,
Removes the subslice corresponding to the given range and returns a mutable reference to it.
Returns None and does not modify the slice if the given range is out of bounds.
Note that this method only accepts one-sided ranges such as 2.. or ..6 , but not 2..6 .
Examples
Taking the first three elements of a slice:
#![feature(slice_take)]
let mut slice: &mut [_] = &mut ['a', 'b', 'c', 'd'];
let mut first_three = slice.take_mut(..3).unwrap();
#![feature(slice_take)]
let mut slice: &mut [_] = &mut ['a', 'b', 'c', 'd'];
let mut tail = slice.take_mut(2..).unwrap();
#![feature(slice_take)]
let mut slice: &mut [_] = &mut ['a', 'b', 'c', 'd'];
assert_eq!(None, slice.take_mut(5..));
assert_eq!(None, slice.take_mut(..5));
assert_eq!(None, slice.take_mut(..=4));
let expected: &mut [_] = &mut ['a', 'b', 'c', 'd'];
assert_eq!(Some(expected), slice.take_mut(..4));
🔬
pub fn take_first<'a>(self: &mut &'a [T]) -> Option<&'a T>
This is a nightly-only experimental API. (slice_take #62280)
Removes the first element of the slice and returns a reference to it.
Examples
#![feature(slice_take)]
pub fn take_first_mut<'a>(self: &mut &'a mut [T]) -> Option<&'a mut T>
Removes the first element of the slice and returns a mutable reference to it.
Examples
#![feature(slice_take)]
Removes the last element of the slice and returns a reference to it.
Examples
#![feature(slice_take)]
pub fn take_last_mut<'a>(self: &mut &'a mut [T]) -> Option<&'a mut T>
Removes the last element of the slice and returns a mutable reference to it.
#![feature(slice_take)]
Returns mutable references to many indices at once, without doing any checks.
Safety
Calling this method with overlapping or out-of-bounds indices is undefined behavior even if the resulting references are not used.
Examples
#![feature(get_many_mut)]
Returns an error if any index is out-of-bounds, or if the same index was passed more than once.
Examples
#![feature(get_many_mut)]
Panics
This panics if the length of the resulting slice would overflow a usize .
This is only possible when flattening a slice of arrays of zero-sized types, and thus tends to be irrelevant in practice. If
size_of::<T>() > 0 , this will never panic.
Examples
#![feature(slice_flatten)]
assert_eq!(
[[1, 2, 3], [4, 5, 6]].flatten(),
[[1, 2], [3, 4], [5, 6]].flatten(),
);
Panics
This panics if the length of the resulting slice would overflow a usize .
This is only possible when flattening a slice of arrays of zero-sized types, and thus tends to be irrelevant in practice. If
size_of::<T>() > 0 , this will never panic.
Examples
#![feature(slice_flatten)]
Returns a vector containing a copy of this slice where each byte is mapped to its ASCII upper case equivalent.
ASCII letters ‘a’ to ‘z’ are mapped to ‘A’ to ‘Z’, but non-ASCII letters are unchanged.
To uppercase the value in-place, use make_ascii_uppercase .
Returns a vector containing a copy of this slice where each byte is mapped to its ASCII lower case equivalent.
ASCII letters ‘A’ to ‘Z’ are mapped to ‘a’ to ‘z’, but non-ASCII letters are unchanged.
This sort is stable (i.e., does not reorder equal elements) and O(n * log(n)) worst-case.
When applicable, unstable sorting is preferred because it is generally faster than stable sorting and it doesn’t allocate auxiliary
memory. See sort_unstable .
Current implementation
The current algorithm is an adaptive, iterative merge sort inspired by timsort. It is designed to be very fast in cases where the
slice is nearly sorted, or consists of two or more sorted sequences concatenated one after another.
Also, it allocates temporary storage half the size of self , but for short slices a non-allocating insertion sort is used instead.
Examples
This sort is stable (i.e., does not reorder equal elements) and O(n * log(n)) worst-case.
The comparator function must define a total ordering for the elements in the slice. If the ordering is not total, the order of the
elements is unspecified. An order is a total order if it is (for all a , b and c ):
For example, while f64 doesn’t implement Ord because NaN != NaN , we can use partial_cmp as our sort function when
we know the slice doesn’t contain a NaN .
When applicable, unstable sorting is preferred because it is generally faster than stable sorting and it doesn’t allocate auxiliary
memory. See sort_unstable_by .
Current implementation
The current algorithm is an adaptive, iterative merge sort inspired by timsort. It is designed to be very fast in cases where the
slice is nearly sorted, or consists of two or more sorted sequences concatenated one after another.
Also, it allocates temporary storage half the size of self , but for short slices a non-allocating insertion sort is used instead.
Examples
// reverse sorting
v.sort_by(|a, b| b.cmp(a));
assert!(v == [5, 4, 3, 2, 1]);
This sort is stable (i.e., does not reorder equal elements) and O(m * n * log(n)) worst-case, where the key function is O(m).
For expensive key functions (e.g. functions that are not simple property accesses or basic operations), sort_by_cached_key
is likely to be significantly faster, as it does not recompute element keys.
When applicable, unstable sorting is preferred because it is generally faster than stable sorting and it doesn’t allocate auxiliary
memory. See sort_unstable_by_key .
Current implementation
The current algorithm is an adaptive, iterative merge sort inspired by timsort. It is designed to be very fast in cases where the
slice is nearly sorted, or consists of two or more sorted sequences concatenated one after another.
Also, it allocates temporary storage half the size of self , but for short slices a non-allocating insertion sort is used instead.
Examples
v.sort_by_key(|k| k.abs());
assert!(v == [1, 2, -3, 4, -5]);
During sorting, the key function is called at most once per element, by using temporary storage to remember the results of key
evaluation. The order of calls to the key function is unspecified and may change in future versions of the standard library.
This sort is stable (i.e., does not reorder equal elements) and O(m * n + n * log(n)) worst-case, where the key function is O(m).
For simple key functions (e.g., functions that are property accesses or basic operations), sort_by_key is likely to be faster.
Current implementation
The current algorithm is based on pattern-defeating quicksort by Orson Peters, which combines the fast average case of
randomized quicksort with the fast worst case of heapsort, while achieving linear time on slices with certain patterns. It uses
some randomization to avoid degenerate cases, but with a fixed seed to always provide deterministic behavior.
In the worst case, the algorithm allocates temporary storage in a Vec<(K, usize)> the length of the slice.
Examples
let mut v = [-5i32, 4, 32, -3, 2];
v.sort_by_cached_key(|k| k.to_string());
assert!(v == [-3, -5, 2, 32, 4]);
Examples
🔬
T: Clone,
Examples
#![feature(allocator_api)]
use std::alloc::System;
Panics
This function will panic if the capacity would overflow.
Examples
Basic usage:
Examples
Flattens a slice of T into a single value Self::Output , placing a given separator between each.
Examples
pub fn connect<Separator>(
&self,
sep: Separator
) -> <[T] as Join<Separator>>::Output ⓘ
where
👎
[T]: Join<Separator>,
Flattens a slice of T into a single value Self::Output , placing a given separator between each.
Examples
Trait Implementations
Converts this type into a mutable reference of the (usually inferred) input type.
Converts this type into a mutable reference of the (usually inferred) input type.
impl<T, A> AsRef<[T]> for Vec<T, A>
where
A: Allocator,
Converts this type into a shared reference of the (usually inferred) input type.
Converts this type into a shared reference of the (usually inferred) input type.
The vector will not allocate until elements are pushed onto it.
fn drop(&mut self)
This implementation is specialized for slice iterators, where it uses copy_from_slice to append the entire slice at once.
Reserves capacity in a collection for the given number of additional elements. Read more
Reserves capacity in a collection for the given number of additional elements. Read more
Examples
Examples
assert_eq!(Vec::from(&[1, 2, 3]), vec![1, 2, 3]);
Examples
Examples
Examples
Examples
This conversion requires no data movement or allocation, and has constant time complexity.
Convert a boxed slice into a vector by transferring ownership of the existing heap allocation.
Examples
The conversion consumes the CString , and removes the terminating NUL byte.
If s already owns a Vec<T> , it will be returned directly. If s is borrowing a slice, a new Vec<T> will be allocated and filled by
cloning s ’s items into it.
Examples
Converts the given String to a vector Vec that holds values of type u8 .
Examples
for b in v1 {
println!("{b}");
}
Example
If v has excess capacity, its items will be moved into a newly-allocated buffer with exactly the right capacity.
Examples
Example
This conversion is guaranteed to run in O(1) time and to not re-allocate the Vec ’s buffer or allocate any additional memory.
This never needs to re-allocate, but does need to do O(n) data movement if the circular buffer doesn’t happen to be at the
beginning of the allocation.
Examples
use std::collections::VecDeque;
The hash of a vector is the same as that of the corresponding slice, as required by the core::borrow::Borrow
implementation.
use std::hash::BuildHasher;
let b = std::hash::RandomState::new();
let v: Vec<u8> = vec![0xa8, 0x3c, 0x09];
let s: &[u8] = &[0xa8, 0x3c, 0x09];
assert_eq!(b.hash_one(v), b.hash_one(s));
Feeds a slice of this type into the given Hasher . Read more
Creates a consuming iterator, that is, one that moves each value out of the vector (from start to end). The vector cannot be used
after calling this.
Examples
assert_eq!(first_element, Some("a".to_string()));
assert_eq!(v_iter.next(), Some("b".to_string()));
assert_eq!(v_iter.next(), None);
type Item = T
This method returns an Ordering between self and other . Read more
This method tests for self and other values to be equal, and is used by == .
This method tests for != . The default implementation is almost always sufficient, and should not be overridden without very
good reason.
This method tests for self and other values to be equal, and is used by == .
This method tests for self and other values to be equal, and is used by == .
This method tests for != . The default implementation is almost always sufficient, and should not be overridden without very
good reason.
This method tests for self and other values to be equal, and is used by == .
This method tests for != . The default implementation is almost always sufficient, and should not be overridden without very
good reason.
impl<T, U, A, const N: usize> PartialEq<[U; N]> for Vec<T, A>
where
A: Allocator,
T: PartialEq<U>,
This method tests for self and other values to be equal, and is used by == .
This method tests for != . The default implementation is almost always sufficient, and should not be overridden without very
good reason.
This method tests for self and other values to be equal, and is used by == .
This method tests for != . The default implementation is almost always sufficient, and should not be overridden without very
good reason.
This method tests for self and other values to be equal, and is used by == .
This method tests for != . The default implementation is almost always sufficient, and should not be overridden without very
good reason.
This method tests for self and other values to be equal, and is used by == .
This method tests for != . The default implementation is almost always sufficient, and should not be overridden without very
good reason.
This method tests for self and other values to be equal, and is used by == .
This method tests for self and other values to be equal, and is used by == .
This method tests for != . The default implementation is almost always sufficient, and should not be overridden without very
good reason.
This method tests for self and other values to be equal, and is used by == .
This method tests for != . The default implementation is almost always sufficient, and should not be overridden without very
good reason.
impl<T, A1, A2> PartialOrd<Vec<T, A2>> for Vec<T, A1>
where
T: PartialOrd,
A1: Allocator,
A2: Allocator,
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
This method tests greater than or equal to (for self and other ) and is used by the >= operator. Read more
fn try_from(
vec: Vec<T>
) -> Result<Box<[T; N]>, <Box<[T; N]> as TryFrom<Vec<T>>>::Error>
Attempts to convert a Vec<T> into a Box<[T; N]> .
Like Vec::into_boxed_slice , this is in-place if vec.capacity() == N , but will require a reallocation otherwise.
Errors
Returns the original Vec<T> in the Err variant if boxed_slice.len() does not equal N .
Examples
This can be used with vec! to create an array on the heap:
Gets the entire contents of the Vec<T> as an array, if its size exactly matches that of the requested array.
Examples
If you’re fine with just getting a prefix of the Vec<T> , you can call .truncate(N) first.
Write is implemented for Vec<u8> by appending to the vector. The vector will grow as needed.
Write a buffer into this writer, returning how many bytes were written. Read more
Like write , except that it writes from a slice of buffers. Read more
Flush this output stream, ensuring that all intermediately buffered contents reach their destination. Read more
Writes a formatted string into this writer, returning any error encountered. Read more
Creates a “by reference” adapter for this instance of Write . Read more
Blanket Implementations