pub struct Vec<T, A =Global>where A:Allocator,{/* private fields */ }Expand description
A contiguous growable array type, written asVec<T>, short for ‘vector’.
§Examples
letmutvec = Vec::new();vec.push(1);vec.push(2);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]);forxin&vec {println!("{x}");}assert_eq!(vec, [7,1,2,3]);Thevec! macro is provided for convenient initialization:
It can also initialize each element of aVec<T> with a given value.This may be more efficient than performing allocation and initializationin separate steps, especially when initializing a vector of zeros:
letvec =vec![0;5];assert_eq!(vec, [0,0,0,0,0]);// The following is equivalent, but potentially slower:letmutvec = Vec::with_capacity(5);vec.resize(5,0);assert_eq!(vec, [0,0,0,0,0]);For more information, seeCapacity and Reallocation.
Use aVec<T> as an efficient stack:
letmutstack = Vec::new();stack.push(1);stack.push(2);stack.push(3);while letSome(top) = stack.pop() {// Prints 3, 2, 1println!("{top}");}§Indexing
TheVec type allows access to values by index, because it implements theIndex trait. An example will be more explicit:
However be careful: if you try to access an index which isn’t in theVec,your software will panic! You cannot do this:
Useget andget_mut if you want to check whether the index is intheVec.
§Slicing
AVec can be mutable. On the other hand, slices are read-only objects.To get aslice, use&. Example:
fnread_slice(slice:&[usize]) {// ...}letv =vec![0,1];read_slice(&v);// ... and that's all!// you can also do it like this:letu:&[usize] =&v;// or like this:letu:&[_] =&v;In Rust, it’s more common to pass slices as arguments rather than vectorswhen you just want to provide read access. The same goes forString and&str.
§Capacity and reallocation
The capacity of a vector is the amount of space allocated for any futureelements that will be added onto the vector. This is not to be confused withthelength of a vector, which specifies the number of actual elementswithin the vector. If a vector’s length exceeds its capacity, its capacitywill automatically be increased, but its elements will have to bereallocated.
For example, a vector with capacity 10 and length 0 would be an empty vectorwith space for 10 more elements. Pushing 10 or fewer elements onto thevector 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, whichcan be slow. For this reason, it is recommended to useVec::with_capacitywhenever possible to specify how big the vector is expected to get.
§Guarantees
Due to its incredibly fundamental nature,Vec makes a lot of guaranteesabout its design. This ensures that it’s as low-overhead as possible inthe general case, and can be correctly manipulated in primitive waysby unsafe code. Note that these guarantees refer to an unqualifiedVec<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 completelyunspecified, 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 aVec with capacity 0 viaVec::new,vec![],Vec::with_capacity(0), or by callingshrink_to_fiton an empty Vec, it will not allocate memory. Similarly, if you store zero-sizedtypes inside aVec, it will not allocate space for them.Note that in this casetheVec might not report acapacity of 0.Vec will allocate if and onlyifsize_of::<T>() *capacity() > 0. In general,Vec’s allocationdetails are very subtle — if you intend to allocate memory using aVecand use it for something else (either to pass to unsafe code, or to build yourown memory-backed collection), be sure to deallocate this memory by usingfrom_raw_parts to recover theVec and then dropping it.
If aVechas 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 itspointer points tolen initialized, contiguous elements in order (whatyou would see if you coerced it to a slice), followed bycapacity -lenlogically uninitialized, contiguous elements.
A vector containing the elements'a' and'b' with capacity 4 can bevisualized as below. The top part is theVec struct, it contains apointer 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.
ptr len capacity +--------+--------+--------+ | 0x0123 | 2 | 4 | +--------+--------+--------+ | vHeap +--------+--------+--------+--------+ | 'a' | 'b' | uninit | uninit | +--------+--------+--------+--------+- uninit represents memory that is not initialized, see
MaybeUninit. - Note: the ABI is not stable and
Vecmakes no guarantees about its memorylayout (including the order of fields).
Vec will never perform a “small optimization” where elements are actuallystored on the stack for two reasons:
It would make it more difficult for unsafe code to correctly manipulatea
Vec. The contents of aVecwouldn’t have a stable address if it wereonly moved, and it would be more difficult to determine if aVechadactually allocated memory.It would penalize the general case, incurring an additional branchon every access.
Vec will never automatically shrink itself, even if completely empty. Thisensures no unnecessary allocations or deallocations occur. Emptying aVecand then filling it back up to the samelen should incur no calls tothe allocator. If you wish to free up unused memory, useshrink_to_fit orshrink_to.
push andinsert will never (re)allocate if the reported capacity issufficient.push andinsertwill (re)allocate iflen ==capacity. That is, the reported capacity is completelyaccurate, and can be relied on. It can even be used to manually free the memoryallocated by aVec if desired. Bulk insertion methodsmay reallocate, evenwhen not necessary.
Vec does not guarantee any particular growth strategy when reallocatingwhen full, nor whenreserve is called. The current strategy is basicand it may prove desirable to use a non-constant growth factor. Whateverstrategy is used will of course guaranteeO(1) amortizedpush.
It is guaranteed, in order to respect the intentions of the programmer, thatall ofvec![e_1, e_2, ..., e_n],vec![x; n], andVec::with_capacity(n) produce aVecthat requests an allocation of the exact size needed for preciselyn elements from the allocator,and no other size (such as, for example: a size rounded up to the nearest power of 2).The allocator will return an allocation that is at least as large as requested, but it may be larger.
It is guaranteed that theVec::capacity method returns a value that is at least the requested capacityand not more than the allocated capacity.
The methodVec::shrink_to_fit will attempt to discard excess capacity an allocator has given to aVec.Iflen ==capacity, then aVec<T> can be convertedto and from aBox<[T]> without reallocating or moving the elements.Vec exploits this fact as much as reasonable when implementing common conversionssuch asinto_boxed_slice.
Vec will not specifically overwrite any data that is removed from it,but also won’t specifically preserve it. Its uninitialized memory isscratch space that it may use however it wants. It will generally just dowhatever is most efficient or otherwise easy to implement. Do not rely onremoved data to be erased for security purposes. Even if you drop aVec, itsbuffer may simply be reused by another allocation. Even if you zero aVec’s memoryfirst, that might not actually happen because the optimizer does not considerthis a side-effect that must be preserved. There is one case which we willnot break, however: usingunsafe 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§
Source§impl<T>Vec<T>
impl<T>Vec<T>
1.0.0 (const: 1.39.0) ·Sourcepub const fnnew() ->Vec<T>
pub const fnnew() ->Vec<T>
Constructs a new, emptyVec<T>.
The vector will not allocate until elements are pushed onto it.
§Examples
1.0.0 ·Sourcepub fnwith_capacity(capacity:usize) ->Vec<T>
pub fnwith_capacity(capacity:usize) ->Vec<T>
Constructs a new, emptyVec<T> with at least the specified capacity.
The vector will be able to hold at leastcapacity elements withoutreallocating. This method is allowed to allocate for more elements thancapacity. Ifcapacity is zero, the vector will not allocate.
It is important to note that although the returned vector has theminimumcapacity specified, the vector will have a zerolength. Foran explanation of the difference between length and capacity, seeCapacity and reallocation.
If it is important to know the exact allocated capacity of aVec,always use thecapacity method after construction.
ForVec<T> whereT is a zero-sized type, there will be no allocationand the capacity will always beusize::MAX.
§Panics
Panics if the new capacity exceedsisize::MAXbytes.
§Examples
letmutvec = Vec::with_capacity(10);// The vector contains no items, even though it has capacity for moreassert_eq!(vec.len(),0);assert!(vec.capacity() >=10);// These are all done without reallocating...foriin0..10{ vec.push(i);}assert_eq!(vec.len(),10);assert!(vec.capacity() >=10);// ...but this may make the vector reallocatevec.push(11);assert_eq!(vec.len(),11);assert!(vec.capacity() >=11);// A vector of a zero-sized type will always over-allocate, since no// allocation is necessaryletvec_units = Vec::<()>::with_capacity(10);assert_eq!(vec_units.capacity(), usize::MAX);Sourcepub fntry_with_capacity(capacity:usize) ->Result<Vec<T>,TryReserveError>
🔬This is a nightly-only experimental API. (try_with_capacity #91913)
pub fntry_with_capacity(capacity:usize) ->Result<Vec<T>,TryReserveError>
try_with_capacity #91913)Constructs a new, emptyVec<T> with at least the specified capacity.
The vector will be able to hold at leastcapacity elements withoutreallocating. This method is allowed to allocate for more elements thancapacity. Ifcapacity is zero, the vector will not allocate.
§Errors
Returns an error if the capacity exceedsisize::MAXbytes,or if the allocator reports allocation failure.
1.0.0 ·Sourcepub unsafe fnfrom_raw_parts( ptr:*mut T, length:usize, capacity:usize,) ->Vec<T>
pub unsafe fnfrom_raw_parts( ptr:*mut T, length:usize, capacity:usize,) ->Vec<T>
Creates aVec<T> directly from a pointer, a length, and a capacity.
§Safety
This is highly unsafe, due to the number of invariants that aren’tchecked:
- If
Tis not a zero-sized type and the capacity is nonzero,ptrmust havebeen allocated using the global allocator, such as via thealloc::allocfunction. IfTis a zero-sized type or the capacity is zero,ptrneedonly be non-null and aligned. Tneeds to have the same alignment as whatptrwas allocated with,if the pointer is required to be allocated.(Thaving a less strict alignment is not sufficient, the alignment reallyneeds to be equal to satisfy thedeallocrequirement that memory must beallocated and deallocated with the same layout.)- The size of
Ttimes thecapacity(ie. the allocated size in bytes), ifnonzero, needs to be the same size as the pointer was allocated with.(Because similar to alignment,deallocmust be called with the samelayoutsize.) lengthneeds to be less than or equal tocapacity.- The first
lengthvalues must be properly initialized values of typeT. capacityneeds to be the capacity that the pointer was allocated with,if the pointer is required to be allocated.- The allocated size in bytes must be no larger than
isize::MAX.See the safety documentation ofpointer::offset.
These requirements are always upheld by anyptr that has been allocatedviaVec<T>. Other allocation sources are allowed if the invariants areupheld.
Violating these may cause problems like corrupting the allocator’sinternal data structures. For example it is normallynot safeto build aVec<u8> from a pointer to a Cchar array with lengthsize_t, doing so is only safe if the array was initially allocated byaVec orString.It’s also not safe to build one from aVec<u16> and its length, becausethe allocator cares about the alignment, and these two types have differentalignments. The buffer was allocated with alignment 2 (foru16), but afterturning it into aVec<u8> it’ll be deallocated with alignment 1. To avoidthese issues, it is often preferable to do casting/transmuting usingslice::from_raw_parts instead.
The ownership ofptr is effectively transferred to theVec<T> which may then deallocate, reallocate or change thecontents of memory pointed to by the pointer at will. Ensurethat nothing else uses the pointer after calling thisfunction.
§Examples
usestd::ptr;letv =vec![1,2,3];// Deconstruct the vector into parts.let(p, len, cap) = v.into_raw_parts();unsafe{// Overwrite memory with 4, 5, 6foriin0..len { ptr::write(p.add(i),4+ i); }// Put everything back together into a Vecletrebuilt = Vec::from_raw_parts(p, len, cap);assert_eq!(rebuilt, [4,5,6]);}Using memory that was allocated elsewhere:
usestd::alloc::{alloc, Layout};fnmain() {letlayout = Layout::array::<u32>(16).expect("overflow cannot happen");letvec =unsafe{letmem = alloc(layout).cast::<u32>();ifmem.is_null() {return; } mem.write(1_000_000); Vec::from_raw_parts(mem,1,16) };assert_eq!(vec,&[1_000_000]);assert_eq!(vec.capacity(),16);}Sourcepub unsafe fnfrom_parts( ptr:NonNull<T>, length:usize, capacity:usize,) ->Vec<T>
🔬This is a nightly-only experimental API. (box_vec_non_null #130364)
pub unsafe fnfrom_parts( ptr:NonNull<T>, length:usize, capacity:usize,) ->Vec<T>
box_vec_non_null #130364)Creates aVec<T> directly from aNonNull pointer, a length, and a capacity.
§Safety
This is highly unsafe, due to the number of invariants that aren’tchecked:
ptrmust have been allocated using the global allocator, such as viathealloc::allocfunction.Tneeds to have the same alignment as whatptrwas allocated with.(Thaving a less strict alignment is not sufficient, the alignment reallyneeds to be equal to satisfy thedeallocrequirement that memory must beallocated and deallocated with the same layout.)- The size of
Ttimes thecapacity(ie. the allocated size in bytes) needsto be the same size as the pointer was allocated with. (Because similar toalignment,deallocmust be called with the same layoutsize.) lengthneeds to be less than or equal tocapacity.- The first
lengthvalues must be properly initialized values of typeT. capacityneeds 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 ofpointer::offset.
These requirements are always upheld by anyptr that has been allocatedviaVec<T>. Other allocation sources are allowed if the invariants areupheld.
Violating these may cause problems like corrupting the allocator’sinternal data structures. For example it is normallynot safeto build aVec<u8> from a pointer to a Cchar array with lengthsize_t, doing so is only safe if the array was initially allocated byaVec orString.It’s also not safe to build one from aVec<u16> and its length, becausethe allocator cares about the alignment, and these two types have differentalignments. The buffer was allocated with alignment 2 (foru16), but afterturning it into aVec<u8> it’ll be deallocated with alignment 1. To avoidthese issues, it is often preferable to do casting/transmuting usingNonNull::slice_from_raw_parts instead.
The ownership ofptr is effectively transferred to theVec<T> which may then deallocate, reallocate or change thecontents of memory pointed to by the pointer at will. Ensurethat nothing else uses the pointer after calling thisfunction.
§Examples
#![feature(box_vec_non_null)]letv =vec![1,2,3];// Deconstruct the vector into parts.let(p, len, cap) = v.into_parts();unsafe{// Overwrite memory with 4, 5, 6foriin0..len { p.add(i).write(4+ i); }// Put everything back together into a Vecletrebuilt = Vec::from_parts(p, len, cap);assert_eq!(rebuilt, [4,5,6]);}Using memory that was allocated elsewhere:
#![feature(box_vec_non_null)]usestd::alloc::{alloc, Layout};usestd::ptr::NonNull;fnmain() {letlayout = Layout::array::<u32>(16).expect("overflow cannot happen");letvec =unsafe{letSome(mem) = NonNull::new(alloc(layout).cast::<u32>())else{return; }; mem.write(1_000_000); Vec::from_parts(mem,1,16) };assert_eq!(vec,&[1_000_000]);assert_eq!(vec.capacity(),16);}1.93.0 ·Sourcepub fninto_raw_parts(self) -> (*mut T,usize,usize)
pub fninto_raw_parts(self) -> (*mut T,usize,usize)
Decomposes aVec<T> into its raw components:(pointer, length, capacity).
Returns the raw pointer to the underlying data, the length ofthe vector (in elements), and the allocated capacity of thedata (in elements). These are the same arguments in the sameorder as the arguments tofrom_raw_parts.
After calling this function, the caller is responsible for thememory previously managed by theVec. Most often, one doesthis by converting the raw pointer, length, and capacity backinto aVec with thefrom_raw_parts function; more generally,ifT is non-zero-sized and the capacity is nonzero, one may useany method that callsdealloc with a layout ofLayout::array::<T>(capacity); ifT is zero-sized or thecapacity is zero, nothing needs to be done.
§Examples
Sourcepub fninto_parts(self) -> (NonNull<T>,usize,usize)
🔬This is a nightly-only experimental API. (box_vec_non_null #130364)
pub fninto_parts(self) -> (NonNull<T>,usize,usize)
box_vec_non_null #130364)Decomposes aVec<T> into its raw components:(NonNull pointer, length, capacity).
Returns theNonNull pointer to the underlying data, the length ofthe vector (in elements), and the allocated capacity of thedata (in elements). These are the same arguments in the sameorder as the arguments tofrom_parts.
After calling this function, the caller is responsible for thememory previously managed by theVec. The only way to dothis is to convert theNonNull pointer, length, and capacity backinto aVec with thefrom_parts function, allowingthe destructor to perform the cleanup.
§Examples
#![feature(box_vec_non_null)]letv: Vec<i32> =vec![-1,0,1];let(ptr, len, cap) = v.into_parts();letrebuilt =unsafe{// We can now make changes to the components, such as // transmuting the raw pointer to a compatible type.letptr = ptr.cast::<u32>(); Vec::from_parts(ptr, len, cap)};assert_eq!(rebuilt, [4294967295,0,1]);Source§impl<T, A>Vec<T, A>where A:Allocator,
impl<T, A>Vec<T, A>where A:Allocator,
Sourcepub const fnnew_in(alloc: A) ->Vec<T, A>
🔬This is a nightly-only experimental API. (allocator_api #32838)
pub const fnnew_in(alloc: A) ->Vec<T, A>
allocator_api #32838)Constructs a new, emptyVec<T, A>.
The vector will not allocate until elements are pushed onto it.
§Examples
Sourcepub fnwith_capacity_in(capacity:usize, alloc: A) ->Vec<T, A>
🔬This is a nightly-only experimental API. (allocator_api #32838)
pub fnwith_capacity_in(capacity:usize, alloc: A) ->Vec<T, A>
allocator_api #32838)Constructs a new, emptyVec<T, A> with at least the specified capacitywith the provided allocator.
The vector will be able to hold at leastcapacity elements withoutreallocating. This method is allowed to allocate for more elements thancapacity. Ifcapacity is zero, the vector will not allocate.
It is important to note that although the returned vector has theminimumcapacity specified, the vector will have a zerolength. Foran explanation of the difference between length and capacity, seeCapacity and reallocation.
If it is important to know the exact allocated capacity of aVec,always use thecapacity method after construction.
ForVec<T, A> whereT is a zero-sized type, there will be no allocationand the capacity will always beusize::MAX.
§Panics
Panics if the new capacity exceedsisize::MAXbytes.
§Examples
#![feature(allocator_api)]usestd::alloc::System;letmutvec = Vec::with_capacity_in(10, System);// The vector contains no items, even though it has capacity for moreassert_eq!(vec.len(),0);assert!(vec.capacity() >=10);// These are all done without reallocating...foriin0..10{ vec.push(i);}assert_eq!(vec.len(),10);assert!(vec.capacity() >=10);// ...but this may make the vector reallocatevec.push(11);assert_eq!(vec.len(),11);assert!(vec.capacity() >=11);// A vector of a zero-sized type will always over-allocate, since no// allocation is necessaryletvec_units = Vec::<(), System>::with_capacity_in(10, System);assert_eq!(vec_units.capacity(), usize::MAX);Sourcepub fntry_with_capacity_in( capacity:usize, alloc: A,) ->Result<Vec<T, A>,TryReserveError>
🔬This is a nightly-only experimental API. (allocator_api #32838)
pub fntry_with_capacity_in( capacity:usize, alloc: A,) ->Result<Vec<T, A>,TryReserveError>
allocator_api #32838)Constructs a new, emptyVec<T, A> with at least the specified capacitywith the provided allocator.
The vector will be able to hold at leastcapacity elements withoutreallocating. This method is allowed to allocate for more elements thancapacity. Ifcapacity is zero, the vector will not allocate.
§Errors
Returns an error if the capacity exceedsisize::MAXbytes,or if the allocator reports allocation failure.
Sourcepub unsafe fnfrom_raw_parts_in( ptr:*mut T, length:usize, capacity:usize, alloc: A,) ->Vec<T, A>
🔬This is a nightly-only experimental API. (allocator_api #32838)
pub unsafe fnfrom_raw_parts_in( ptr:*mut T, length:usize, capacity:usize, alloc: A,) ->Vec<T, A>
allocator_api #32838)Creates aVec<T, A> directly from a pointer, a length, a capacity,and an allocator.
§Safety
This is highly unsafe, due to the number of invariants that aren’tchecked:
ptrmust becurrently allocated via the given allocatoralloc.Tneeds to have the same alignment as whatptrwas allocated with.(Thaving a less strict alignment is not sufficient, the alignment reallyneeds to be equal to satisfy thedeallocrequirement that memory must beallocated and deallocated with the same layout.)- The size of
Ttimes thecapacity(ie. the allocated size in bytes) needsto be the same size as the pointer was allocated with. (Because similar toalignment,deallocmust be called with the same layoutsize.) lengthneeds to be less than or equal tocapacity.- The first
lengthvalues must be properly initialized values of typeT. capacityneeds tofit the layout size that the pointer was allocated with.- The allocated size in bytes must be no larger than
isize::MAX.See the safety documentation ofpointer::offset.
These requirements are always upheld by anyptr that has been allocatedviaVec<T, A>. Other allocation sources are allowed if the invariants areupheld.
Violating these may cause problems like corrupting the allocator’sinternal data structures. For example it isnot safeto build aVec<u8> from a pointer to a Cchar array with lengthsize_t.It’s also not safe to build one from aVec<u16> and its length, becausethe allocator cares about the alignment, and these two types have differentalignments. The buffer was allocated with alignment 2 (foru16), but afterturning it into aVec<u8> it’ll be deallocated with alignment 1.
The ownership ofptr is effectively transferred to theVec<T> which may then deallocate, reallocate or change thecontents of memory pointed to by the pointer at will. Ensurethat nothing else uses the pointer after calling thisfunction.
§Examples
#![feature(allocator_api)]usestd::alloc::System;usestd::ptr;letmutv = Vec::with_capacity_in(3, System);v.push(1);v.push(2);v.push(3);// Deconstruct the vector into parts.let(p, len, cap, alloc) = v.into_raw_parts_with_alloc();unsafe{// Overwrite memory with 4, 5, 6foriin0..len { ptr::write(p.add(i),4+ i); }// Put everything back together into a Vecletrebuilt = Vec::from_raw_parts_in(p, len, cap, alloc.clone());assert_eq!(rebuilt, [4,5,6]);}Using memory that was allocated elsewhere:
#![feature(allocator_api)]usestd::alloc::{AllocError, Allocator, Global, Layout};fnmain() {letlayout = Layout::array::<u32>(16).expect("overflow cannot happen");letvec =unsafe{letmem =matchGlobal.allocate(layout) {Ok(mem) => mem.cast::<u32>().as_ptr(),Err(AllocError) =>return, }; mem.write(1_000_000); Vec::from_raw_parts_in(mem,1,16, Global) };assert_eq!(vec,&[1_000_000]);assert_eq!(vec.capacity(),16);}Sourcepub unsafe fnfrom_parts_in( ptr:NonNull<T>, length:usize, capacity:usize, alloc: A,) ->Vec<T, A>
🔬This is a nightly-only experimental API. (allocator_api #32838)
pub unsafe fnfrom_parts_in( ptr:NonNull<T>, length:usize, capacity:usize, alloc: A,) ->Vec<T, A>
allocator_api #32838)Creates aVec<T, A> directly from aNonNull pointer, a length, a capacity,and an allocator.
§Safety
This is highly unsafe, due to the number of invariants that aren’tchecked:
ptrmust becurrently allocated via the given allocatoralloc.Tneeds to have the same alignment as whatptrwas allocated with.(Thaving a less strict alignment is not sufficient, the alignment reallyneeds to be equal to satisfy thedeallocrequirement that memory must beallocated and deallocated with the same layout.)- The size of
Ttimes thecapacity(ie. the allocated size in bytes) needsto be the same size as the pointer was allocated with. (Because similar toalignment,deallocmust be called with the same layoutsize.) lengthneeds to be less than or equal tocapacity.- The first
lengthvalues must be properly initialized values of typeT. capacityneeds tofit the layout size that the pointer was allocated with.- The allocated size in bytes must be no larger than
isize::MAX.See the safety documentation ofpointer::offset.
These requirements are always upheld by anyptr that has been allocatedviaVec<T, A>. Other allocation sources are allowed if the invariants areupheld.
Violating these may cause problems like corrupting the allocator’sinternal data structures. For example it isnot safeto build aVec<u8> from a pointer to a Cchar array with lengthsize_t.It’s also not safe to build one from aVec<u16> and its length, becausethe allocator cares about the alignment, and these two types have differentalignments. The buffer was allocated with alignment 2 (foru16), but afterturning it into aVec<u8> it’ll be deallocated with alignment 1.
The ownership ofptr is effectively transferred to theVec<T> which may then deallocate, reallocate or change thecontents of memory pointed to by the pointer at will. Ensurethat nothing else uses the pointer after calling thisfunction.
§Examples
#![feature(allocator_api, box_vec_non_null)]usestd::alloc::System;letmutv = Vec::with_capacity_in(3, System);v.push(1);v.push(2);v.push(3);// Deconstruct the vector into parts.let(p, len, cap, alloc) = v.into_parts_with_alloc();unsafe{// Overwrite memory with 4, 5, 6foriin0..len { p.add(i).write(4+ i); }// Put everything back together into a Vecletrebuilt = Vec::from_parts_in(p, len, cap, alloc.clone());assert_eq!(rebuilt, [4,5,6]);}Using memory that was allocated elsewhere:
#![feature(allocator_api, box_vec_non_null)]usestd::alloc::{AllocError, Allocator, Global, Layout};fnmain() {letlayout = Layout::array::<u32>(16).expect("overflow cannot happen");letvec =unsafe{letmem =matchGlobal.allocate(layout) {Ok(mem) => mem.cast::<u32>(),Err(AllocError) =>return, }; mem.write(1_000_000); Vec::from_parts_in(mem,1,16, Global) };assert_eq!(vec,&[1_000_000]);assert_eq!(vec.capacity(),16);}Sourcepub fninto_raw_parts_with_alloc(self) -> (*mut T,usize,usize, A)
🔬This is a nightly-only experimental API. (allocator_api #32838)
pub fninto_raw_parts_with_alloc(self) -> (*mut T,usize,usize, A)
allocator_api #32838)Decomposes aVec<T> into its raw components:(pointer, length, capacity, allocator).
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 samearguments in the same order as the arguments tofrom_raw_parts_in.
After calling this function, the caller is responsible for thememory previously managed by theVec. The only way to dothis is to convert the raw pointer, length, and capacity backinto aVec with thefrom_raw_parts_in function, allowingthe destructor to perform the cleanup.
§Examples
#![feature(allocator_api)]usestd::alloc::System;letmutv: Vec<i32, System> = Vec::new_in(System);v.push(-1);v.push(0);v.push(1);let(ptr, len, cap, alloc) = v.into_raw_parts_with_alloc();letrebuilt =unsafe{// We can now make changes to the components, such as // transmuting the raw pointer to a compatible type.letptr = ptras*mutu32; Vec::from_raw_parts_in(ptr, len, cap, alloc)};assert_eq!(rebuilt, [4294967295,0,1]);Sourcepub fninto_parts_with_alloc(self) -> (NonNull<T>,usize,usize, A)
🔬This is a nightly-only experimental API. (allocator_api #32838)
pub fninto_parts_with_alloc(self) -> (NonNull<T>,usize,usize, A)
allocator_api #32838)Decomposes aVec<T> into its raw components:(NonNull pointer, length, capacity, allocator).
Returns theNonNull 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 samearguments in the same order as the arguments tofrom_parts_in.
After calling this function, the caller is responsible for thememory previously managed by theVec. The only way to dothis is to convert theNonNull pointer, length, and capacity backinto aVec with thefrom_parts_in function, allowingthe destructor to perform the cleanup.
§Examples
#![feature(allocator_api, box_vec_non_null)]usestd::alloc::System;letmutv: Vec<i32, System> = Vec::new_in(System);v.push(-1);v.push(0);v.push(1);let(ptr, len, cap, alloc) = v.into_parts_with_alloc();letrebuilt =unsafe{// We can now make changes to the components, such as // transmuting the raw pointer to a compatible type.letptr = ptr.cast::<u32>(); Vec::from_parts_in(ptr, len, cap, alloc)};assert_eq!(rebuilt, [4294967295,0,1]);1.0.0 (const: 1.87.0) ·Sourcepub const fncapacity(&self) ->usize
pub const fncapacity(&self) ->usize
Returns the total number of elements the vector can hold withoutreallocating.
§Examples
A vector with zero-sized elements will always have a capacity of usize::MAX:
1.0.0 ·Sourcepub fnreserve(&mut self, additional:usize)
pub fnreserve(&mut self, additional:usize)
Reserves capacity for at leastadditional more elements to be insertedin the givenVec<T>. The collection may reserve more space tospeculatively avoid frequent reallocations. After callingreserve,capacity will be greater than or equal toself.len() + additional.Does nothing if capacity is already sufficient.
§Panics
Panics if the new capacity exceedsisize::MAXbytes.
§Examples
1.0.0 ·Sourcepub fnreserve_exact(&mut self, additional:usize)
pub fnreserve_exact(&mut self, additional:usize)
Reserves the minimum capacity for at leastadditional more elements tobe inserted in the givenVec<T>. Unlikereserve, this will notdeliberately over-allocate to speculatively avoid frequent allocations.After callingreserve_exact, capacity will be greater than or equal toself.len() + additional. Does nothing if the capacity is alreadysufficient.
Note that the allocator may give the collection more space than itrequests. Therefore, capacity can not be relied upon to be preciselyminimal. Preferreserve if future insertions are expected.
§Panics
Panics if the new capacity exceedsisize::MAXbytes.
§Examples
1.57.0 ·Sourcepub fntry_reserve(&mut self, additional:usize) ->Result<(),TryReserveError>
pub fntry_reserve(&mut self, additional:usize) ->Result<(),TryReserveError>
Tries to reserve capacity for at leastadditional more elements to be insertedin the givenVec<T>. The collection may reserve more space to speculatively avoidfrequent reallocations. After callingtry_reserve, capacity will begreater than or equal toself.len() + additional if it returnsOk(()). Does nothing if capacity is already sufficient. This methodpreserves the contents even if an error occurs.
§Errors
If the capacity overflows, or the allocator reports a failure, then an erroris returned.
§Examples
usestd::collections::TryReserveError;fnprocess_data(data:&[u32]) ->Result<Vec<u32>, TryReserveError> {letmutoutput = Vec::new();// Pre-reserve the memory, exiting if we can'toutput.try_reserve(data.len())?;// Now we know this can't OOM in the middle of our complex workoutput.extend(data.iter().map(|&val| { val *2+5// very complicated}));Ok(output)}1.57.0 ·Sourcepub fntry_reserve_exact( &mut self, additional:usize,) ->Result<(),TryReserveError>
pub fntry_reserve_exact( &mut self, additional:usize,) ->Result<(),TryReserveError>
Tries to reserve the minimum capacity for at leastadditionalelements to be inserted in the givenVec<T>. Unliketry_reserve,this will not deliberately over-allocate to speculatively avoid frequentallocations. After callingtry_reserve_exact, capacity will be greaterthan or equal toself.len() + additional if it returnsOk(()).Does nothing if the capacity is already sufficient.
Note that the allocator may give the collection more space than itrequests. Therefore, capacity can not be relied upon to be preciselyminimal. Prefertry_reserve if future insertions are expected.
§Errors
If the capacity overflows, or the allocator reports a failure, then an erroris returned.
§Examples
usestd::collections::TryReserveError;fnprocess_data(data:&[u32]) ->Result<Vec<u32>, TryReserveError> {letmutoutput = Vec::new();// Pre-reserve the memory, exiting if we can'toutput.try_reserve_exact(data.len())?;// Now we know this can't OOM in the middle of our complex workoutput.extend(data.iter().map(|&val| { val *2+5// very complicated}));Ok(output)}1.0.0 ·Sourcepub fnshrink_to_fit(&mut self)
pub fnshrink_to_fit(&mut self)
Shrinks the capacity of the vector as much as possible.
The behavior of this method depends on the allocator, which may either shrink the vectorin-place or reallocate. The resulting vector might still have some excess capacity, just asis the case forwith_capacity. SeeAllocator::shrink for more details.
§Examples
1.56.0 ·Sourcepub fnshrink_to(&mut self, min_capacity:usize)
pub fnshrink_to(&mut self, min_capacity:usize)
Shrinks the capacity of the vector with a lower bound.
The capacity will remain at least as large as both the lengthand the supplied value.
If the current capacity is less than the lower limit, this is a no-op.
§Examples
1.0.0 ·Sourcepub fninto_boxed_slice(self) ->Box<[T], A>
pub fninto_boxed_slice(self) ->Box<[T], A>
Converts the vector intoBox<[T]>.
Before doing the conversion, this method discards excess capacity likeshrink_to_fit.
§Examples
Any excess capacity is removed:
1.0.0 ·Sourcepub fntruncate(&mut self, len:usize)
pub fntruncate(&mut self, len:usize)
Shortens the vector, keeping the firstlen elements and droppingthe rest.
Iflen is greater or equal to the vector’s current length, this hasno effect.
Thedrain method can emulatetruncate, but causes the excesselements to be returned instead of dropped.
Note that this method has no effect on the allocated capacityof the vector.
§Examples
Truncating a five element vector to two elements:
No truncation occurs whenlen is greater than the vector’s currentlength:
Truncating whenlen == 0 is equivalent to calling theclearmethod.
1.7.0 (const: 1.87.0) ·Sourcepub const fnas_slice(&self) -> &[T]
pub const fnas_slice(&self) -> &[T]
1.7.0 (const: 1.87.0) ·Sourcepub const fnas_mut_slice(&mut self) -> &mut[T]
pub const fnas_mut_slice(&mut self) -> &mut[T]
1.37.0 (const: 1.87.0) ·Sourcepub const fnas_ptr(&self) ->*const T
pub const fnas_ptr(&self) ->*const T
Returns a raw pointer to the vector’s buffer, or a dangling raw pointervalid for zero sized reads if the vector didn’t allocate.
The caller must ensure that the vector outlives the pointer thisfunction returns, or else it will end up dangling.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 tois never written to (except inside anUnsafeCell) using this pointer or any pointerderived from it. If you need to mutate the contents of the slice, useas_mut_ptr.
This method guarantees that for the purpose of the aliasing model, this methoddoes not materialize a reference to the underlying slice, and thus the returned pointerwill remain valid when mixed with other calls toas_ptr,as_mut_ptr,andas_non_null.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
letx =vec![1,2,4];letx_ptr = x.as_ptr();unsafe{foriin0..x.len() {assert_eq!(*x_ptr.add(i),1<< i); }}Due to the aliasing guarantee, the following code is legal:
1.37.0 (const: 1.87.0) ·Sourcepub const fnas_mut_ptr(&mut self) ->*mut T
pub const fnas_mut_ptr(&mut self) ->*mut T
Returns a raw mutable pointer to the vector’s buffer, or a danglingraw pointer valid for zero sized reads if the vector didn’t allocate.
The caller must ensure that the vector outlives the pointer thisfunction returns, or else it will end up dangling.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 methoddoes not materialize a reference to the underlying slice, and thus the returned pointerwill remain valid when mixed with other calls toas_ptr,as_mut_ptr,andas_non_null.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.
The method also guarantees that, as long asT is not zero-sized and the capacity isnonzero, the pointer may be passed intodealloc with a layout ofLayout::array::<T>(capacity) in order to deallocate the backing memory. If this is done,be careful not to run the destructor of theVec, as dropping it will result indouble-frees. Wrapping theVec in aManuallyDrop is the typical way to achieve this.
§Examples
// Allocate vector big enough for 4 elements.letsize =4;letmutx: Vec<i32> = Vec::with_capacity(size);letx_ptr = x.as_mut_ptr();// Initialize elements via raw pointer writes, then set length.unsafe{foriin0..size {*x_ptr.add(i) = iasi32; } x.set_len(size);}assert_eq!(&*x,&[0,1,2,3]);Due to the aliasing guarantee, the following code is legal:
unsafe{letmutv =vec![0];letptr1 = v.as_mut_ptr(); ptr1.write(1);letptr2 = v.as_mut_ptr(); ptr2.write(2);// Notably, the write to `ptr2` did *not* invalidate `ptr1`:ptr1.write(3);}Deallocating a vector usingBox (which usesdealloc internally):
Sourcepub const fnas_non_null(&mut self) ->NonNull<T>
🔬This is a nightly-only experimental API. (box_vec_non_null #130364)
pub const fnas_non_null(&mut self) ->NonNull<T>
box_vec_non_null #130364)Returns aNonNull pointer to the vector’s buffer, or a danglingNonNull pointer valid for zero sized reads if the vector didn’t allocate.
The caller must ensure that the vector outlives the pointer thisfunction returns, or else it will end up dangling.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 methoddoes not materialize a reference to the underlying slice, and thus the returned pointerwill remain valid when mixed with other calls toas_ptr,as_mut_ptr,andas_non_null.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
#![feature(box_vec_non_null)]// Allocate vector big enough for 4 elements.letsize =4;letmutx: Vec<i32> = Vec::with_capacity(size);letx_ptr = x.as_non_null();// Initialize elements via raw pointer writes, then set length.unsafe{foriin0..size { x_ptr.add(i).write(iasi32); } x.set_len(size);}assert_eq!(&*x,&[0,1,2,3]);Due to the aliasing guarantee, the following code is legal:
Sourcepub fnallocator(&self) ->&A
🔬This is a nightly-only experimental API. (allocator_api #32838)
pub fnallocator(&self) ->&A
allocator_api #32838)Returns a reference to the underlying allocator.
1.0.0 ·Sourcepub unsafe fnset_len(&mut self, new_len:usize)
pub unsafe fnset_len(&mut self, new_len:usize)
Forces the length of the vector tonew_len.
This is a low-level operation that maintains none of the normalinvariants of the type. Normally changing the length of a vectoris done using one of the safe operations instead, such astruncate,resize,extend, orclear.
§Safety
new_lenmust be less than or equal tocapacity().- The elements at
old_len..new_lenmust be initialized.
§Examples
Seespare_capacity_mut() for an example with safeinitialization of capacity elements and use of this method.
set_len() can be useful for situations in which the vectoris serving as a buffer for other code, particularly over FFI:
pub fnget_dictionary(&self) ->Option<Vec<u8>> {// Per the FFI method's docs, "32768 bytes is always enough".letmutdict = Vec::with_capacity(32_768);letmutdict_length =0;// SAFETY: When `deflateGetDictionary` returns `Z_OK`, it holds that: // 1. `dict_length` elements were initialized. // 2. `dict_length` <= the capacity (32_768) // which makes `set_len` safe to call.unsafe{// Make the FFI call...letr = deflateGetDictionary(self.strm, dict.as_mut_ptr(),&mutdict_length);ifr == Z_OK {// ...and update the length to what was initialized.dict.set_len(dict_length);Some(dict) }else{None} }}While the following example is sound, there is a memory leak sincethe inner vectors were not freed prior to theset_len call:
letmutvec =vec![vec![1,0,0],vec![0,1,0],vec![0,0,1]];// SAFETY:// 1. `old_len..0` is empty so no elements need to be initialized.// 2. `0 <= capacity` always holds whatever `capacity` is.unsafe{ vec.set_len(0);}Normally, here, one would useclear instead to correctly dropthe contents and thus not leak memory.
1.0.0 ·Sourcepub fnswap_remove(&mut self, index:usize) -> T
pub fnswap_remove(&mut self, index:usize) -> T
1.0.0 ·Sourcepub fninsert(&mut self, index:usize, element: T)
pub fninsert(&mut self, index:usize, element: T)
Inserts an element at positionindex within the vector, shifting allelements after it to the right.
§Panics
Panics ifindex > len.
§Examples
letmutvec =vec!['a','b','c'];vec.insert(1,'d');assert_eq!(vec, ['a','d','b','c']);vec.insert(4,'e');assert_eq!(vec, ['a','d','b','c','e']);§Time complexity
TakesO(Vec::len) time. All items after the insertion index must beshifted to the right. In the worst case, all elements are shifted whenthe insertion index is 0.
Sourcepub fninsert_mut(&mut self, index:usize, element: T) ->&mut T
🔬This is a nightly-only experimental API. (push_mut #135974)
pub fninsert_mut(&mut self, index:usize, element: T) ->&mut T
push_mut #135974)Inserts an element at positionindex within the vector, shifting allelements after it to the right, and returning a reference to the newelement.
§Panics
Panics ifindex > len.
§Examples
#![feature(push_mut)]letmutvec =vec![1,3,5,9];letx = vec.insert_mut(3,6);*x +=1;assert_eq!(vec, [1,3,5,7,9]);§Time complexity
TakesO(Vec::len) time. All items after the insertion index must beshifted to the right. In the worst case, all elements are shifted whenthe insertion index is 0.
1.0.0 ·Sourcepub fnremove(&mut self, index:usize) -> T
pub fnremove(&mut self, index:usize) -> T
Removes and returns the element at positionindex within the vector,shifting all elements after it to the left.
Note: Because this shifts over the remaining elements, it has aworst-case performance ofO(n). If you don’t need the order of elementsto be preserved, useswap_remove instead. If you’d like to removeelements from the beginning of theVec, consider usingVecDeque::pop_front instead.
§Panics
Panics ifindex is out of bounds.
§Examples
Sourcepub fntry_remove(&mut self, index:usize) ->Option<T>
🔬This is a nightly-only experimental API. (vec_try_remove #146954)
pub fntry_remove(&mut self, index:usize) ->Option<T>
vec_try_remove #146954)Remove and return the element at positionindex within the vector,shifting all elements after it to the left, orNone if it does notexist.
Note: Because this shifts over the remaining elements, it has aworst-case performance ofO(n). If you’d like to removeelements from the beginning of theVec, consider usingVecDeque::pop_front instead.
§Examples
1.0.0 ·Sourcepub fnretain<F>(&mut self, f: F)
pub fnretain<F>(&mut self, f: F)
Retains only the elements specified by the predicate.
In other words, remove all elementse for whichf(&e) returnsfalse.This method operates in place, visiting each element exactly once in theoriginal 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.
1.61.0 ·Sourcepub fnretain_mut<F>(&mut self, f: F)
pub fnretain_mut<F>(&mut self, f: F)
Retains only the elements specified by the predicate, passing a mutable reference to it.
In other words, remove all elementse such thatf(&mut e) returnsfalse.This method operates in place, visiting each element exactly once in theoriginal order, and preserves the order of the retained elements.
§Examples
1.16.0 ·Sourcepub fndedup_by_key<F, K>(&mut self, key: F)
pub fndedup_by_key<F, K>(&mut self, key: F)
Removes all but the first of consecutive elements in the vector that resolve to the samekey.
If the vector is sorted, this removes all duplicates.
§Examples
1.16.0 ·Sourcepub fndedup_by<F>(&mut self, same_bucket: F)
pub fndedup_by<F>(&mut self, same_bucket: F)
Removes all but the first of consecutive elements in the vector satisfying a given equalityrelation.
Thesame_bucket function is passed references to two elements from the vector andmust determine if the elements compare equal. The elements are passed in opposite orderfrom their order in the slice, so ifsame_bucket(a, b) returnstrue,a is removed.
If the vector is sorted, this removes all duplicates.
§Examples
1.0.0 ·Sourcepub fnpush(&mut self, value: T)
pub fnpush(&mut self, value: T)
Appends an element to the back of a collection.
§Panics
Panics if the new capacity exceedsisize::MAXbytes.
§Examples
§Time complexity
Takes amortizedO(1) time. If the vector’s length would exceed itscapacity after the push,O(capacity) time is taken to copy thevector’s elements to a larger allocation. This expensive operation isoffset by thecapacityO(1) insertions it allows.
Sourcepub fnpush_within_capacity(&mut self, value: T) ->Result<&mut T, T>
🔬This is a nightly-only experimental API. (vec_push_within_capacity #100486)
pub fnpush_within_capacity(&mut self, value: T) ->Result<&mut T, T>
vec_push_within_capacity #100486)Appends an element and returns a reference to it if there is sufficient spare capacity,otherwise an error is returned with the element.
Unlikepush this method will not reallocate when there’s insufficient capacity.The caller should usereserve ortry_reserve to ensure that there is enough capacity.
§Examples
A manual, panic-free alternative toFromIterator:
#![feature(vec_push_within_capacity)]usestd::collections::TryReserveError;fnfrom_iter_fallible<T>(iter:implIterator<Item=T>) ->Result<Vec<T>, TryReserveError> {letmutvec = Vec::new();forvalueiniter {if letErr(value) = vec.push_within_capacity(value) { vec.try_reserve(1)?;// this cannot fail, the previous line either returned or added at least 1 free slotlet _= vec.push_within_capacity(value); } }Ok(vec)}assert_eq!(from_iter_fallible(0..100),Ok(Vec::from_iter(0..100)));§Time complexity
TakesO(1) time.
Sourcepub fnpush_mut(&mut self, value: T) ->&mut T
🔬This is a nightly-only experimental API. (push_mut #135974)
pub fnpush_mut(&mut self, value: T) ->&mut T
push_mut #135974)Appends an element to the back of a collection, returning a reference to it.
§Panics
Panics if the new capacity exceedsisize::MAXbytes.
§Examples
#![feature(push_mut)]letmutvec =vec![1,2];letlast = vec.push_mut(3);assert_eq!(*last,3);assert_eq!(vec, [1,2,3]);letlast = vec.push_mut(3);*last +=1;assert_eq!(vec, [1,2,3,4]);§Time complexity
Takes amortizedO(1) time. If the vector’s length would exceed itscapacity after the push,O(capacity) time is taken to copy thevector’s elements to a larger allocation. This expensive operation isoffset by thecapacityO(1) insertions it allows.
1.0.0 ·Sourcepub fnpop(&mut self) ->Option<T>
pub fnpop(&mut self) ->Option<T>
Removes the last element from a vector and returns it, orNone if itis empty.
If you’d like to pop the first element, consider usingVecDeque::pop_front instead.
§Examples
§Time complexity
TakesO(1) time.
1.86.0 ·Sourcepub fnpop_if(&mut self, predicate: implFnOnce(&mut T) ->bool) ->Option<T>
pub fnpop_if(&mut self, predicate: implFnOnce(&mut T) ->bool) ->Option<T>
Sourcepub fnpeek_mut(&mut self) ->Option<PeekMut<'_, T, A>>
🔬This is a nightly-only experimental API. (vec_peek_mut #122742)
pub fnpeek_mut(&mut self) ->Option<PeekMut<'_, T, A>>
vec_peek_mut #122742)Returns a mutable reference to the last item in the vector, orNone if it is empty.
§Examples
Basic usage:
1.6.0 ·Sourcepub fndrain<R>(&mut self, range: R) ->Drain<'_, T, A>ⓘwhere R:RangeBounds<usize>,
pub fndrain<R>(&mut self, range: R) ->Drain<'_, T, A>ⓘwhere R:RangeBounds<usize>,
Removes the subslice indicated by the given range from the vector,returning a double-ended iterator over the removed subslice.
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 optimizeits implementation.
§Panics
Panics if the range hasstart_bound > end_bound, or, if the range isbounded on either end and past the length of the vector.
§Leaking
If the returned iterator goes out of scope without being dropped (due tomem::forget, for example), the vector may have lost and leakedelements arbitrarily, including elements outside the range.
§Examples
1.0.0 ·Sourcepub fnclear(&mut self)
pub fnclear(&mut self)
Clears the vector, removing all values.
Note that this method has no effect on the allocated capacityof the vector.
§Examples
1.0.0 (const: 1.87.0) ·Sourcepub const fnlen(&self) ->usize
pub const fnlen(&self) ->usize
Returns the number of elements in the vector, also referred toas its ‘length’.
§Examples
1.0.0 (const: 1.87.0) ·Sourcepub const fnis_empty(&self) ->bool
pub const fnis_empty(&self) ->bool
Returnstrue if the vector contains no elements.
§Examples
1.4.0 ·Sourcepub fnsplit_off(&mut self, at:usize) ->Vec<T, A>where A:Clone,
pub fnsplit_off(&mut self, at:usize) ->Vec<T, A>where A:Clone,
Splits the collection into two at the given index.
Returns a newly allocated vector containing the elements in the range[at, len). After the call, the original vector will be left containingthe elements[0, at) with its previous capacity unchanged.
- If you want to take ownership of the entire contents and capacity ofthe vector, see
mem::takeormem::replace. - If you don’t need the returned vector at all, see
Vec::truncate. - If you want to take ownership of an arbitrary subslice, or you don’tnecessarily want to store the removed items in a vector, see
Vec::drain.
§Panics
Panics ifat > len.
§Examples
1.33.0 ·Sourcepub fnresize_with<F>(&mut self, new_len:usize, f: F)where F:FnMut() -> T,
pub fnresize_with<F>(&mut self, new_len:usize, f: F)where F:FnMut() -> T,
Resizes theVec in-place so thatlen is equal tonew_len.
Ifnew_len is greater thanlen, theVec is extended by thedifference, with each additional slot filled with the result ofcalling the closuref. The return values fromf will end upin theVec in the order they have been generated.
Ifnew_len is less thanlen, theVec is simply truncated.
This method uses a closure to create new values on every push. Ifyou’d ratherClone a given value, useVec::resize. If youwant to use theDefault trait to generate values, you canpassDefault::default as the second argument.
§Panics
Panics if the new capacity exceedsisize::MAXbytes.
§Examples
1.47.0 ·Sourcepub fnleak<'a>(self) -> &'a mut[T]where A: 'a,
pub fnleak<'a>(self) -> &'a mut[T]where A: 'a,
Consumes and leaks theVec, returning a mutable reference to the contents,&'a mut [T].
Note that the typeT must outlive the chosen lifetime'a. If the typehas 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 theVec,so the leaked allocation may include unused capacity that is not partof the returned slice.
This function is mainly useful for data that lives for the remainder ofthe program’s life. Dropping the returned reference will cause a memoryleak.
§Examples
Simple usage:
1.60.0 ·Sourcepub fnspare_capacity_mut(&mut self) -> &mut [MaybeUninit<T>]
pub fnspare_capacity_mut(&mut self) -> &mut [MaybeUninit<T>]
Returns the remaining spare capacity of the vector as a slice ofMaybeUninit<T>.
The returned slice can be used to fill the vector with data (e.g. byreading from a file) before marking the data as initialized using theset_len method.
§Examples
// Allocate vector big enough for 10 elements.letmutv = Vec::with_capacity(10);// Fill in the first 3 elements.letuninit = v.spare_capacity_mut();uninit[0].write(0);uninit[1].write(1);uninit[2].write(2);// Mark the first 3 elements of the vector as being initialized.unsafe{ v.set_len(3);}assert_eq!(&v,&[0,1,2]);Sourcepub fnsplit_at_spare_mut(&mut self) -> (&mut[T], &mut [MaybeUninit<T>])
🔬This is a nightly-only experimental API. (vec_split_at_spare #81944)
pub fnsplit_at_spare_mut(&mut self) -> (&mut[T], &mut [MaybeUninit<T>])
vec_split_at_spare #81944)Returns vector content as a slice ofT, along with the remaining sparecapacity of the vector as a slice ofMaybeUninit<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 usingtheset_len method.
Note that this is a low-level API, which should be used with care foroptimization purposes. If you need to append data to aVecyou can usepush,extend,extend_from_slice,extend_from_within,insert,append,resize orresize_with, depending on your exact needs.
§Examples
#![feature(vec_split_at_spare)]letmutv =vec![1,1,2];// Reserve additional space big enough for 10 elements.v.reserve(10);let(init, uninit) = v.split_at_spare_mut();letsum = init.iter().copied().sum::<u32>();// Fill in the next 4 elements.uninit[0].write(sum);uninit[1].write(sum *2);uninit[2].write(sum *3);uninit[3].write(sum *4);// Mark the 4 elements of the vector as being initialized.unsafe{letlen = v.len(); v.set_len(len +4);}assert_eq!(&v,&[1,1,2,4,8,12,16]);Sourcepub fninto_chunks<const N:usize>(self) ->Vec<[T; N], A>
🔬This is a nightly-only experimental API. (vec_into_chunks #142137)
pub fninto_chunks<const N:usize>(self) ->Vec<[T; N], A>
vec_into_chunks #142137)Groups everyN elements in theVec<T> into chunks to produce aVec<[T; N]>, droppingelements in the remainder.N must be greater than zero.
If the capacity is not a multiple of the chunk size, the buffer will shrink down to thenearest multiple with a reallocation or deallocation.
This function can be used to reverseVec::into_flattened.
§Examples
#![feature(vec_into_chunks)]letvec =vec![0,1,2,3,4,5,6,7];assert_eq!(vec.into_chunks::<3>(), [[0,1,2], [3,4,5]]);letvec =vec![0,1,2,3];letchunks: Vec<[u8;10]> = vec.into_chunks();assert!(chunks.is_empty());letflat =vec![0;8*8*8];letreshaped: Vec<[[[u8;8];8];8]> = flat.into_chunks().into_chunks().into_chunks();assert_eq!(reshaped.len(),1);Sourcepub fnrecycle<U>(self) ->Vec<U, A>where U: Recyclable<T>,
🔬This is a nightly-only experimental API. (vec_recycle #148227)
pub fnrecycle<U>(self) ->Vec<U, A>where U: Recyclable<T>,
vec_recycle #148227)This clears out thisVec and recycles the allocation into a newVec.The item type of the resultingVec needs to have the same size andalignment as the item type of the originalVec.
§Examples
#![feature(vec_recycle, transmutability)]leta: Vec<u8> =vec![0;100];letcapacity = a.capacity();letaddr = a.as_ptr().addr();letb: Vec<i8> = a.recycle();assert_eq!(b.len(),0);assert_eq!(b.capacity(), capacity);assert_eq!(b.as_ptr().addr(), addr);TheRecyclable bound prevents this method from being called whenT andU have different sizes; e.g.:
#![feature(vec_recycle, transmutability)]letvec: Vec<[u8;2]> = Vec::new();let _: Vec<[u8;1]> = vec.recycle();…or different alignments:
#![feature(vec_recycle, transmutability)]letvec: Vec<[u16;0]> = Vec::new();let _: Vec<[u8;0]> = vec.recycle();However, due to temporary implementation limitations ofRecyclable,this method is not yet callable whenT orU are slices, trait objects,or other exotic types; e.g.:
#![feature(vec_recycle, transmutability)]letmutstorage: Vec<&[&str]> = Vec::new();forinputininputs {letmutbuffer: Vec<&str> = storage.recycle(); buffer.extend(input.split(" ")); process(&buffer); storage = buffer.recycle();}Source§impl<T, A>Vec<T, A>
impl<T, A>Vec<T, A>
1.5.0 ·Sourcepub fnresize(&mut self, new_len:usize, value: T)
pub fnresize(&mut self, new_len:usize, value: T)
Resizes theVec in-place so thatlen is equal tonew_len.
Ifnew_len is greater thanlen, theVec is extended by thedifference, with each additional slot filled withvalue.Ifnew_len is less thanlen, theVec is simply truncated.
This method requiresT to implementClone,in order to be able to clone the passed value.If you need more flexibility (or want to rely onDefault instead ofClone), useVec::resize_with.If you only need to resize to a smaller size, useVec::truncate.
§Panics
Panics if the new capacity exceedsisize::MAXbytes.
§Examples
1.6.0 ·Sourcepub fnextend_from_slice(&mut self, other: &[T])
pub fnextend_from_slice(&mut self, other: &[T])
Clones and appends all elements in a slice to theVec.
Iterates over the sliceother, clones each element, and then appendsit to thisVec. Theother slice is traversed in-order.
Note that this function is the same asextend,except that it also works with slice elements that are Clone but not Copy.If Rust gets specialization this function may be deprecated.
§Panics
Panics if the new capacity exceedsisize::MAXbytes.
§Examples
1.53.0 ·Sourcepub fnextend_from_within<R>(&mut self, src: R)where R:RangeBounds<usize>,
pub fnextend_from_within<R>(&mut self, src: R)where R:RangeBounds<usize>,
Given a rangesrc, clones a slice of elements in that range and appends it to the end.
src must be a range that can form a valid subslice of theVec.
§Panics
Panics if starting index is greater than the end index, if the index isgreater than the length of the vector, or if the new capacity exceedsisize::MAXbytes.
§Examples
letmutcharacters =vec!['a','b','c','d','e'];characters.extend_from_within(2..);assert_eq!(characters, ['a','b','c','d','e','c','d','e']);letmutnumbers =vec![0,1,2,3,4];numbers.extend_from_within(..2);assert_eq!(numbers, [0,1,2,3,4,0,1]);letmutstrings =vec![String::from("hello"), String::from("world"), String::from("!")];strings.extend_from_within(1..=2);assert_eq!(strings, ["hello","world","!","world","!"]);Source§impl<T, A, const N:usize>Vec<[T; N], A>where A:Allocator,
impl<T, A, const N:usize>Vec<[T; N], A>where A:Allocator,
1.80.0 ·Sourcepub fninto_flattened(self) ->Vec<T, A>
pub fninto_flattened(self) ->Vec<T, A>
Source§impl<T, A>Vec<T, A>where A:Allocator,
impl<T, A>Vec<T, A>where A:Allocator,
1.21.0 ·Sourcepub fnsplice<R, I>( &mut self, range: R, replace_with: I,) ->Splice<'_, <I asIntoIterator>::IntoIter, A>ⓘ
pub fnsplice<R, I>( &mut self, range: R, replace_with: I,) ->Splice<'_, <I asIntoIterator>::IntoIter, A>ⓘ
Creates a splicing iterator that replaces the specified range in the vectorwith the givenreplace_with iterator and yields the removed items.replace_with does not need to be the same length asrange.
range is removed even if theSplice iterator is not consumed before it is dropped.
It is unspecified how many elements are removed from the vectorif theSplice value is leaked.
The input iteratorreplace_with is only consumed when theSplice value is dropped.
This is optimal if:
- The tail (elements in the vector after
range) is empty, - or
replace_withyields fewer or equal elements thanrange’s length - or the lower bound of its
size_hint()is exact.
Otherwise, a temporary vector is allocated and the tail is moved twice.
§Panics
Panics if the range hasstart_bound > end_bound, or, if the range isbounded on either end and past the length of the vector.
§Examples
letmutv =vec![1,2,3,4];letnew = [7,8,9];letu: Vec<_> = v.splice(1..3, new).collect();assert_eq!(v, [1,7,8,9,4]);assert_eq!(u, [2,3]);Usingsplice to insert new items into a vector efficiently at a specific positionindicated by an empty range:
1.87.0 ·Sourcepub fnextract_if<F, R>( &mut self, range: R, filter: F,) ->ExtractIf<'_, T, F, A>ⓘ
pub fnextract_if<F, R>( &mut self, range: R, filter: F,) ->ExtractIf<'_, T, F, A>ⓘ
Creates an iterator which uses a closure to determine if an element in the range should be removed.
If the closure returnstrue, the element is removed from the vectorand yielded. If the closure returnsfalse, or panics, the elementremains in the vector and will not be yielded.
Only elements that fall in the provided range are considered for extraction, but any elementsafter the range will still have to be moved if any element has been extracted.
If the returnedExtractIf is not exhausted, e.g. because it is dropped without iteratingor the iteration short-circuits, then the remaining elements will be retained.Useextract_if().for_each(drop) if you do not need the returned iterator,orretain_mut with a negated predicate if you also do not need to restrict the range.
Using this method is equivalent to the following code:
letmuti = range.start;letend_items = vec.len() - range.end;whilei < vec.len() - end_items {ifsome_predicate(&mutvec[i]) {letval = vec.remove(i);// your code here}else{ i +=1; }}Butextract_if is easier to use.extract_if is also more efficient,because it can backshift the elements of the array in bulk.
The iterator also lets you mutate the value of each element in theclosure, regardless of whether you choose to keep or remove it.
§Panics
Ifrange is out of bounds.
§Examples
Splitting a vector into even and odd values, reusing the original vector:
letmutnumbers =vec![1,2,3,4,5,6,8,9,11,13,14,15];letevens = numbers.extract_if(.., |x|*x %2==0).collect::<Vec<_>>();letodds = numbers;assert_eq!(evens,vec![2,4,6,8,14]);assert_eq!(odds,vec![1,3,5,9,11,13,15]);Using the range argument to only process a part of the vector:
Methods fromDeref<Target =[T]>§
1.0.0 ·Sourcepub fnfirst(&self) ->Option<&T>
pub fnfirst(&self) ->Option<&T>
Returns the first element of the slice, orNone if it is empty.
§Examples
1.0.0 ·Sourcepub fnfirst_mut(&mut self) ->Option<&mut T>
pub fnfirst_mut(&mut self) ->Option<&mut T>
Returns a mutable reference to the first element of the slice, orNone if it is empty.
§Examples
1.5.0 ·Sourcepub fnsplit_first(&self) ->Option<(&T, &[T])>
pub fnsplit_first(&self) ->Option<(&T, &[T])>
Returns the first and all the rest of the elements of the slice, orNone if it is empty.
§Examples
1.5.0 ·Sourcepub fnsplit_first_mut(&mut self) ->Option<(&mut T, &mut[T])>
pub fnsplit_first_mut(&mut self) ->Option<(&mut T, &mut[T])>
Returns the first and all the rest of the elements of the slice, orNone if it is empty.
§Examples
1.5.0 ·Sourcepub fnsplit_last(&self) ->Option<(&T, &[T])>
pub fnsplit_last(&self) ->Option<(&T, &[T])>
Returns the last and all the rest of the elements of the slice, orNone if it is empty.
§Examples
1.5.0 ·Sourcepub fnsplit_last_mut(&mut self) ->Option<(&mut T, &mut[T])>
pub fnsplit_last_mut(&mut self) ->Option<(&mut T, &mut[T])>
Returns the last and all the rest of the elements of the slice, orNone if it is empty.
§Examples
1.0.0 ·Sourcepub fnlast(&self) ->Option<&T>
pub fnlast(&self) ->Option<&T>
Returns the last element of the slice, orNone if it is empty.
§Examples
1.0.0 ·Sourcepub fnlast_mut(&mut self) ->Option<&mut T>
pub fnlast_mut(&mut self) ->Option<&mut T>
Returns a mutable reference to the last item in the slice, orNone if it is empty.
§Examples
1.77.0 ·Sourcepub fnfirst_chunk<const N:usize>(&self) ->Option<&[T; N]>
pub fnfirst_chunk<const N:usize>(&self) ->Option<&[T; N]>
Returns an array reference to the firstN items in the slice.
If the slice is not at leastN in length, this will returnNone.
§Examples
1.77.0 ·Sourcepub fnfirst_chunk_mut<const N:usize>(&mut self) ->Option<&mut[T; N]>
pub fnfirst_chunk_mut<const N:usize>(&mut self) ->Option<&mut[T; N]>
Returns a mutable array reference to the firstN items in the slice.
If the slice is not at leastN in length, this will returnNone.
§Examples
1.77.0 ·Sourcepub fnsplit_first_chunk<const N:usize>(&self) ->Option<(&[T; N], &[T])>
pub fnsplit_first_chunk<const N:usize>(&self) ->Option<(&[T; N], &[T])>
Returns an array reference to the firstN items in the slice and the remaining slice.
If the slice is not at leastN in length, this will returnNone.
§Examples
1.77.0 ·Sourcepub fnsplit_first_chunk_mut<const N:usize>( &mut self,) ->Option<(&mut[T; N], &mut[T])>
pub fnsplit_first_chunk_mut<const N:usize>( &mut self,) ->Option<(&mut[T; N], &mut[T])>
Returns a mutable array reference to the firstN items in the slice and the remainingslice.
If the slice is not at leastN in length, this will returnNone.
§Examples
1.77.0 ·Sourcepub fnsplit_last_chunk<const N:usize>(&self) ->Option<(&[T], &[T; N])>
pub fnsplit_last_chunk<const N:usize>(&self) ->Option<(&[T], &[T; N])>
Returns an array reference to the lastN items in the slice and the remaining slice.
If the slice is not at leastN in length, this will returnNone.
§Examples
1.77.0 ·Sourcepub fnsplit_last_chunk_mut<const N:usize>( &mut self,) ->Option<(&mut[T], &mut[T; N])>
pub fnsplit_last_chunk_mut<const N:usize>( &mut self,) ->Option<(&mut[T], &mut[T; N])>
Returns a mutable array reference to the lastN items in the slice and the remainingslice.
If the slice is not at leastN in length, this will returnNone.
§Examples
1.77.0 ·Sourcepub fnlast_chunk<const N:usize>(&self) ->Option<&[T; N]>
pub fnlast_chunk<const N:usize>(&self) ->Option<&[T; N]>
Returns an array reference to the lastN items in the slice.
If the slice is not at leastN in length, this will returnNone.
§Examples
1.77.0 ·Sourcepub fnlast_chunk_mut<const N:usize>(&mut self) ->Option<&mut[T; N]>
pub fnlast_chunk_mut<const N:usize>(&mut self) ->Option<&mut[T; N]>
Returns a mutable array reference to the lastN items in the slice.
If the slice is not at leastN in length, this will returnNone.
§Examples
1.0.0 ·Sourcepub fnget<I>(&self, index: I) ->Option<&<I asSliceIndex<[T]>>::Output>where I:SliceIndex<[T]>,
pub fnget<I>(&self, index: I) ->Option<&<I asSliceIndex<[T]>>::Output>where I:SliceIndex<[T]>,
Returns a reference to an element or subslice depending on the type ofindex.
- If given a position, returns a reference to the element at thatposition or
Noneif out of bounds. - If given a range, returns the subslice corresponding to that range,or
Noneif out of bounds.
§Examples
1.0.0 ·Sourcepub fnget_mut<I>( &mut self, index: I,) ->Option<&mut <I asSliceIndex<[T]>>::Output>where I:SliceIndex<[T]>,
pub fnget_mut<I>( &mut self, index: I,) ->Option<&mut <I asSliceIndex<[T]>>::Output>where I:SliceIndex<[T]>,
1.0.0 ·Sourcepub unsafe fnget_unchecked<I>( &self, index: I,) -> &<I asSliceIndex<[T]>>::Outputwhere I:SliceIndex<[T]>,
pub unsafe fnget_unchecked<I>( &self, index: I,) -> &<I asSliceIndex<[T]>>::Outputwhere I:SliceIndex<[T]>,
Returns a reference to an element or subslice, without doing boundschecking.
For a safe alternative seeget.
§Safety
Calling this method with an out-of-bounds index isundefined behavioreven if the resulting reference is not used.
You can think of this like.get(index).unwrap_unchecked(). It’s UBto call.get_unchecked(len), even if you immediately convert to apointer. And it’s UB to call.get_unchecked(..len + 1),.get_unchecked(..=len), or similar.
§Examples
1.0.0 ·Sourcepub unsafe fnget_unchecked_mut<I>( &mut self, index: I,) -> &mut <I asSliceIndex<[T]>>::Outputwhere I:SliceIndex<[T]>,
pub unsafe fnget_unchecked_mut<I>( &mut self, index: I,) -> &mut <I asSliceIndex<[T]>>::Outputwhere I:SliceIndex<[T]>,
Returns a mutable reference to an element or subslice, without doingbounds checking.
For a safe alternative seeget_mut.
§Safety
Calling this method with an out-of-bounds index isundefined behavioreven if the resulting reference is not used.
You can think of this like.get_mut(index).unwrap_unchecked(). It’sUB to call.get_unchecked_mut(len), even if you immediately convertto a pointer. And it’s UB to call.get_unchecked_mut(..len + 1),.get_unchecked_mut(..=len), or similar.
§Examples
1.0.0 ·Sourcepub fnas_ptr(&self) ->*const T
pub fnas_ptr(&self) ->*const T
Returns a raw pointer to the slice’s buffer.
The caller must ensure that the slice outlives the pointer thisfunction returns, or else it will end up dangling.
The caller must also ensure that the memory the pointer (non-transitively) points tois never written to (except inside anUnsafeCell) using this pointer or any pointerderived from it. If you need to mutate the contents of the slice, useas_mut_ptr.
Modifying the container referenced by this slice may cause its bufferto be reallocated, which would also make any pointers to it invalid.
§Examples
1.0.0 ·Sourcepub fnas_mut_ptr(&mut self) ->*mut T
pub fnas_mut_ptr(&mut self) ->*mut T
Returns an unsafe mutable pointer to the slice’s buffer.
The caller must ensure that the slice outlives the pointer thisfunction returns, or else it will end up dangling.
Modifying the container referenced by this slice may cause its bufferto be reallocated, which would also make any pointers to it invalid.
§Examples
1.48.0 ·Sourcepub fnas_ptr_range(&self) ->Range<*const T>ⓘ
pub fnas_ptr_range(&self) ->Range<*const T>ⓘ
Returns the two raw pointers spanning the slice.
The returned range is half-open, which means that the end pointerpointsone past the last element of the slice. This way, an emptyslice is represented by two equal pointers, and the difference betweenthe two pointers represents the size of the slice.
Seeas_ptr for warnings on using these pointers. The end pointerrequires extra caution, as it does not point to a valid element in theslice.
This function is useful for interacting with foreign interfaces whichuse two pointers to refer to a range of elements in memory, as iscommon in C++.
It can also be useful to check if a pointer to an element refers to anelement of this slice:
1.48.0 ·Sourcepub fnas_mut_ptr_range(&mut self) ->Range<*mut T>ⓘ
pub fnas_mut_ptr_range(&mut self) ->Range<*mut T>ⓘ
Returns the two unsafe mutable pointers spanning the slice.
The returned range is half-open, which means that the end pointerpointsone past the last element of the slice. This way, an emptyslice is represented by two equal pointers, and the difference betweenthe two pointers represents the size of the slice.
Seeas_mut_ptr for warnings on using these pointers. The endpointer requires extra caution, as it does not point to a valid elementin the slice.
This function is useful for interacting with foreign interfaces whichuse two pointers to refer to a range of elements in memory, as iscommon in C++.
1.93.0 ·Sourcepub fnas_array<const N:usize>(&self) ->Option<&[T; N]>
pub fnas_array<const N:usize>(&self) ->Option<&[T; N]>
Gets a reference to the underlying array.
IfN is not exactly equal to the length ofself, then this method returnsNone.
1.93.0 ·Sourcepub fnas_mut_array<const N:usize>(&mut self) ->Option<&mut[T; N]>
pub fnas_mut_array<const N:usize>(&mut self) ->Option<&mut[T; N]>
Gets a mutable reference to the slice’s underlying array.
IfN is not exactly equal to the length ofself, then this method returnsNone.
1.0.0 ·Sourcepub fnswap(&mut self, a:usize, b:usize)
pub fnswap(&mut self, a:usize, b:usize)
Sourcepub unsafe fnswap_unchecked(&mut self, a:usize, b:usize)
🔬This is a nightly-only experimental API. (slice_swap_unchecked #88539)
pub unsafe fnswap_unchecked(&mut self, a:usize, b:usize)
slice_swap_unchecked #88539)Swaps two elements in the slice, without doing bounds checking.
For a safe alternative seeswap.
§Arguments
- a - The index of the first element
- b - The index of the second element
§Safety
Calling this method with an out-of-bounds index isundefined behavior.The caller has to ensure thata < self.len() andb < self.len().
§Examples
1.0.0 ·Sourcepub fnreverse(&mut self)
pub fnreverse(&mut self)
Reverses the order of elements in the slice, in place.
§Examples
1.0.0 ·Sourcepub fniter(&self) ->Iter<'_, T>ⓘ
pub fniter(&self) ->Iter<'_, T>ⓘ
1.0.0 ·Sourcepub fniter_mut(&mut self) ->IterMut<'_, T>ⓘ
pub fniter_mut(&mut self) ->IterMut<'_, T>ⓘ
Returns an iterator that allows modifying each value.
The iterator yields all items from start to end.
§Examples
1.0.0 ·Sourcepub fnwindows(&self, size:usize) ->Windows<'_, T>ⓘ
pub fnwindows(&self, size:usize) ->Windows<'_, T>ⓘ
Returns an iterator over all contiguous windows of lengthsize. The windows overlap. If the slice is shorter thansize, the iterator returns no values.
§Panics
Panics ifsize is zero.
§Examples
letslice = ['l','o','r','e','m'];letmutiter = 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());If the slice is shorter thansize:
Because theIterator trait cannot represent the required lifetimes,there is nowindows_mut analog towindows;[0,1,2].windows_mut(2).collect() would violatethe rules of references(though aLendingIterator analog is possible). You can sometimes useCell::as_slice_of_cells inconjunction withwindows instead:
1.0.0 ·Sourcepub fnchunks(&self, chunk_size:usize) ->Chunks<'_, T>ⓘ
pub fnchunks(&self, chunk_size:usize) ->Chunks<'_, T>ⓘ
Returns an iterator overchunk_size elements of the slice at a time, starting at thebeginning of the slice.
The chunks are slices and do not overlap. Ifchunk_size does not divide the length of theslice, then the last chunk will not have lengthchunk_size.
Seechunks_exact for a variant of this iterator that returns chunks of always exactlychunk_size elements, andrchunks for the same iterator but starting at the end of theslice.
If yourchunk_size is a constant, consider usingas_chunks instead, which willgive references to arrays of exactly that length, rather than slices.
§Panics
Panics ifchunk_size is zero.
§Examples
1.0.0 ·Sourcepub fnchunks_mut(&mut self, chunk_size:usize) ->ChunksMut<'_, T>ⓘ
pub fnchunks_mut(&mut self, chunk_size:usize) ->ChunksMut<'_, T>ⓘ
Returns an iterator overchunk_size elements of the slice at a time, starting at thebeginning of the slice.
The chunks are mutable slices, and do not overlap. Ifchunk_size does not divide thelength of the slice, then the last chunk will not have lengthchunk_size.
Seechunks_exact_mut for a variant of this iterator that returns chunks of alwaysexactlychunk_size elements, andrchunks_mut for the same iterator but starting atthe end of the slice.
If yourchunk_size is a constant, consider usingas_chunks_mut instead, which willgive references to arrays of exactly that length, rather than slices.
§Panics
Panics ifchunk_size is zero.
§Examples
1.31.0 ·Sourcepub fnchunks_exact(&self, chunk_size:usize) ->ChunksExact<'_, T>ⓘ
pub fnchunks_exact(&self, chunk_size:usize) ->ChunksExact<'_, T>ⓘ
Returns an iterator overchunk_size elements of the slice at a time, starting at thebeginning of the slice.
The chunks are slices and do not overlap. Ifchunk_size does not divide the length of theslice, then the last up tochunk_size-1 elements will be omitted and can be retrievedfrom theremainder function of the iterator.
Due to each chunk having exactlychunk_size elements, the compiler can often optimize theresulting code better than in the case ofchunks.
Seechunks for a variant of this iterator that also returns the remainder as a smallerchunk, andrchunks_exact for the same iterator but starting at the end of the slice.
If yourchunk_size is a constant, consider usingas_chunks instead, which willgive references to arrays of exactly that length, rather than slices.
§Panics
Panics ifchunk_size is zero.
§Examples
1.31.0 ·Sourcepub fnchunks_exact_mut(&mut self, chunk_size:usize) ->ChunksExactMut<'_, T>ⓘ
pub fnchunks_exact_mut(&mut self, chunk_size:usize) ->ChunksExactMut<'_, T>ⓘ
Returns an iterator overchunk_size elements of the slice at a time, starting at thebeginning of the slice.
The chunks are mutable slices, and do not overlap. Ifchunk_size does not divide thelength of the slice, then the last up tochunk_size-1 elements will be omitted and can beretrieved from theinto_remainder function of the iterator.
Due to each chunk having exactlychunk_size elements, the compiler can often optimize theresulting code better than in the case ofchunks_mut.
Seechunks_mut for a variant of this iterator that also returns the remainder as asmaller chunk, andrchunks_exact_mut for the same iterator but starting at the end ofthe slice.
If yourchunk_size is a constant, consider usingas_chunks_mut instead, which willgive references to arrays of exactly that length, rather than slices.
§Panics
Panics ifchunk_size is zero.
§Examples
1.88.0 ·Sourcepub unsafe fnas_chunks_unchecked<const N:usize>(&self) -> &[[T; N]]
pub unsafe fnas_chunks_unchecked<const N:usize>(&self) -> &[[T; N]]
Splits the slice into a slice ofN-element arrays,assuming that there’s no remainder.
This is the inverse operation toas_flattened.
As this isunsafe, consider whether you could useas_chunks oras_rchunks instead, perhaps via something likeif let (chunks, []) = slice.as_chunks() orlet (chunks, []) = slice.as_chunks() else { unreachable!() };.
§Safety
This may only be called when
- The slice splits exactly into
N-element chunks (akaself.len() % N == 0). N != 0.
§Examples
letslice:&[char] =&['l','o','r','e','m','!'];letchunks:&[[char;1]] =// SAFETY: 1-element chunks never have remainderunsafe{ slice.as_chunks_unchecked() };assert_eq!(chunks,&[['l'], ['o'], ['r'], ['e'], ['m'], ['!']]);letchunks:&[[char;3]] =// SAFETY: The slice length (6) is a multiple of 3unsafe{ slice.as_chunks_unchecked() };assert_eq!(chunks,&[['l','o','r'], ['e','m','!']]);// These would be unsound:// let chunks: &[[_; 5]] = slice.as_chunks_unchecked() // The slice length is not a multiple of 5// let chunks: &[[_; 0]] = slice.as_chunks_unchecked() // Zero-length chunks are never allowed1.88.0 ·Sourcepub fnas_chunks<const N:usize>(&self) -> (&[[T; N]], &[T])
pub fnas_chunks<const N:usize>(&self) -> (&[[T; N]], &[T])
Splits the slice into a slice ofN-element arrays,starting at the beginning of the slice,and a remainder slice with length strictly less thanN.
The remainder is meaningful in the division sense. Givenlet (chunks, remainder) = slice.as_chunks(), then:
chunks.len()equalsslice.len() / N,remainder.len()equalsslice.len() % N, andslice.len()equalschunks.len() * N + remainder.len().
You can flatten the chunks back into a slice-of-T withas_flattened.
§Panics
Panics ifN is zero.
Note that this check is against a const generic parameter, not a runtimevalue, and thus a particular monomorphization will either always panicor it will never panic.
§Examples
letslice = ['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 combinelet-else with an empty slice pattern:
1.88.0 ·Sourcepub fnas_rchunks<const N:usize>(&self) -> (&[T], &[[T; N]])
pub fnas_rchunks<const N:usize>(&self) -> (&[T], &[[T; N]])
Splits the slice into a slice ofN-element arrays,starting at the end of the slice,and a remainder slice with length strictly less thanN.
The remainder is meaningful in the division sense. Givenlet (remainder, chunks) = slice.as_rchunks(), then:
remainder.len()equalsslice.len() % N,chunks.len()equalsslice.len() / N, andslice.len()equalschunks.len() * N + remainder.len().
You can flatten the chunks back into a slice-of-T withas_flattened.
§Panics
Panics ifN is zero.
Note that this check is against a const generic parameter, not a runtimevalue, and thus a particular monomorphization will either always panicor it will never panic.
§Examples
1.88.0 ·Sourcepub unsafe fnas_chunks_unchecked_mut<const N:usize>( &mut self,) -> &mut [[T; N]]
pub unsafe fnas_chunks_unchecked_mut<const N:usize>( &mut self,) -> &mut [[T; N]]
Splits the slice into a slice ofN-element arrays,assuming that there’s no remainder.
This is the inverse operation toas_flattened_mut.
As this isunsafe, consider whether you could useas_chunks_mut oras_rchunks_mut instead, perhaps via something likeif let (chunks, []) = slice.as_chunks_mut() orlet (chunks, []) = slice.as_chunks_mut() else { unreachable!() };.
§Safety
This may only be called when
- The slice splits exactly into
N-element chunks (akaself.len() % N == 0). N != 0.
§Examples
letslice:&mut[char] =&mut['l','o','r','e','m','!'];letchunks:&mut[[char;1]] =// SAFETY: 1-element chunks never have remainderunsafe{ slice.as_chunks_unchecked_mut() };chunks[0] = ['L'];assert_eq!(chunks,&[['L'], ['o'], ['r'], ['e'], ['m'], ['!']]);letchunks:&mut[[char;3]] =// SAFETY: The slice length (6) is a multiple of 3unsafe{ slice.as_chunks_unchecked_mut() };chunks[1] = ['a','x','?'];assert_eq!(slice,&['L','o','r','a','x','?']);// These would be unsound:// let chunks: &[[_; 5]] = slice.as_chunks_unchecked_mut() // The slice length is not a multiple of 5// let chunks: &[[_; 0]] = slice.as_chunks_unchecked_mut() // Zero-length chunks are never allowed1.88.0 ·Sourcepub fnas_chunks_mut<const N:usize>(&mut self) -> (&mut [[T; N]], &mut[T])
pub fnas_chunks_mut<const N:usize>(&mut self) -> (&mut [[T; N]], &mut[T])
Splits the slice into a slice ofN-element arrays,starting at the beginning of the slice,and a remainder slice with length strictly less thanN.
The remainder is meaningful in the division sense. Givenlet (chunks, remainder) = slice.as_chunks_mut(), then:
chunks.len()equalsslice.len() / N,remainder.len()equalsslice.len() % N, andslice.len()equalschunks.len() * N + remainder.len().
You can flatten the chunks back into a slice-of-T withas_flattened_mut.
§Panics
Panics ifN is zero.
Note that this check is against a const generic parameter, not a runtimevalue, and thus a particular monomorphization will either always panicor it will never panic.
§Examples
1.88.0 ·Sourcepub fnas_rchunks_mut<const N:usize>(&mut self) -> (&mut[T], &mut [[T; N]])
pub fnas_rchunks_mut<const N:usize>(&mut self) -> (&mut[T], &mut [[T; N]])
Splits the slice into a slice ofN-element arrays,starting at the end of the slice,and a remainder slice with length strictly less thanN.
The remainder is meaningful in the division sense. Givenlet (remainder, chunks) = slice.as_rchunks_mut(), then:
remainder.len()equalsslice.len() % N,chunks.len()equalsslice.len() / N, andslice.len()equalschunks.len() * N + remainder.len().
You can flatten the chunks back into a slice-of-T withas_flattened_mut.
§Panics
Panics ifN is zero.
Note that this check is against a const generic parameter, not a runtimevalue, and thus a particular monomorphization will either always panicor it will never panic.
§Examples
Sourcepub fnarray_windows<const N:usize>(&self) ->ArrayWindows<'_, T, N>ⓘ
🔬This is a nightly-only experimental API. (array_windows #75027)
pub fnarray_windows<const N:usize>(&self) ->ArrayWindows<'_, T, N>ⓘ
array_windows #75027)Returns an iterator over overlapping windows ofN elements of a slice,starting at the beginning of the slice.
This is the const generic equivalent ofwindows.
IfN is greater than the size of the slice, it will return no windows.
§Panics
Panics ifN is zero. This check will most probably get changed to a compile timeerror before this method gets stabilized.
§Examples
1.31.0 ·Sourcepub fnrchunks(&self, chunk_size:usize) ->RChunks<'_, T>ⓘ
pub fnrchunks(&self, chunk_size:usize) ->RChunks<'_, T>ⓘ
Returns an iterator overchunk_size elements of the slice at a time, starting at the endof the slice.
The chunks are slices and do not overlap. Ifchunk_size does not divide the length of theslice, then the last chunk will not have lengthchunk_size.
Seerchunks_exact for a variant of this iterator that returns chunks of always exactlychunk_size elements, andchunks for the same iterator but starting at the beginningof the slice.
If yourchunk_size is a constant, consider usingas_rchunks instead, which willgive references to arrays of exactly that length, rather than slices.
§Panics
Panics ifchunk_size is zero.
§Examples
1.31.0 ·Sourcepub fnrchunks_mut(&mut self, chunk_size:usize) ->RChunksMut<'_, T>ⓘ
pub fnrchunks_mut(&mut self, chunk_size:usize) ->RChunksMut<'_, T>ⓘ
Returns an iterator overchunk_size elements of the slice at a time, starting at the endof the slice.
The chunks are mutable slices, and do not overlap. Ifchunk_size does not divide thelength of the slice, then the last chunk will not have lengthchunk_size.
Seerchunks_exact_mut for a variant of this iterator that returns chunks of alwaysexactlychunk_size elements, andchunks_mut for the same iterator but starting at thebeginning of the slice.
If yourchunk_size is a constant, consider usingas_rchunks_mut instead, which willgive references to arrays of exactly that length, rather than slices.
§Panics
Panics ifchunk_size is zero.
§Examples
1.31.0 ·Sourcepub fnrchunks_exact(&self, chunk_size:usize) ->RChunksExact<'_, T>ⓘ
pub fnrchunks_exact(&self, chunk_size:usize) ->RChunksExact<'_, T>ⓘ
Returns an iterator overchunk_size elements of the slice at a time, starting at theend of the slice.
The chunks are slices and do not overlap. Ifchunk_size does not divide the length of theslice, then the last up tochunk_size-1 elements will be omitted and can be retrievedfrom theremainder function of the iterator.
Due to each chunk having exactlychunk_size elements, the compiler can often optimize theresulting code better than in the case ofrchunks.
Seerchunks for a variant of this iterator that also returns the remainder as a smallerchunk, andchunks_exact for the same iterator but starting at the beginning of theslice.
If yourchunk_size is a constant, consider usingas_rchunks instead, which willgive references to arrays of exactly that length, rather than slices.
§Panics
Panics ifchunk_size is zero.
§Examples
1.31.0 ·Sourcepub fnrchunks_exact_mut(&mut self, chunk_size:usize) ->RChunksExactMut<'_, T>ⓘ
pub fnrchunks_exact_mut(&mut self, chunk_size:usize) ->RChunksExactMut<'_, T>ⓘ
Returns an iterator overchunk_size elements of the slice at a time, starting at the endof the slice.
The chunks are mutable slices, and do not overlap. Ifchunk_size does not divide thelength of the slice, then the last up tochunk_size-1 elements will be omitted and can beretrieved from theinto_remainder function of the iterator.
Due to each chunk having exactlychunk_size elements, the compiler can often optimize theresulting code better than in the case ofchunks_mut.
Seerchunks_mut for a variant of this iterator that also returns the remainder as asmaller chunk, andchunks_exact_mut for the same iterator but starting at the beginningof the slice.
If yourchunk_size is a constant, consider usingas_rchunks_mut instead, which willgive references to arrays of exactly that length, rather than slices.
§Panics
Panics ifchunk_size is zero.
§Examples
1.77.0 ·Sourcepub fnchunk_by<F>(&self, pred: F) ->ChunkBy<'_, T, F>ⓘ
pub fnchunk_by<F>(&self, pred: F) ->ChunkBy<'_, T, F>ⓘ
Returns an iterator over the slice producing non-overlapping runsof elements using the predicate to separate them.
The predicate is called for every pair of consecutive elements,meaning that it is called onslice[0] andslice[1],followed byslice[1] andslice[2], and so on.
§Examples
letslice =&[1,1,1,3,3,2,2,2];letmutiter = slice.chunk_by(|a, b| a == b);assert_eq!(iter.next(),Some(&[1,1,1][..]));assert_eq!(iter.next(),Some(&[3,3][..]));assert_eq!(iter.next(),Some(&[2,2,2][..]));assert_eq!(iter.next(),None);This method can be used to extract the sorted subslices:
1.77.0 ·Sourcepub fnchunk_by_mut<F>(&mut self, pred: F) ->ChunkByMut<'_, T, F>ⓘ
pub fnchunk_by_mut<F>(&mut self, pred: F) ->ChunkByMut<'_, T, F>ⓘ
Returns an iterator over the slice producing non-overlapping mutableruns of elements using the predicate to separate them.
The predicate is called for every pair of consecutive elements,meaning that it is called onslice[0] andslice[1],followed byslice[1] andslice[2], and so on.
§Examples
letslice =&mut[1,1,1,3,3,2,2,2];letmutiter = slice.chunk_by_mut(|a, b| a == b);assert_eq!(iter.next(),Some(&mut[1,1,1][..]));assert_eq!(iter.next(),Some(&mut[3,3][..]));assert_eq!(iter.next(),Some(&mut[2,2,2][..]));assert_eq!(iter.next(),None);This method can be used to extract the sorted subslices:
1.0.0 ·Sourcepub fnsplit_at(&self, mid:usize) -> (&[T], &[T])
pub fnsplit_at(&self, mid:usize) -> (&[T], &[T])
Divides one slice into two at an index.
The first will contain all indices from[0, mid) (excludingthe indexmid itself) and the second will contain allindices from[mid, len) (excluding the indexlen itself).
§Panics
Panics ifmid > len. For a non-panicking alternative seesplit_at_checked.
§Examples
1.0.0 ·Sourcepub fnsplit_at_mut(&mut self, mid:usize) -> (&mut[T], &mut[T])
pub fnsplit_at_mut(&mut self, mid:usize) -> (&mut[T], &mut[T])
Divides one mutable slice into two at an index.
The first will contain all indices from[0, mid) (excludingthe indexmid itself) and the second will contain allindices from[mid, len) (excluding the indexlen itself).
§Panics
Panics ifmid > len. For a non-panicking alternative seesplit_at_mut_checked.
§Examples
1.79.0 ·Sourcepub unsafe fnsplit_at_unchecked(&self, mid:usize) -> (&[T], &[T])
pub unsafe fnsplit_at_unchecked(&self, mid:usize) -> (&[T], &[T])
Divides one slice into two at an index, without doing bounds checking.
The first will contain all indices from[0, mid) (excludingthe indexmid itself) and the second will contain allindices from[mid, len) (excluding the indexlen itself).
For a safe alternative seesplit_at.
§Safety
Calling this method with an out-of-bounds index isundefined behavioreven if the resulting reference is not used. The caller has to ensure that0 <= mid <= self.len().
§Examples
letv = ['a','b','c'];unsafe{let(left, right) = v.split_at_unchecked(0);assert_eq!(left, []);assert_eq!(right, ['a','b','c']);}unsafe{let(left, right) = v.split_at_unchecked(2);assert_eq!(left, ['a','b']);assert_eq!(right, ['c']);}unsafe{let(left, right) = v.split_at_unchecked(3);assert_eq!(left, ['a','b','c']);assert_eq!(right, []);}1.79.0 ·Sourcepub unsafe fnsplit_at_mut_unchecked( &mut self, mid:usize,) -> (&mut[T], &mut[T])
pub unsafe fnsplit_at_mut_unchecked( &mut self, mid:usize,) -> (&mut[T], &mut[T])
Divides one mutable slice into two at an index, without doing bounds checking.
The first will contain all indices from[0, mid) (excludingthe indexmid itself) and the second will contain allindices from[mid, len) (excluding the indexlen itself).
For a safe alternative seesplit_at_mut.
§Safety
Calling this method with an out-of-bounds index isundefined behavioreven if the resulting reference is not used. The caller has to ensure that0 <= mid <= self.len().
§Examples
1.80.0 ·Sourcepub fnsplit_at_checked(&self, mid:usize) ->Option<(&[T], &[T])>
pub fnsplit_at_checked(&self, mid:usize) ->Option<(&[T], &[T])>
Divides one slice into two at an index, returningNone if the slice istoo short.
Ifmid ≤ len returns a pair of slices where the first will contain allindices from[0, mid) (excluding the indexmid itself) and thesecond will contain all indices from[mid, len) (excluding the indexlen itself).
Otherwise, ifmid > len, returnsNone.
§Examples
letv = [1, -2,3, -4,5, -6];{let(left, right) = v.split_at_checked(0).unwrap();assert_eq!(left, []);assert_eq!(right, [1, -2,3, -4,5, -6]);}{let(left, right) = v.split_at_checked(2).unwrap();assert_eq!(left, [1, -2]);assert_eq!(right, [3, -4,5, -6]);}{let(left, right) = v.split_at_checked(6).unwrap();assert_eq!(left, [1, -2,3, -4,5, -6]);assert_eq!(right, []);}assert_eq!(None, v.split_at_checked(7));1.80.0 ·Sourcepub fnsplit_at_mut_checked( &mut self, mid:usize,) ->Option<(&mut[T], &mut[T])>
pub fnsplit_at_mut_checked( &mut self, mid:usize,) ->Option<(&mut[T], &mut[T])>
Divides one mutable slice into two at an index, returningNone if theslice is too short.
Ifmid ≤ len returns a pair of slices where the first will contain allindices from[0, mid) (excluding the indexmid itself) and thesecond will contain all indices from[mid, len) (excluding the indexlen itself).
Otherwise, ifmid > len, returnsNone.
§Examples
1.0.0 ·Sourcepub fnsplit<F>(&self, pred: F) ->Split<'_, T, F>ⓘ
pub fnsplit<F>(&self, pred: F) ->Split<'_, T, F>ⓘ
Returns an iterator over subslices separated by elements that matchpred. The matched element is not contained in the subslices.
§Examples
letslice = [10,40,33,20];letmutiter = slice.split(|num| num %3==0);assert_eq!(iter.next().unwrap(),&[10,40]);assert_eq!(iter.next().unwrap(),&[20]);assert!(iter.next().is_none());If the first element is matched, an empty slice will be the first itemreturned by the iterator. Similarly, if the last element in the sliceis matched, an empty slice will be the last item returned by theiterator:
letslice = [10,40,33];letmutiter = slice.split(|num| num %3==0);assert_eq!(iter.next().unwrap(),&[10,40]);assert_eq!(iter.next().unwrap(),&[]);assert!(iter.next().is_none());If two matched elements are directly adjacent, an empty slice will bepresent between them:
1.0.0 ·Sourcepub fnsplit_mut<F>(&mut self, pred: F) ->SplitMut<'_, T, F>ⓘ
pub fnsplit_mut<F>(&mut self, pred: F) ->SplitMut<'_, T, F>ⓘ
Returns an iterator over mutable subslices separated by elements thatmatchpred. The matched element is not contained in the subslices.
§Examples
1.51.0 ·Sourcepub fnsplit_inclusive<F>(&self, pred: F) ->SplitInclusive<'_, T, F>ⓘ
pub fnsplit_inclusive<F>(&self, pred: F) ->SplitInclusive<'_, T, F>ⓘ
Returns an iterator over subslices separated by elements that matchpred. The matched element is contained in the end of the previoussubslice as a terminator.
§Examples
letslice = [10,40,33,20];letmutiter = slice.split_inclusive(|num| num %3==0);assert_eq!(iter.next().unwrap(),&[10,40,33]);assert_eq!(iter.next().unwrap(),&[20]);assert!(iter.next().is_none());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.
1.51.0 ·Sourcepub fnsplit_inclusive_mut<F>(&mut self, pred: F) ->SplitInclusiveMut<'_, T, F>ⓘ
pub fnsplit_inclusive_mut<F>(&mut self, pred: F) ->SplitInclusiveMut<'_, T, F>ⓘ
Returns an iterator over mutable subslices separated by elements thatmatchpred. The matched element is contained in the previoussubslice as a terminator.
§Examples
1.27.0 ·Sourcepub fnrsplit<F>(&self, pred: F) ->RSplit<'_, T, F>ⓘ
pub fnrsplit<F>(&self, pred: F) ->RSplit<'_, T, F>ⓘ
Returns an iterator over subslices separated by elements that matchpred, starting at the end of the slice and working backwards.The matched element is not contained in the subslices.
§Examples
letslice = [11,22,33,0,44,55];letmutiter = slice.rsplit(|num|*num ==0);assert_eq!(iter.next().unwrap(),&[44,55]);assert_eq!(iter.next().unwrap(),&[11,22,33]);assert_eq!(iter.next(),None);As withsplit(), if the first or last element is matched, an emptyslice will be the first (or last) item returned by the iterator.
1.27.0 ·Sourcepub fnrsplit_mut<F>(&mut self, pred: F) ->RSplitMut<'_, T, F>ⓘ
pub fnrsplit_mut<F>(&mut self, pred: F) ->RSplitMut<'_, T, F>ⓘ
Returns an iterator over mutable subslices separated by elements thatmatchpred, starting at the end of the slice and workingbackwards. The matched element is not contained in the subslices.
§Examples
1.0.0 ·Sourcepub fnsplitn<F>(&self, n:usize, pred: F) ->SplitN<'_, T, F>ⓘ
pub fnsplitn<F>(&self, n:usize, pred: F) ->SplitN<'_, T, F>ⓘ
Returns an iterator over subslices separated by elements that matchpred, limited to returning at mostn items. The matched element isnot contained in the subslices.
The last element returned, if any, will contain the remainder of theslice.
§Examples
Print the slice split once by numbers divisible by 3 (i.e.,[10, 40],[20, 60, 50]):
1.0.0 ·Sourcepub fnsplitn_mut<F>(&mut self, n:usize, pred: F) ->SplitNMut<'_, T, F>ⓘ
pub fnsplitn_mut<F>(&mut self, n:usize, pred: F) ->SplitNMut<'_, T, F>ⓘ
Returns an iterator over mutable subslices separated by elements that matchpred, limited to returning at mostn items. The matched element isnot contained in the subslices.
The last element returned, if any, will contain the remainder of theslice.
§Examples
1.0.0 ·Sourcepub fnrsplitn<F>(&self, n:usize, pred: F) ->RSplitN<'_, T, F>ⓘ
pub fnrsplitn<F>(&self, n:usize, pred: F) ->RSplitN<'_, T, F>ⓘ
Returns an iterator over subslices separated by elements that matchpred limited to returning at mostn items. This starts at the end ofthe slice and works backwards. The matched element is not contained inthe subslices.
The last element returned, if any, will contain the remainder of theslice.
§Examples
Print the slice split once, starting from the end, by numbers divisibleby 3 (i.e.,[50],[10, 40, 30, 20]):
1.0.0 ·Sourcepub fnrsplitn_mut<F>(&mut self, n:usize, pred: F) ->RSplitNMut<'_, T, F>ⓘ
pub fnrsplitn_mut<F>(&mut self, n:usize, pred: F) ->RSplitNMut<'_, T, F>ⓘ
Returns an iterator over subslices separated by elements that matchpred limited to returning at mostn items. This starts at the end ofthe slice and works backwards. The matched element is not contained inthe subslices.
The last element returned, if any, will contain the remainder of theslice.
§Examples
Sourcepub fnsplit_once<F>(&self, pred: F) ->Option<(&[T], &[T])>
🔬This is a nightly-only experimental API. (slice_split_once #112811)
pub fnsplit_once<F>(&self, pred: F) ->Option<(&[T], &[T])>
slice_split_once #112811)Splits the slice on the first element that matches the specifiedpredicate.
If any matching elements are present in the slice, returns the prefixbefore the match and suffix after. The matching element itself is notincluded. If no elements match, returnsNone.
§Examples
Sourcepub fnrsplit_once<F>(&self, pred: F) ->Option<(&[T], &[T])>
🔬This is a nightly-only experimental API. (slice_split_once #112811)
pub fnrsplit_once<F>(&self, pred: F) ->Option<(&[T], &[T])>
slice_split_once #112811)Splits the slice on the last element that matches the specifiedpredicate.
If any matching elements are present in the slice, returns the prefixbefore the match and suffix after. The matching element itself is notincluded. If no elements match, returnsNone.
§Examples
1.0.0 ·Sourcepub fncontains(&self, x:&T) ->boolwhere T:PartialEq,
pub fncontains(&self, x:&T) ->boolwhere T:PartialEq,
Returnstrue if the slice contains an element with the given value.
This operation isO(n).
Note that if you have a sorted slice,binary_search may be faster.
§Examples
If you do not have a&T, but some other value that you can comparewith one (for example,String implementsPartialEq<str>), you canuseiter().any:
1.0.0 ·Sourcepub fnstarts_with(&self, needle: &[T]) ->boolwhere T:PartialEq,
pub fnstarts_with(&self, needle: &[T]) ->boolwhere T:PartialEq,
Returnstrue ifneedle is a prefix of the slice or equal to the slice.
§Examples
letv = [10,40,30];assert!(v.starts_with(&[10]));assert!(v.starts_with(&[10,40]));assert!(v.starts_with(&v));assert!(!v.starts_with(&[50]));assert!(!v.starts_with(&[10,50]));Always returnstrue ifneedle is an empty slice:
1.0.0 ·Sourcepub fnends_with(&self, needle: &[T]) ->boolwhere T:PartialEq,
pub fnends_with(&self, needle: &[T]) ->boolwhere T:PartialEq,
Returnstrue ifneedle is a suffix of the slice or equal to the slice.
§Examples
letv = [10,40,30];assert!(v.ends_with(&[30]));assert!(v.ends_with(&[40,30]));assert!(v.ends_with(&v));assert!(!v.ends_with(&[50]));assert!(!v.ends_with(&[50,30]));Always returnstrue ifneedle is an empty slice:
1.51.0 ·Sourcepub fnstrip_prefix<P>(&self, prefix:&P) ->Option<&[T]>
pub fnstrip_prefix<P>(&self, prefix:&P) ->Option<&[T]>
Returns a subslice with the prefix removed.
If the slice starts withprefix, returns the subslice after the prefix, wrapped inSome.Ifprefix is empty, simply returns the original slice. Ifprefix is equal to theoriginal slice, returns an empty slice.
If the slice does not start withprefix, returnsNone.
§Examples
letv =&[10,40,30];assert_eq!(v.strip_prefix(&[10]),Some(&[40,30][..]));assert_eq!(v.strip_prefix(&[10,40]),Some(&[30][..]));assert_eq!(v.strip_prefix(&[10,40,30]),Some(&[][..]));assert_eq!(v.strip_prefix(&[50]),None);assert_eq!(v.strip_prefix(&[10,50]),None);letprefix :&str ="he";assert_eq!(b"hello".strip_prefix(prefix.as_bytes()),Some(b"llo".as_ref()));1.51.0 ·Sourcepub fnstrip_suffix<P>(&self, suffix:&P) ->Option<&[T]>
pub fnstrip_suffix<P>(&self, suffix:&P) ->Option<&[T]>
Returns a subslice with the suffix removed.
If the slice ends withsuffix, returns the subslice before the suffix, wrapped inSome.Ifsuffix is empty, simply returns the original slice. Ifsuffix is equal to theoriginal slice, returns an empty slice.
If the slice does not end withsuffix, returnsNone.
§Examples
Sourcepub fnstrip_circumfix<S, P>(&self, prefix:&P, suffix:&S) ->Option<&[T]>
🔬This is a nightly-only experimental API. (strip_circumfix #147946)
pub fnstrip_circumfix<S, P>(&self, prefix:&P, suffix:&S) ->Option<&[T]>
strip_circumfix #147946)Returns a subslice with the prefix and suffix removed.
If the slice starts withprefix and ends withsuffix, returns the subslice after theprefix and before the suffix, wrapped inSome.
If the slice does not start withprefix or does not end withsuffix, returnsNone.
§Examples
#![feature(strip_circumfix)]letv =&[10,50,40,30];assert_eq!(v.strip_circumfix(&[10],&[30]),Some(&[50,40][..]));assert_eq!(v.strip_circumfix(&[10],&[40,30]),Some(&[50][..]));assert_eq!(v.strip_circumfix(&[10,50],&[40,30]),Some(&[][..]));assert_eq!(v.strip_circumfix(&[50],&[30]),None);assert_eq!(v.strip_circumfix(&[10],&[40]),None);assert_eq!(v.strip_circumfix(&[],&[40,30]),Some(&[10,50][..]));assert_eq!(v.strip_circumfix(&[10,50],&[]),Some(&[40,30][..]));Sourcepub fntrim_prefix<P>(&self, prefix:&P) -> &[T]
🔬This is a nightly-only experimental API. (trim_prefix_suffix #142312)
pub fntrim_prefix<P>(&self, prefix:&P) -> &[T]
trim_prefix_suffix #142312)Returns a subslice with the optional prefix removed.
If the slice starts withprefix, returns the subslice after the prefix. Ifprefixis empty or the slice does not start withprefix, simply returns the original slice.Ifprefix is equal to the original slice, returns an empty slice.
§Examples
#![feature(trim_prefix_suffix)]letv =&[10,40,30];// Prefix present - removes itassert_eq!(v.trim_prefix(&[10]),&[40,30][..]);assert_eq!(v.trim_prefix(&[10,40]),&[30][..]);assert_eq!(v.trim_prefix(&[10,40,30]),&[][..]);// Prefix absent - returns original sliceassert_eq!(v.trim_prefix(&[50]),&[10,40,30][..]);assert_eq!(v.trim_prefix(&[10,50]),&[10,40,30][..]);letprefix :&str ="he";assert_eq!(b"hello".trim_prefix(prefix.as_bytes()),b"llo".as_ref());Sourcepub fntrim_suffix<P>(&self, suffix:&P) -> &[T]
🔬This is a nightly-only experimental API. (trim_prefix_suffix #142312)
pub fntrim_suffix<P>(&self, suffix:&P) -> &[T]
trim_prefix_suffix #142312)Returns a subslice with the optional suffix removed.
If the slice ends withsuffix, returns the subslice before the suffix. Ifsuffixis empty or the slice does not end withsuffix, simply returns the original slice.Ifsuffix is equal to the original slice, returns an empty slice.
§Examples
#![feature(trim_prefix_suffix)]letv =&[10,40,30];// Suffix present - removes itassert_eq!(v.trim_suffix(&[30]),&[10,40][..]);assert_eq!(v.trim_suffix(&[40,30]),&[10][..]);assert_eq!(v.trim_suffix(&[10,40,30]),&[][..]);// Suffix absent - returns original sliceassert_eq!(v.trim_suffix(&[50]),&[10,40,30][..]);assert_eq!(v.trim_suffix(&[50,30]),&[10,40,30][..]);1.0.0 ·Sourcepub fnbinary_search(&self, x:&T) ->Result<usize,usize>where T:Ord,
pub fnbinary_search(&self, x:&T) ->Result<usize,usize>where T:Ord,
Binary searches this slice for a given element.If the slice is not sorted, the returned result is unspecified andmeaningless.
If the value is found thenResult::Ok is returned, containing theindex of the matching element. If there are multiple matches, then anyone of the matches could be returned. The index is chosendeterministically, but is subject to change in future versions of Rust.If the value is not found thenResult::Err is returned, containingthe index where a matching element could be inserted while maintainingsorted order.
See alsobinary_search_by,binary_search_by_key, andpartition_point.
§Examples
Looks up a series of four elements. The first is found, with auniquely determined position; the second and third are notfound; the fourth could match any position in[1, 4].
lets = [0,1,1,1,1,2,3,5,8,13,21,34,55];assert_eq!(s.binary_search(&13),Ok(9));assert_eq!(s.binary_search(&4),Err(7));assert_eq!(s.binary_search(&100),Err(13));letr = s.binary_search(&1);assert!(matchr {Ok(1..=4) =>true,_=>false, });If you want to find that wholerange of matching items, rather thanan arbitrary matching one, that can be done usingpartition_point:
lets = [0,1,1,1,1,2,3,5,8,13,21,34,55];letlow = s.partition_point(|x| x <&1);assert_eq!(low,1);lethigh = s.partition_point(|x| x <=&1);assert_eq!(high,5);letr = s.binary_search(&1);assert!((low..high).contains(&r.unwrap()));assert!(s[..low].iter().all(|&x| x <1));assert!(s[low..high].iter().all(|&x| x ==1));assert!(s[high..].iter().all(|&x| x >1));// For something not found, the "range" of equal items is emptyassert_eq!(s.partition_point(|x| x <&11),9);assert_eq!(s.partition_point(|x| x <=&11),9);assert_eq!(s.binary_search(&11),Err(9));If you want to insert an item to a sorted vector, while maintainingsort order, consider usingpartition_point:
letmuts =vec![0,1,1,1,1,2,3,5,8,13,21,34,55];letnum =42;letidx = s.partition_point(|&x| x <= num);// If `num` is unique, `s.partition_point(|&x| x < num)` (with `<`) is equivalent to// `s.binary_search(&num).unwrap_or_else(|x| x)`, but using `<=` will allow `insert`// to shift less elements.s.insert(idx, num);assert_eq!(s, [0,1,1,1,1,2,3,5,8,13,21,34,42,55]);1.0.0 ·Sourcepub fnbinary_search_by<'a, F>(&'a self, f: F) ->Result<usize,usize>
pub fnbinary_search_by<'a, F>(&'a self, f: F) ->Result<usize,usize>
Binary searches this slice with a comparator function.
The comparator function should return an order code that indicateswhether its argument isLess,Equal orGreater the desiredtarget.If the slice is not sorted or if the comparator function does notimplement an order consistent with the sort order of the underlyingslice, the returned result is unspecified and meaningless.
If the value is found thenResult::Ok is returned, containing theindex of the matching element. If there are multiple matches, then anyone of the matches could be returned. The index is chosendeterministically, but is subject to change in future versions of Rust.If the value is not found thenResult::Err is returned, containingthe index where a matching element could be inserted while maintainingsorted order.
See alsobinary_search,binary_search_by_key, andpartition_point.
§Examples
Looks up a series of four elements. The first is found, with auniquely determined position; the second and third are notfound; the fourth could match any position in[1, 4].
lets = [0,1,1,1,1,2,3,5,8,13,21,34,55];letseek =13;assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)),Ok(9));letseek =4;assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)),Err(7));letseek =100;assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)),Err(13));letseek =1;letr = s.binary_search_by(|probe| probe.cmp(&seek));assert!(matchr {Ok(1..=4) =>true,_=>false, });1.10.0 ·Sourcepub fnbinary_search_by_key<'a, B, F>( &'a self, b:&B, f: F,) ->Result<usize,usize>
pub fnbinary_search_by_key<'a, B, F>( &'a self, b:&B, f: F,) ->Result<usize,usize>
Binary searches this slice with a key extraction function.
Assumes that the slice is sorted by the key, for instance withsort_by_key using the same key extraction function.If the slice is not sorted by the key, the returned result isunspecified and meaningless.
If the value is found thenResult::Ok is returned, containing theindex of the matching element. If there are multiple matches, then anyone of the matches could be returned. The index is chosendeterministically, but is subject to change in future versions of Rust.If the value is not found thenResult::Err is returned, containingthe index where a matching element could be inserted while maintainingsorted order.
See alsobinary_search,binary_search_by, andpartition_point.
§Examples
Looks up a series of four elements in a slice of pairs sorted bytheir second elements. The first is found, with a uniquelydetermined position; the second and third are not found; thefourth could match any position in[1, 4].
lets = [(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)];assert_eq!(s.binary_search_by_key(&13, |&(a, b)| b),Ok(9));assert_eq!(s.binary_search_by_key(&4, |&(a, b)| b),Err(7));assert_eq!(s.binary_search_by_key(&100, |&(a, b)| b),Err(13));letr = s.binary_search_by_key(&1, |&(a, b)| b);assert!(matchr {Ok(1..=4) =>true,_=>false, });1.20.0 ·Sourcepub fnsort_unstable(&mut self)where T:Ord,
pub fnsort_unstable(&mut self)where T:Ord,
Sorts the slice in ascending orderwithout preserving the initial order of equal elements.
This sort is unstable (i.e., may reorder equal elements), in-place (i.e., does notallocate), andO(n * log(n)) worst-case.
If the implementation ofOrd forT does not implement atotal order, the functionmay panic; even if the function exits normally, the resulting order of elements in the sliceis unspecified. See also the note on panicking below.
For example|a, b| (a - b).cmp(a) is a comparison function that is neither transitive norreflexive nor total,a < b < c < a witha = 1, b = 2, c = 3. For more information andexamples see theOrd documentation.
All original elements will remain in the slice and any possible modifications via interiormutability are observed in the input. Same is true if the implementation ofOrd forT panics.
Sorting types that only implementPartialOrd such asf32 andf64 requireadditional precautions. For example,f32::NAN != f32::NAN, which doesn’t fulfill thereflexivity requirement ofOrd. By using an alternative comparison function withslice::sort_unstable_by such asf32::total_cmp orf64::total_cmp that defines atotal order users can sort slices containing floating-point values. Alternatively, if allvalues in the slice are guaranteed to be in a subset for whichPartialOrd::partial_cmpforms atotal order, it’s possible to sort the slice withsort_unstable_by(|a, b| a.partial_cmp(b).unwrap()).
§Current implementation
The current implementation is based onipnsort by Lukas Bergdoll and Orson Peters, whichcombines the fast average case of quicksort with the fast worst case of heapsort, achievinglinear time on fully sorted and reversed inputs. On inputs with k distinct elements, theexpected time to sort the data isO(n * log(k)).
It is typically faster than stable sorting, except in a few special cases, e.g., when theslice is partially sorted.
§Panics
May panic if the implementation ofOrd forT does not implement atotal order, or iftheOrd implementation panics.
§Examples
1.20.0 ·Sourcepub fnsort_unstable_by<F>(&mut self, compare: F)
pub fnsort_unstable_by<F>(&mut self, compare: F)
Sorts the slice in ascending order with a comparison function,without preserving theinitial order of equal elements.
This sort is unstable (i.e., may reorder equal elements), in-place (i.e., does notallocate), andO(n * log(n)) worst-case.
If the comparison functioncompare does not implement atotal order, the functionmay panic; even if the function exits normally, the resulting order of elements in the sliceis unspecified. See also the note on panicking below.
For example|a, b| (a - b).cmp(a) is a comparison function that is neither transitive norreflexive nor total,a < b < c < a witha = 1, b = 2, c = 3. For more information andexamples see theOrd documentation.
All original elements will remain in the slice and any possible modifications via interiormutability are observed in the input. Same is true ifcompare panics.
§Current implementation
The current implementation is based onipnsort by Lukas Bergdoll and Orson Peters, whichcombines the fast average case of quicksort with the fast worst case of heapsort, achievinglinear time on fully sorted and reversed inputs. On inputs with k distinct elements, theexpected time to sort the data isO(n * log(k)).
It is typically faster than stable sorting, except in a few special cases, e.g., when theslice is partially sorted.
§Panics
May panic if thecompare does not implement atotal order, or ifthecompare itself panics.
§Examples
1.20.0 ·Sourcepub fnsort_unstable_by_key<K, F>(&mut self, f: F)
pub fnsort_unstable_by_key<K, F>(&mut self, f: F)
Sorts the slice in ascending order with a key extraction function,without preservingthe initial order of equal elements.
This sort is unstable (i.e., may reorder equal elements), in-place (i.e., does notallocate), andO(n * log(n)) worst-case.
If the implementation ofOrd forK does not implement atotal order, the functionmay panic; even if the function exits normally, the resulting order of elements in the sliceis unspecified. See also the note on panicking below.
For example|a, b| (a - b).cmp(a) is a comparison function that is neither transitive norreflexive nor total,a < b < c < a witha = 1, b = 2, c = 3. For more information andexamples see theOrd documentation.
All original elements will remain in the slice and any possible modifications via interiormutability are observed in the input. Same is true if the implementation ofOrd forK panics.
§Current implementation
The current implementation is based onipnsort by Lukas Bergdoll and Orson Peters, whichcombines the fast average case of quicksort with the fast worst case of heapsort, achievinglinear time on fully sorted and reversed inputs. On inputs with k distinct elements, theexpected time to sort the data isO(n * log(k)).
It is typically faster than stable sorting, except in a few special cases, e.g., when theslice is partially sorted.
§Panics
May panic if the implementation ofOrd forK does not implement atotal order, or iftheOrd implementation panics.
§Examples
1.49.0 ·Sourcepub fnselect_nth_unstable( &mut self, index:usize,) -> (&mut[T],&mut T, &mut[T])where T:Ord,
pub fnselect_nth_unstable( &mut self, index:usize,) -> (&mut[T],&mut T, &mut[T])where T:Ord,
Reorders the slice such that the element atindex is at a sort-order position. Allelements beforeindex will be<= to this value, and all elements after will be>= toit.
This reordering is unstable (i.e. any element that compares equal to the nth element may endup at that position), in-place (i.e. does not allocate), and runs inO(n) time. Thisfunction is also known as “kth element” in other libraries.
Returns a triple that partitions the reordered slice:
The unsorted subslice before
index, whose elements all satisfyx <= self[index].The element at
index.The unsorted subslice after
index, whose elements all satisfyx >= self[index].
§Current implementation
The current algorithm is an introselect implementation based onipnsort by Lukas Bergdolland Orson Peters, which is also the basis forsort_unstable. The fallback algorithm isMedian of Medians using Tukey’s Ninther for pivot selection, which guarantees linear runtimefor all inputs.
§Panics
Panics whenindex >= len(), and so always panics on empty slices.
May panic if the implementation ofOrd forT does not implement atotal order.
§Examples
letmutv = [-5i32,4,2, -3,1];// Find the items `<=` to the median, the median itself, and the items `>=` to it.let(lesser, median, greater) = v.select_nth_unstable(2);assert!(lesser == [-3, -5] || lesser == [-5, -3]);assert_eq!(median,&mut1);assert!(greater == [4,2] || greater == [2,4]);// 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]);1.49.0 ·Sourcepub fnselect_nth_unstable_by<F>( &mut self, index:usize, compare: F,) -> (&mut[T],&mut T, &mut[T])
pub fnselect_nth_unstable_by<F>( &mut self, index:usize, compare: F,) -> (&mut[T],&mut T, &mut[T])
Reorders the slice with a comparator function such that the element atindex is at asort-order position. All elements beforeindex will be<= to this value, and allelements after will be>= to it, according to the comparator function.
This reordering is unstable (i.e. any element that compares equal to the nth element may endup at that position), in-place (i.e. does not allocate), and runs inO(n) time. Thisfunction is also known as “kth element” in other libraries.
Returns a triple partitioning the reordered slice:
The unsorted subslice before
index, whose elements all satisfycompare(x, self[index]).is_le().The element at
index.The unsorted subslice after
index, whose elements all satisfycompare(x, self[index]).is_ge().
§Current implementation
The current algorithm is an introselect implementation based onipnsort by Lukas Bergdolland Orson Peters, which is also the basis forsort_unstable. The fallback algorithm isMedian of Medians using Tukey’s Ninther for pivot selection, which guarantees linear runtimefor all inputs.
§Panics
Panics whenindex >= len(), and so always panics on empty slices.
May panic ifcompare does not implement atotal order.
§Examples
letmutv = [-5i32,4,2, -3,1];// Find the items `>=` to the median, the median itself, and the items `<=` to it, by using// a reversed comparator.let(before, median, after) = v.select_nth_unstable_by(2, |a, b| b.cmp(a));assert!(before == [4,2] || before == [2,4]);assert_eq!(median,&mut1);assert!(after == [-3, -5] || after == [-5, -3]);// We are only guaranteed the slice will be one of the following, based on the way we sort// about the specified index.assert!(v == [2,4,1, -5, -3] || v == [2,4,1, -3, -5] || v == [4,2,1, -5, -3] || v == [4,2,1, -3, -5]);1.49.0 ·Sourcepub fnselect_nth_unstable_by_key<K, F>( &mut self, index:usize, f: F,) -> (&mut[T],&mut T, &mut[T])
pub fnselect_nth_unstable_by_key<K, F>( &mut self, index:usize, f: F,) -> (&mut[T],&mut T, &mut[T])
Reorders the slice with a key extraction function such that the element atindex is at asort-order position. All elements beforeindex will have keys<= to the key atindex,and all elements after will have keys>= to it.
This reordering is unstable (i.e. any element that compares equal to the nth element may endup at that position), in-place (i.e. does not allocate), and runs inO(n) time. Thisfunction is also known as “kth element” in other libraries.
Returns a triple partitioning the reordered slice:
The unsorted subslice before
index, whose elements all satisfyf(x) <= f(self[index]).The element at
index.The unsorted subslice after
index, whose elements all satisfyf(x) >= f(self[index]).
§Current implementation
The current algorithm is an introselect implementation based onipnsort by Lukas Bergdolland Orson Peters, which is also the basis forsort_unstable. The fallback algorithm isMedian of Medians using Tukey’s Ninther for pivot selection, which guarantees linear runtimefor all inputs.
§Panics
Panics whenindex >= len(), meaning it always panics on empty slices.
May panic ifK: Ord does not implement a total order.
§Examples
letmutv = [-5i32,4,1, -3,2];// Find the items `<=` to the absolute median, the absolute median itself, and the items// `>=` to it.let(lesser, median, greater) = v.select_nth_unstable_by_key(2, |a| a.abs());assert!(lesser == [1,2] || lesser == [2,1]);assert_eq!(median,&mut-3);assert!(greater == [4, -5] || greater == [-5,4]);// 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]);Sourcepub fnpartition_dedup(&mut self) -> (&mut[T], &mut[T])where T:PartialEq,
🔬This is a nightly-only experimental API. (slice_partition_dedup #54279)
pub fnpartition_dedup(&mut self) -> (&mut[T], &mut[T])where T:PartialEq,
slice_partition_dedup #54279)Moves all consecutive repeated elements to the end of the slice according to thePartialEq trait implementation.
Returns two slices. The first contains no consecutive repeated elements.The second contains all the duplicates in no specified order.
If the slice is sorted, the first returned slice contains no duplicates.
§Examples
Sourcepub fnpartition_dedup_by<F>(&mut self, same_bucket: F) -> (&mut[T], &mut[T])
🔬This is a nightly-only experimental API. (slice_partition_dedup #54279)
pub fnpartition_dedup_by<F>(&mut self, same_bucket: F) -> (&mut[T], &mut[T])
slice_partition_dedup #54279)Moves all but the first of consecutive elements to the end of the slice satisfyinga given equality relation.
Returns two slices. The first contains no consecutive repeated elements.The second contains all the duplicates in no specified order.
Thesame_bucket function is passed references to two elements from the slice andmust determine if the elements compare equal. The elements are passed in opposite orderfrom their order in the slice, so ifsame_bucket(a, b) returnstrue,a is movedat the end of the slice.
If the slice is sorted, the first returned slice contains no duplicates.
§Examples
Sourcepub fnpartition_dedup_by_key<K, F>(&mut self, key: F) -> (&mut[T], &mut[T])
🔬This is a nightly-only experimental API. (slice_partition_dedup #54279)
pub fnpartition_dedup_by_key<K, F>(&mut self, key: F) -> (&mut[T], &mut[T])
slice_partition_dedup #54279)Moves all but the first of consecutive elements to the end of the slice that resolveto the same key.
Returns two slices. The first contains no consecutive repeated elements.The second contains all the duplicates in no specified order.
If the slice is sorted, the first returned slice contains no duplicates.
§Examples
1.26.0 ·Sourcepub fnrotate_left(&mut self, mid:usize)
pub fnrotate_left(&mut self, mid:usize)
Rotates the slice in-place such that the firstmid elements of theslice move to the end while the lastself.len() - mid elements move tothe front.
After callingrotate_left, the element previously at indexmid willbecome the first element in the slice.
§Panics
This function will panic ifmid is greater than the length of theslice. Note thatmid == self.len() doesnot panic and is a no-oprotation.
§Complexity
Takes linear (inself.len()) time.
§Examples
Rotating a subslice:
1.26.0 ·Sourcepub fnrotate_right(&mut self, k:usize)
pub fnrotate_right(&mut self, k:usize)
Rotates the slice in-place such that the firstself.len() - kelements of the slice move to the end while the lastk elements moveto the front.
After callingrotate_right, the element previously at indexself.len() - k will become the first element in the slice.
§Panics
This function will panic ifk is greater than the length of theslice. Note thatk == self.len() doesnot panic and is a no-oprotation.
§Complexity
Takes linear (inself.len()) time.
§Examples
Rotating a subslice:
1.50.0 ·Sourcepub fnfill(&mut self, value: T)where T:Clone,
pub fnfill(&mut self, value: T)where T:Clone,
Fillsself with elements by cloningvalue.
§Examples
1.51.0 ·Sourcepub fnfill_with<F>(&mut self, f: F)where F:FnMut() -> T,
pub fnfill_with<F>(&mut self, f: F)where F:FnMut() -> T,
Fillsself with elements returned by calling a closure repeatedly.
This method uses a closure to create new values. If you’d ratherClone a given value, usefill. If you want to use theDefaulttrait to generate values, you can passDefault::default as theargument.
§Examples
1.7.0 ·Sourcepub fnclone_from_slice(&mut self, src: &[T])where T:Clone,
pub fnclone_from_slice(&mut self, src: &[T])where T:Clone,
Copies the elements fromsrc intoself.
The length ofsrc must be the same asself.
§Panics
This function will panic if the two slices have different lengths.
§Examples
Cloning two elements from a slice into another:
letsrc = [1,2,3,4];letmutdst = [0,0];// Because the slices have to be the same length,// we slice the source slice from four elements// to two. It will panic if we don't do this.dst.clone_from_slice(&src[2..]);assert_eq!(src, [1,2,3,4]);assert_eq!(dst, [3,4]);Rust enforces that there can only be one mutable reference with noimmutable references to a particular piece of data in a particularscope. Because of this, attempting to useclone_from_slice on asingle slice will result in a compile failure:
To work around this, we can usesplit_at_mut to create two distinctsub-slices from a slice:
1.9.0 ·Sourcepub fncopy_from_slice(&mut self, src: &[T])where T:Copy,
pub fncopy_from_slice(&mut self, src: &[T])where T:Copy,
Copies all elements fromsrc intoself, using a memcpy.
The length ofsrc must be the same asself.
IfT does not implementCopy, useclone_from_slice.
§Panics
This function will panic if the two slices have different lengths.
§Examples
Copying two elements from a slice into another:
letsrc = [1,2,3,4];letmutdst = [0,0];// Because the slices have to be the same length,// we slice the source slice from four elements// to two. It will panic if we don't do this.dst.copy_from_slice(&src[2..]);assert_eq!(src, [1,2,3,4]);assert_eq!(dst, [3,4]);Rust enforces that there can only be one mutable reference with noimmutable references to a particular piece of data in a particularscope. Because of this, attempting to usecopy_from_slice on asingle slice will result in a compile failure:
To work around this, we can usesplit_at_mut to create two distinctsub-slices from a slice:
1.37.0 ·Sourcepub fncopy_within<R>(&mut self, src: R, dest:usize)
pub fncopy_within<R>(&mut self, src: R, dest:usize)
Copies elements from one part of the slice to another part of itself,using a memmove.
src is the range withinself to copy from.dest is the startingindex of the range withinself to copy to, which will have the samelength assrc. The two ranges may overlap. The ends of the two rangesmust be less than or equal toself.len().
§Panics
This function will panic if either range exceeds the end of the slice,or if the end ofsrc is before the start.
§Examples
Copying four bytes within a slice:
1.27.0 ·Sourcepub fnswap_with_slice(&mut self, other: &mut[T])
pub fnswap_with_slice(&mut self, other: &mut[T])
Swaps all elements inself with those inother.
The length ofother must be the same asself.
§Panics
This function will panic if the two slices have different lengths.
§Example
Swapping two elements across slices:
letmutslice1 = [0,0];letmutslice2 = [1,2,3,4];slice1.swap_with_slice(&mutslice2[2..]);assert_eq!(slice1, [3,4]);assert_eq!(slice2, [1,2,0,0]);Rust enforces that there can only be one mutable reference to aparticular piece of data in a particular scope. Because of this,attempting to useswap_with_slice on a single slice will result ina compile failure:
To work around this, we can usesplit_at_mut to create two distinctmutable sub-slices from a slice:
1.30.0 ·Sourcepub unsafe fnalign_to<U>(&self) -> (&[T], &[U], &[T])
pub unsafe fnalign_to<U>(&self) -> (&[T], &[U], &[T])
Transmutes the slice to a slice of another type, ensuring alignment of the types ismaintained.
This method splits the slice into three distinct slices: prefix, correctly aligned middleslice of a new type, and the suffix slice. The middle part will be as big as possible underthe given alignment constraint and element size.
This method has no purpose when either input elementT or output elementU arezero-sized and will return the original slice without splitting anything.
§Safety
This method is essentially atransmute with respect to the elements in the returnedmiddle slice, so all the usual caveats pertaining totransmute::<T, U> also apply here.
§Examples
Basic usage:
1.30.0 ·Sourcepub unsafe fnalign_to_mut<U>(&mut self) -> (&mut[T], &mut[U], &mut[T])
pub unsafe fnalign_to_mut<U>(&mut self) -> (&mut[T], &mut[U], &mut[T])
Transmutes the mutable slice to a mutable slice of another type, ensuring alignment of thetypes is maintained.
This method splits the slice into three distinct slices: prefix, correctly aligned middleslice of a new type, and the suffix slice. The middle part will be as big as possible underthe given alignment constraint and element size.
This method has no purpose when either input elementT or output elementU arezero-sized and will return the original slice without splitting anything.
§Safety
This method is essentially atransmute with respect to the elements in the returnedmiddle slice, so all the usual caveats pertaining totransmute::<T, U> also apply here.
§Examples
Basic usage:
Sourcepub fnas_simd<const LANES:usize>(&self) -> (&[T], &[Simd<T, LANES>], &[T])
🔬This is a nightly-only experimental API. (portable_simd #86656)
pub fnas_simd<const LANES:usize>(&self) -> (&[T], &[Simd<T, LANES>], &[T])
portable_simd #86656)Splits a slice into a prefix, a middle of aligned SIMD types, and a suffix.
This is a safe wrapper aroundslice::align_to, so inherits the sameguarantees as that method.
§Panics
This will panic if the size of the SIMD type is different fromLANES times that of the scalar.
At the time of writing, the trait restrictions onSimd<T, LANES> keepsthat from ever happening, as only power-of-two numbers of lanes aresupported. It’s possible that, in the future, those restrictions mightbe lifted in a way that would make it possible to see panics from thismethod for something likeLANES == 3.
§Examples
#![feature(portable_simd)]usecore::simd::prelude::*;letshort =&[1,2,3];let(prefix, middle, suffix) = short.as_simd::<4>();assert_eq!(middle, []);// Not enough elements for anything in the middle// They might be split in any possible way between prefix and suffixletit = prefix.iter().chain(suffix).copied();assert_eq!(it.collect::<Vec<_>>(),vec![1,2,3]);fnbasic_simd_sum(x:&[f32]) -> f32 {usestd::ops::Add;let(prefix, middle, suffix) = x.as_simd();letsums = f32x4::from_array([ prefix.iter().copied().sum(),0.0,0.0, suffix.iter().copied().sum(), ]);letsums = middle.iter().copied().fold(sums, f32x4::add); sums.reduce_sum()}letnumbers: Vec<f32> = (1..101).map(|x| xas _).collect();assert_eq!(basic_simd_sum(&numbers[1..99]),4949.0);Sourcepub fnas_simd_mut<const LANES:usize>( &mut self,) -> (&mut[T], &mut [Simd<T, LANES>], &mut[T])
🔬This is a nightly-only experimental API. (portable_simd #86656)
pub fnas_simd_mut<const LANES:usize>( &mut self,) -> (&mut[T], &mut [Simd<T, LANES>], &mut[T])
portable_simd #86656)Splits a mutable slice into a mutable prefix, a middle of aligned SIMD types,and a mutable suffix.
This is a safe wrapper aroundslice::align_to_mut, so inherits the sameguarantees as that method.
This is the mutable version ofslice::as_simd; see that for examples.
§Panics
This will panic if the size of the SIMD type is different fromLANES times that of the scalar.
At the time of writing, the trait restrictions onSimd<T, LANES> keepsthat from ever happening, as only power-of-two numbers of lanes aresupported. It’s possible that, in the future, those restrictions mightbe lifted in a way that would make it possible to see panics from thismethod for something likeLANES == 3.
1.82.0 ·Sourcepub fnis_sorted(&self) ->boolwhere T:PartialOrd,
pub fnis_sorted(&self) ->boolwhere T:PartialOrd,
Checks if the elements of this slice are sorted.
That is, for each elementa and its following elementb,a <= b must hold. If theslice yields exactly zero or one element,true is returned.
Note that ifSelf::Item is onlyPartialOrd, but notOrd, the above definitionimplies that this function returnsfalse if any two consecutive items are notcomparable.
§Examples
1.82.0 ·Sourcepub fnis_sorted_by<'a, F>(&'a self, compare: F) ->bool
pub fnis_sorted_by<'a, F>(&'a self, compare: F) ->bool
Checks if the elements of this slice are sorted using the given comparator function.
Instead of usingPartialOrd::partial_cmp, this function uses the givencomparefunction to determine whether two elements are to be considered in sorted order.
§Examples
1.82.0 ·Sourcepub fnis_sorted_by_key<'a, F, K>(&'a self, f: F) ->bool
pub fnis_sorted_by_key<'a, F, K>(&'a self, f: F) ->bool
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 theelements, as determined byf. Apart from that, it’s equivalent tois_sorted; see itsdocumentation for more information.
§Examples
1.52.0 ·Sourcepub fnpartition_point<P>(&self, pred: P) ->usize
pub fnpartition_point<P>(&self, pred: P) ->usize
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 sliceand 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 predicatex % 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.
See alsobinary_search,binary_search_by, andbinary_search_by_key.
§Examples
letv = [1,2,3,3,5,6,7];leti = v.partition_point(|&x| x <5);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 sliceis empty, then the length of the slice will be returned:
leta = [2,4,8];assert_eq!(a.partition_point(|x| x <&100), a.len());leta: [i32;0] = [];assert_eq!(a.partition_point(|x| x <&100),0);If you want to insert an item to a sorted vector, while maintainingsort order:
1.87.0 ·Sourcepub fnsplit_off<'a, R>(self: &mut &'a[T], range: R) ->Option<&'a[T]>where R:OneSidedRange<usize>,
pub fnsplit_off<'a, R>(self: &mut &'a[T], range: R) ->Option<&'a[T]>where R:OneSidedRange<usize>,
Removes the subslice corresponding to the given rangeand returns a reference to it.
ReturnsNone and does not modify the slice if the givenrange is out of bounds.
Note that this method only accepts one-sided ranges such as2.. or..6, but not2..6.
§Examples
Splitting off the first three elements of a slice:
letmutslice:&[_] =&['a','b','c','d'];letmutfirst_three = slice.split_off(..3).unwrap();assert_eq!(slice,&['d']);assert_eq!(first_three,&['a','b','c']);Splitting off a slice starting with the third element:
letmutslice:&[_] =&['a','b','c','d'];letmuttail = slice.split_off(2..).unwrap();assert_eq!(slice,&['a','b']);assert_eq!(tail,&['c','d']);GettingNone whenrange is out of bounds:
1.87.0 ·Sourcepub fnsplit_off_mut<'a, R>( self: &mut &'a mut[T], range: R,) ->Option<&'a mut[T]>where R:OneSidedRange<usize>,
pub fnsplit_off_mut<'a, R>( self: &mut &'a mut[T], range: R,) ->Option<&'a mut[T]>where R:OneSidedRange<usize>,
Removes the subslice corresponding to the given rangeand returns a mutable reference to it.
ReturnsNone and does not modify the slice if the givenrange is out of bounds.
Note that this method only accepts one-sided ranges such as2.. or..6, but not2..6.
§Examples
Splitting off the first three elements of a slice:
letmutslice:&mut[_] =&mut['a','b','c','d'];letmutfirst_three = slice.split_off_mut(..3).unwrap();assert_eq!(slice,&mut['d']);assert_eq!(first_three,&mut['a','b','c']);Splitting off a slice starting with the third element:
letmutslice:&mut[_] =&mut['a','b','c','d'];letmuttail = slice.split_off_mut(2..).unwrap();assert_eq!(slice,&mut['a','b']);assert_eq!(tail,&mut['c','d']);GettingNone whenrange is out of bounds:
1.87.0 ·Sourcepub fnsplit_off_first<'a>(self: &mut &'a[T]) ->Option<&'a T>
pub fnsplit_off_first<'a>(self: &mut &'a[T]) ->Option<&'a T>
Removes the first element of the slice and returns a referenceto it.
ReturnsNone if the slice is empty.
§Examples
1.87.0 ·Sourcepub fnsplit_off_first_mut<'a>(self: &mut &'a mut[T]) ->Option<&'a mut T>
pub fnsplit_off_first_mut<'a>(self: &mut &'a mut[T]) ->Option<&'a mut T>
Removes the first element of the slice and returns a mutablereference to it.
ReturnsNone if the slice is empty.
§Examples
1.87.0 ·Sourcepub fnsplit_off_last<'a>(self: &mut &'a[T]) ->Option<&'a T>
pub fnsplit_off_last<'a>(self: &mut &'a[T]) ->Option<&'a T>
Removes the last element of the slice and returns a referenceto it.
ReturnsNone if the slice is empty.
§Examples
1.87.0 ·Sourcepub fnsplit_off_last_mut<'a>(self: &mut &'a mut[T]) ->Option<&'a mut T>
pub fnsplit_off_last_mut<'a>(self: &mut &'a mut[T]) ->Option<&'a mut T>
Removes the last element of the slice and returns a mutablereference to it.
ReturnsNone if the slice is empty.
§Examples
1.86.0 ·Sourcepub unsafe fnget_disjoint_unchecked_mut<I, const N:usize>( &mut self, indices:[I; N],) -> [&mut <I asSliceIndex<[T]>>::Output;N]
pub unsafe fnget_disjoint_unchecked_mut<I, const N:usize>( &mut self, indices:[I; N],) -> [&mut <I asSliceIndex<[T]>>::Output;N]
Returns mutable references to many indices at once, without doing any checks.
An index can be either ausize, aRange or aRangeInclusive. Notethat this method takes an array, so all indices must be of the same type.If passed an array ofusizes this method gives back an array of mutable referencesto single elements, while if passed an array of ranges it gives back an array ofmutable references to slices.
For a safe alternative seeget_disjoint_mut.
§Safety
Calling this method with overlapping or out-of-bounds indices isundefined behavioreven if the resulting references are not used.
§Examples
letx =&mut[1,2,4];unsafe{let[a, b] = x.get_disjoint_unchecked_mut([0,2]);*a*=10;*b*=100;}assert_eq!(x,&[10,2,400]);unsafe{let[a, b] = x.get_disjoint_unchecked_mut([0..1,1..3]); a[0] =8; b[0] =88; b[1] =888;}assert_eq!(x,&[8,88,888]);unsafe{let[a, b] = x.get_disjoint_unchecked_mut([1..=2,0..=0]); a[0] =11; a[1] =111; b[0] =1;}assert_eq!(x,&[1,11,111]);1.86.0 ·Sourcepub fnget_disjoint_mut<I, const N:usize>( &mut self, indices:[I; N],) ->Result<[&mut <I asSliceIndex<[T]>>::Output;N],GetDisjointMutError>
pub fnget_disjoint_mut<I, const N:usize>( &mut self, indices:[I; N],) ->Result<[&mut <I asSliceIndex<[T]>>::Output;N],GetDisjointMutError>
Returns mutable references to many indices at once.
An index can be either ausize, aRange or aRangeInclusive. Notethat this method takes an array, so all indices must be of the same type.If passed an array ofusizes this method gives back an array of mutable referencesto single elements, while if passed an array of ranges it gives back an array ofmutable references to slices.
Returns an error if any index is out-of-bounds, or if there are overlapping indices.An empty range is not considered to overlap if it is located at the beginning or atthe end of another range, but is considered to overlap if it is located in the middle.
This method does a O(n^2) check to check that there are no overlapping indices, so be carefulwhen passing many indices.
§Examples
letv =&mut[1,2,3];if letOk([a, b]) = v.get_disjoint_mut([0,2]) {*a =413;*b =612;}assert_eq!(v,&[413,2,612]);if letOk([a, b]) = v.get_disjoint_mut([0..1,1..3]) { a[0] =8; b[0] =88; b[1] =888;}assert_eq!(v,&[8,88,888]);if letOk([a, b]) = v.get_disjoint_mut([1..=2,0..=0]) { a[0] =11; a[1] =111; b[0] =1;}assert_eq!(v,&[1,11,111]);Sourcepub fnelement_offset(&self, element:&T) ->Option<usize>
🔬This is a nightly-only experimental API. (substr_range #126769)
pub fnelement_offset(&self, element:&T) ->Option<usize>
substr_range #126769)Returns the index that an element reference points to.
ReturnsNone ifelement does not point to the start of an element within the slice.
This method is useful for extending slice iterators likeslice::split.
Note that this uses pointer arithmetic anddoes not compare elements.To find the index of an element via comparison, use.iter().position() instead.
§Panics
Panics ifT is zero-sized.
§Examples
Basic usage:
#![feature(substr_range)]letnums:&[u32] =&[1,7,1,1];letnum =&nums[2];assert_eq!(num,&1);assert_eq!(nums.element_offset(num),Some(2));ReturningNone with an unaligned element:
#![feature(substr_range)]letarr:&[[u32;2]] =&[[0,1], [2,3]];letflat_arr:&[u32] = arr.as_flattened();letok_elm:&[u32;2] = flat_arr[0..2].try_into().unwrap();letweird_elm:&[u32;2] = flat_arr[1..3].try_into().unwrap();assert_eq!(ok_elm,&[0,1]);assert_eq!(weird_elm,&[1,2]);assert_eq!(arr.element_offset(ok_elm),Some(0));// Points to element 0assert_eq!(arr.element_offset(weird_elm),None);// Points between element 0 and 1Sourcepub fnsubslice_range(&self, subslice: &[T]) ->Option<Range<usize>>
🔬This is a nightly-only experimental API. (substr_range #126769)
pub fnsubslice_range(&self, subslice: &[T]) ->Option<Range<usize>>
substr_range #126769)Returns the range of indices that a subslice points to.
ReturnsNone ifsubslice does not point within the slice or if it is not aligned with theelements in the slice.
This methoddoes not compare elements. Instead, this method finds the location in the slice thatsubslice was obtained from. To find the index of a subslice via comparison, instead use.windows().position().
This method is useful for extending slice iterators likeslice::split.
Note that this may return a false positive (eitherSome(0..0) orSome(self.len()..self.len()))ifsubslice has a length of zero and points to the beginning or end of another, separate, slice.
§Panics
Panics ifT is zero-sized.
§Examples
Basic usage:
1.0.0 ·Sourcepub fnsort(&mut self)where T:Ord,
pub fnsort(&mut self)where T:Ord,
Sorts the slice in ascending order, preserving initial order of equal elements.
This sort is stable (i.e., does not reorder equal elements) andO(n * log(n))worst-case.
If the implementation ofOrd forT does not implement atotal order, the functionmay panic; even if the function exits normally, the resulting order of elements in the sliceis unspecified. See also the note on panicking below.
When applicable, unstable sorting is preferred because it is generally faster than stablesorting and it doesn’t allocate auxiliary memory. Seesort_unstable. The exception are partially sorted slices, whichmay be better served withslice::sort.
Sorting types that only implementPartialOrd such asf32 andf64 requireadditional precautions. For example,f32::NAN != f32::NAN, which doesn’t fulfill thereflexivity requirement ofOrd. By using an alternative comparison function withslice::sort_by such asf32::total_cmp orf64::total_cmp that defines atotalorder users can sort slices containing floating-point values. Alternatively, if all valuesin the slice are guaranteed to be in a subset for whichPartialOrd::partial_cmp forms atotal order, it’s possible to sort the slice withsort_by(|a, b| a.partial_cmp(b).unwrap()).
§Current implementation
The current implementation is based ondriftsort by Orson Peters and Lukas Bergdoll, whichcombines the fast average case of quicksort with the fast worst case and partial rundetection of mergesort, achieving linear time on fully sorted and reversed inputs. On inputswith k distinct elements, the expected time to sort the data isO(n * log(k)).
The auxiliary memory allocation behavior depends on the input length. Short slices arehandled without allocation, medium sized slices allocateself.len() and beyond that itclamps atself.len() / 2.
§Panics
May panic if the implementation ofOrd forT does not implement atotal order, or iftheOrd implementation itself panics.
All safe functions on slices preserve the invariant that even if the function panics, alloriginal elements will remain in the slice and any possible modifications via interiormutability are observed in the input. This ensures that recovery code (for instance insideof aDrop or following acatch_unwind) will still have access to all the originalelements. For instance, if the slice belongs to aVec, theVec::drop method will be ableto dispose of all contained elements.
§Examples
1.0.0 ·Sourcepub fnsort_by<F>(&mut self, compare: F)
pub fnsort_by<F>(&mut self, compare: F)
Sorts the slice in ascending order with a comparison function, preserving initial order ofequal elements.
This sort is stable (i.e., does not reorder equal elements) andO(n * log(n))worst-case.
If the comparison functioncompare does not implement atotal order, the function maypanic; even if the function exits normally, the resulting order of elements in the slice isunspecified. See also the note on panicking below.
For example|a, b| (a - b).cmp(a) is a comparison function that is neither transitive norreflexive nor total,a < b < c < a witha = 1, b = 2, c = 3. For more information andexamples see theOrd documentation.
§Current implementation
The current implementation is based ondriftsort by Orson Peters and Lukas Bergdoll, whichcombines the fast average case of quicksort with the fast worst case and partial rundetection of mergesort, achieving linear time on fully sorted and reversed inputs. On inputswith k distinct elements, the expected time to sort the data isO(n * log(k)).
The auxiliary memory allocation behavior depends on the input length. Short slices arehandled without allocation, medium sized slices allocateself.len() and beyond that itclamps atself.len() / 2.
§Panics
May panic ifcompare does not implement atotal order, or ifcompare itself panics.
All safe functions on slices preserve the invariant that even if the function panics, alloriginal elements will remain in the slice and any possible modifications via interiormutability are observed in the input. This ensures that recovery code (for instance insideof aDrop or following acatch_unwind) will still have access to all the originalelements. For instance, if the slice belongs to aVec, theVec::drop method will be ableto dispose of all contained elements.
§Examples
1.7.0 ·Sourcepub fnsort_by_key<K, F>(&mut self, f: F)
pub fnsort_by_key<K, F>(&mut self, f: F)
Sorts the slice in ascending order with a key extraction function, preserving initial orderof equal elements.
This sort is stable (i.e., does not reorder equal elements) andO(m *n * log(n))worst-case, where the key function isO(m).
If the implementation ofOrd forK does not implement atotal order, the functionmay panic; even if the function exits normally, the resulting order of elements in the sliceis unspecified. See also the note on panicking below.
§Current implementation
The current implementation is based ondriftsort by Orson Peters and Lukas Bergdoll, whichcombines the fast average case of quicksort with the fast worst case and partial rundetection of mergesort, achieving linear time on fully sorted and reversed inputs. On inputswith k distinct elements, the expected time to sort the data isO(n * log(k)).
The auxiliary memory allocation behavior depends on the input length. Short slices arehandled without allocation, medium sized slices allocateself.len() and beyond that itclamps atself.len() / 2.
§Panics
May panic if the implementation ofOrd forK does not implement atotal order, or iftheOrd implementation or the key-functionf panics.
All safe functions on slices preserve the invariant that even if the function panics, alloriginal elements will remain in the slice and any possible modifications via interiormutability are observed in the input. This ensures that recovery code (for instance insideof aDrop or following acatch_unwind) will still have access to all the originalelements. For instance, if the slice belongs to aVec, theVec::drop method will be ableto dispose of all contained elements.
§Examples
1.34.0 ·Sourcepub fnsort_by_cached_key<K, F>(&mut self, f: F)
pub fnsort_by_cached_key<K, F>(&mut self, f: F)
Sorts the slice in ascending order with a key extraction function, preserving initial orderof equal elements.
This sort is stable (i.e., does not reorder equal elements) andO(m *n +n *log(n)) worst-case, where the key function isO(m).
During sorting, the key function is called at most once per element, by using temporarystorage to remember the results of key evaluation. The order of calls to the key function isunspecified and may change in future versions of the standard library.
If the implementation ofOrd forK does not implement atotal order, the functionmay panic; even if the function exits normally, the resulting order of elements in the sliceis unspecified. See also the note on panicking below.
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 implementation is based oninstruction-parallel-network sort by LukasBergdoll, which combines the fast average case of randomized quicksort with the fast worstcase of heapsort, while achieving linear time on fully sorted and reversed inputs. AndO(k * log(n)) wherek is the number of distinct elements in the input. It leveragessuperscalar out-of-order execution capabilities commonly found in CPUs, to efficientlyperform the operation.
In the worst case, the algorithm allocates temporary storage in aVec<(K, usize)> thelength of the slice.
§Panics
May panic if the implementation ofOrd forK does not implement atotal order, or iftheOrd implementation panics.
All safe functions on slices preserve the invariant that even if the function panics, alloriginal elements will remain in the slice and any possible modifications via interiormutability are observed in the input. This ensures that recovery code (for instance insideof aDrop or following acatch_unwind) will still have access to all the originalelements. For instance, if the slice belongs to aVec, theVec::drop method will be ableto dispose of all contained elements.
§Examples
Sourcepub fnto_vec_in<A>(&self, alloc: A) ->Vec<T, A>
🔬This is a nightly-only experimental API. (allocator_api #32838)
pub fnto_vec_in<A>(&self, alloc: A) ->Vec<T, A>
allocator_api #32838)Copiesself into a newVec with an allocator.
§Examples
1.0.0 ·Sourcepub fnconcat<Item>(&self) -> <[T] asConcat<Item>>::Outputⓘ
pub fnconcat<Item>(&self) -> <[T] asConcat<Item>>::Outputⓘ
Flattens a slice ofT into a single valueSelf::Output.
§Examples
1.3.0 ·Sourcepub fnjoin<Separator>( &self, sep: Separator,) -> <[T] asJoin<Separator>>::Outputⓘ
pub fnjoin<Separator>( &self, sep: Separator,) -> <[T] asJoin<Separator>>::Outputⓘ
Flattens a slice ofT into a single valueSelf::Output, placing agiven separator between each.
§Examples
Trait Implementations§
1.0.0 ·Source§impl<T, A>BorrowMut<[T]> forVec<T, A>where A:Allocator,
impl<T, A>BorrowMut<[T]> forVec<T, A>where A:Allocator,
Source§fnborrow_mut(&mut self) -> &mut[T]
fnborrow_mut(&mut self) -> &mut[T]
1.0.0 ·Source§impl<T, A>Clone forVec<T, A>
impl<T, A>Clone forVec<T, A>
Source§fnclone_from(&mut self, source: &Vec<T, A>)
fnclone_from(&mut self, source: &Vec<T, A>)
Overwrites the contents ofself with a clone of the contents ofsource.
This method is preferred over simply assigningsource.clone() toself,as it avoids reallocation if possible. Additionally, if the element typeT overridesclone_from(), this will reuse the resources ofself’selements as well.
§Examples
1.2.0 ·Source§impl<'a, T, A>Extend<&'a T> forVec<T, A>
Extend implementation that copies elements out of references before pushing them onto the Vec.
impl<'a, T, A>Extend<&'a T> forVec<T, A>
Extend implementation that copies elements out of references before pushing them onto the Vec.
This implementation is specialized for slice iterators, where it usescopy_from_slice toappend the entire slice at once.
1.0.0 ·Source§impl<T, A>Extend<T> forVec<T, A>where A:Allocator,
impl<T, A>Extend<T> forVec<T, A>where A:Allocator,
Source§fnextend<I>(&mut self, iter: I)where I:IntoIterator<Item = T>,
fnextend<I>(&mut self, iter: I)where I:IntoIterator<Item = T>,
Source§fnextend_one(&mut self, item: T)
fnextend_one(&mut self, item: T)
extend_one #72631)1.5.0 ·Source§impl<T, A>From<BinaryHeap<T, A>> forVec<T, A>where A:Allocator,
impl<T, A>From<BinaryHeap<T, A>> forVec<T, A>where A:Allocator,
Source§fnfrom(heap:BinaryHeap<T, A>) ->Vec<T, A>
fnfrom(heap:BinaryHeap<T, A>) ->Vec<T, A>
Converts aBinaryHeap<T> into aVec<T>.
This conversion requires no data movement or allocation, and hasconstant time complexity.
1.14.0 ·Source§impl<'a, T>From<Cow<'a,[T]>> forVec<T>
impl<'a, T>From<Cow<'a,[T]>> forVec<T>
1.5.0 ·Source§impl<T, A>From<Vec<T, A>> forBinaryHeap<T, A>
impl<T, A>From<Vec<T, A>> forBinaryHeap<T, A>
Source§fnfrom(vec:Vec<T, A>) ->BinaryHeap<T, A>
fnfrom(vec:Vec<T, A>) ->BinaryHeap<T, A>
Converts aVec<T> into aBinaryHeap<T>.
This conversion happens in-place, and hasO(n) time complexity.
1.20.0 ·Source§impl<T, A>From<Vec<T, A>> forBox<[T], A>where A:Allocator,
impl<T, A>From<Vec<T, A>> forBox<[T], A>where A:Allocator,
1.10.0 ·Source§impl<T, A>From<VecDeque<T, A>> forVec<T, A>where A:Allocator,
impl<T, A>From<VecDeque<T, A>> forVec<T, A>where A:Allocator,
Source§fnfrom(other:VecDeque<T, A>) ->Vec<T, A>
fnfrom(other:VecDeque<T, A>) ->Vec<T, A>
Turn aVecDeque<T> into aVec<T>.
This never needs to re-allocate, but does need to doO(n) data movement ifthe circular buffer doesn’t happen to be at the beginning of the allocation.
§Examples
usestd::collections::VecDeque;// This one is *O*(1).letdeque: VecDeque<_> = (1..5).collect();letptr = deque.as_slices().0.as_ptr();letvec = Vec::from(deque);assert_eq!(vec, [1,2,3,4]);assert_eq!(vec.as_ptr(), ptr);// This one needs data rearranging.letmutdeque: VecDeque<_> = (1..5).collect();deque.push_front(9);deque.push_front(8);letptr = deque.as_slices().1.as_ptr();letvec = Vec::from(deque);assert_eq!(vec, [8,9,1,2,3,4]);assert_eq!(vec.as_ptr(), ptr);1.0.0 ·Source§impl<T>FromIterator<T> forVec<T>
Collects an iterator into a Vec, commonly called viaIterator::collect()
impl<T>FromIterator<T> forVec<T>
Collects an iterator into a Vec, commonly called viaIterator::collect()
§Allocation behavior
In generalVec does not guarantee any particular growth or allocation strategy.That also applies to this trait impl.
Note: This section covers implementation details and is therefore exempt fromstability guarantees.
Vec may use any or none of the following strategies,depending on the supplied iterator:
- preallocate based on
Iterator::size_hint()- and panic if the number of items is outside the provided lower/upper bounds
- use an amortized growth strategy similar to
pushingone item at a time - perform the iteration in-place on the original allocation backing the iterator
The last case warrants some attention. It is an optimization that in many cases reduces peak memoryconsumption and improves cache locality. But when big, short-lived allocations are created,only a small fraction of their items get collected, no further use is made of the spare capacityand the resultingVec is moved into a longer-lived structure, then this can lead to the largeallocations having their lifetimes unnecessarily extended which can result in increased memoryfootprint.
In cases where this is an issue, the excess capacity can be discarded withVec::shrink_to(),Vec::shrink_to_fit() or by collecting intoBox<[T]> instead, which additionally reducesthe size of the long-lived struct.
staticLONG_LIVED: Mutex<Vec<Vec<u16>>> = Mutex::new(Vec::new());foriin0..10{letbig_temporary: Vec<u16> = (0..1024).collect();// discard most itemsletmutresult: Vec<_> = big_temporary.into_iter().filter(|i| i %100==0).collect();// without this a lot of unused capacity might be moved into the globalresult.shrink_to_fit(); LONG_LIVED.lock().unwrap().push(result);}1.0.0 ·Source§impl<T, A>Hash forVec<T, A>
The hash of a vector is the same as that of the corresponding slice,as required by thecore::borrow::Borrow implementation.
impl<T, A>Hash forVec<T, A>
The hash of a vector is the same as that of the corresponding slice,as required by thecore::borrow::Borrow implementation.
1.0.0 ·Source§impl<'a, T, A>IntoIterator for &'aVec<T, A>where A:Allocator,
impl<'a, T, A>IntoIterator for &'aVec<T, A>where A:Allocator,
1.0.0 ·Source§impl<'a, T, A>IntoIterator for &'a mutVec<T, A>where A:Allocator,
impl<'a, T, A>IntoIterator for &'a mutVec<T, A>where A:Allocator,
1.0.0 ·Source§impl<T, A>IntoIterator forVec<T, A>where A:Allocator,
impl<T, A>IntoIterator forVec<T, A>where A:Allocator,
1.0.0 ·Source§impl<T, A>Ord forVec<T, A>
Implements ordering of vectors,lexicographically.
impl<T, A>Ord forVec<T, A>
Implements ordering of vectors,lexicographically.
1.0.0 ·Source§impl<T, A1, A2>PartialOrd<Vec<T, A2>> forVec<T, A1>
Implements comparison of vectors,lexicographically.
impl<T, A1, A2>PartialOrd<Vec<T, A2>> forVec<T, A1>
Implements comparison of vectors,lexicographically.
1.66.0 ·Source§impl<T, const N:usize>TryFrom<Vec<T>> forBox<[T; N]>
impl<T, const N:usize>TryFrom<Vec<T>> forBox<[T; N]>
Source§fntry_from( vec:Vec<T>,) ->Result<Box<[T; N]>, <Box<[T; N]> asTryFrom<Vec<T>>>::Error>
fntry_from( vec:Vec<T>,) ->Result<Box<[T; N]>, <Box<[T; N]> asTryFrom<Vec<T>>>::Error>
Attempts to convert aVec<T> into aBox<[T; N]>.
LikeVec::into_boxed_slice, this is in-place ifvec.capacity() == N,but will require a reallocation otherwise.
§Errors
Returns the originalVec<T> in theErr variant ifboxed_slice.len() does not equalN.
§Examples
This can be used withvec! to create an array on the heap:
1.48.0 ·Source§impl<T, A, const N:usize>TryFrom<Vec<T, A>> for[T; N]where A:Allocator,
impl<T, A, const N:usize>TryFrom<Vec<T, A>> for[T; N]where A:Allocator,
Source§fntry_from(vec:Vec<T, A>) ->Result<[T; N],Vec<T, A>>
fntry_from(vec:Vec<T, A>) ->Result<[T; N],Vec<T, A>>
Gets the entire contents of theVec<T> as an array,if its size exactly matches that of the requested array.
§Examples
If the length doesn’t match, the input comes back inErr:
letr:Result<[i32;4],_> = (0..10).collect::<Vec<_>>().try_into();assert_eq!(r,Err(vec![0,1,2,3,4,5,6,7,8,9]));If you’re fine with just getting a prefix of theVec<T>,you can call.truncate(N) first.
1.87.0 ·Source§implTryFrom<Vec<u8>> forString
implTryFrom<Vec<u8>> forString
1.0.0 ·Source§impl<A:Allocator>Write forVec<u8, A>
Write is implemented forVec<u8> by appending to the vector.The vector will grow as needed.
impl<A:Allocator>Write forVec<u8, A>
Write is implemented forVec<u8> by appending to the vector.The vector will grow as needed.
Source§fnwrite(&mut self, buf: &[u8]) ->Result<usize>
fnwrite(&mut self, buf: &[u8]) ->Result<usize>
Source§fnis_write_vectored(&self) ->bool
fnis_write_vectored(&self) ->bool
can_vector #69941)Source§fnwrite_all(&mut self, buf: &[u8]) ->Result<()>
fnwrite_all(&mut self, buf: &[u8]) ->Result<()>
Source§fnwrite_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) ->Result<()>
fnwrite_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) ->Result<()>
write_all_vectored #70436)