Movatterモバイル変換


[0]ホーム

URL:


Vec

std::vec

StructVec 

1.0.0 ·Source
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:

letmutvec1 =vec![1,2,3];vec1.push(4);letvec2 = Vec::from([1,2,3,4]);assert_eq!(vec1, vec2);

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:

letv =vec![0,2,4,6];println!("{}", v[1]);// it will display '2'

However be careful: if you try to access an index which isn’t in theVec,your software will panic! You cannot do this:

letv =vec![0,2,4,6];println!("{}", v[6]);// it will panic!

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, seeMaybeUninit.
  • Note: the ABI is not stable andVec makes 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 manipulateaVec. The contents of aVec wouldn’t have a stable address if it wereonly moved, and it would be more difficult to determine if aVec hadactually 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>

1.0.0 (const: 1.39.0) ·Source

pub const fnnew() ->Vec<T>

Constructs a new, emptyVec<T>.

The vector will not allocate until elements are pushed onto it.

§Examples
letmutvec: Vec<i32> = Vec::new();
1.0.0 ·Source

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);
Source

pub fntry_with_capacity(capacity:usize) ->Result<Vec<T>,TryReserveError>

🔬This is a nightly-only experimental API. (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 ·Source

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:

  • IfT is not a zero-sized type and the capacity is nonzero,ptr must havebeen allocated using the global allocator, such as via thealloc::allocfunction. IfT is a zero-sized type or the capacity is zero,ptr needonly be non-null and aligned.
  • T needs to have the same alignment as whatptr was allocated with,if the pointer is required to be allocated.(T having a less strict alignment is not sufficient, the alignment reallyneeds to be equal to satisfy thedealloc requirement that memory must beallocated and deallocated with the same layout.)
  • The size ofT times thecapacity (ie. the allocated size in bytes), ifnonzero, needs to be the same size as the pointer was allocated with.(Because similar to alignment,dealloc must be called with the samelayoutsize.)
  • length needs to be less than or equal tocapacity.
  • The firstlength values must be properly initialized values of typeT.
  • capacity needs 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 thanisize::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);}
Source

pub unsafe fnfrom_parts( ptr:NonNull<T>, length:usize, capacity:usize,) ->Vec<T>

🔬This is a nightly-only experimental API. (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:

  • ptr must have been allocated using the global allocator, such as viathealloc::alloc function.
  • T needs to have the same alignment as whatptr was allocated with.(T having a less strict alignment is not sufficient, the alignment reallyneeds to be equal to satisfy thedealloc requirement that memory must beallocated and deallocated with the same layout.)
  • The size ofT times thecapacity (ie. the allocated size in bytes) needsto be the same size as the pointer was allocated with. (Because similar toalignment,dealloc must be called with the same layoutsize.)
  • length needs to be less than or equal tocapacity.
  • The firstlength values must be properly initialized values of typeT.
  • capacity needs to be the capacity that the pointer was allocated with.
  • The allocated size in bytes must be no larger thanisize::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 ·Source

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
letv: Vec<i32> =vec![-1,0,1];let(ptr, len, cap) = v.into_raw_parts();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(ptr, len, cap)};assert_eq!(rebuilt, [4294967295,0,1]);
Source

pub fninto_parts(self) -> (NonNull<T>,usize,usize)

🔬This is a nightly-only experimental API. (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,

Source

pub const fnnew_in(alloc: A) ->Vec<T, A>

🔬This is a nightly-only experimental API. (allocator_api #32838)

Constructs a new, emptyVec<T, A>.

The vector will not allocate until elements are pushed onto it.

§Examples
#![feature(allocator_api)]usestd::alloc::System;letmutvec: Vec<i32,_> = Vec::new_in(System);
Source

pub fnwith_capacity_in(capacity:usize, alloc: A) ->Vec<T, A>

🔬This is a nightly-only experimental API. (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);
Source

pub fntry_with_capacity_in( capacity:usize, alloc: A,) ->Result<Vec<T, A>,TryReserveError>

🔬This is a nightly-only experimental API. (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.

Source

pub 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)

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:

  • ptr must becurrently allocated via the given allocatoralloc.
  • T needs to have the same alignment as whatptr was allocated with.(T having a less strict alignment is not sufficient, the alignment reallyneeds to be equal to satisfy thedealloc requirement that memory must beallocated and deallocated with the same layout.)
  • The size ofT times thecapacity (ie. the allocated size in bytes) needsto be the same size as the pointer was allocated with. (Because similar toalignment,dealloc must be called with the same layoutsize.)
  • length needs to be less than or equal tocapacity.
  • The firstlength values must be properly initialized values of typeT.
  • capacity needs tofit the layout size that the pointer was allocated with.
  • The allocated size in bytes must be no larger thanisize::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);}
Source

pub 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)

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:

  • ptr must becurrently allocated via the given allocatoralloc.
  • T needs to have the same alignment as whatptr was allocated with.(T having a less strict alignment is not sufficient, the alignment reallyneeds to be equal to satisfy thedealloc requirement that memory must beallocated and deallocated with the same layout.)
  • The size ofT times thecapacity (ie. the allocated size in bytes) needsto be the same size as the pointer was allocated with. (Because similar toalignment,dealloc must be called with the same layoutsize.)
  • length needs to be less than or equal tocapacity.
  • The firstlength values must be properly initialized values of typeT.
  • capacity needs tofit the layout size that the pointer was allocated with.
  • The allocated size in bytes must be no larger thanisize::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);}
Source

pub fninto_raw_parts_with_alloc(self) -> (*mut T,usize,usize, A)

🔬This is a nightly-only experimental API. (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]);
Source

pub fninto_parts_with_alloc(self) -> (NonNull<T>,usize,usize, A)

🔬This is a nightly-only experimental API. (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) ·Source

pub const fncapacity(&self) ->usize

Returns the total number of elements the vector can hold withoutreallocating.

§Examples
letmutvec: Vec<i32> = Vec::with_capacity(10);vec.push(42);assert!(vec.capacity() >=10);

A vector with zero-sized elements will always have a capacity of usize::MAX:

#[derive(Clone)]structZeroSized;fnmain() {assert_eq!(std::mem::size_of::<ZeroSized>(),0);letv =vec![ZeroSized;0];assert_eq!(v.capacity(), usize::MAX);}
1.0.0 ·Source

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
letmutvec =vec![1];vec.reserve(10);assert!(vec.capacity() >=11);
1.0.0 ·Source

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
letmutvec =vec![1];vec.reserve_exact(10);assert!(vec.capacity() >=11);
1.57.0 ·Source

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 ·Source

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 ·Source

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
letmutvec = Vec::with_capacity(10);vec.extend([1,2,3]);assert!(vec.capacity() >=10);vec.shrink_to_fit();assert!(vec.capacity() >=3);
1.56.0 ·Source

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
letmutvec = Vec::with_capacity(10);vec.extend([1,2,3]);assert!(vec.capacity() >=10);vec.shrink_to(4);assert!(vec.capacity() >=4);vec.shrink_to(0);assert!(vec.capacity() >=3);
1.0.0 ·Source

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
letv =vec![1,2,3];letslice = v.into_boxed_slice();

Any excess capacity is removed:

letmutvec = Vec::with_capacity(10);vec.extend([1,2,3]);assert!(vec.capacity() >=10);letslice = vec.into_boxed_slice();assert_eq!(slice.into_vec().capacity(),3);
1.0.0 ·Source

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:

letmutvec =vec![1,2,3,4,5];vec.truncate(2);assert_eq!(vec, [1,2]);

No truncation occurs whenlen is greater than the vector’s currentlength:

letmutvec =vec![1,2,3];vec.truncate(8);assert_eq!(vec, [1,2,3]);

Truncating whenlen == 0 is equivalent to calling theclearmethod.

letmutvec =vec![1,2,3];vec.truncate(0);assert_eq!(vec, []);
1.7.0 (const: 1.87.0) ·Source

pub const fnas_slice(&self) -> &[T]

Extracts a slice containing the entire vector.

Equivalent to&s[..].

§Examples
usestd::io::{self, Write};letbuffer =vec![1,2,3,5,8];io::sink().write(buffer.as_slice()).unwrap();
1.7.0 (const: 1.87.0) ·Source

pub const fnas_mut_slice(&mut self) -> &mut[T]

Extracts a mutable slice of the entire vector.

Equivalent to&mut s[..].

§Examples
usestd::io::{self, Read};letmutbuffer =vec![0;3];io::repeat(0b101).read_exact(buffer.as_mut_slice()).unwrap();
1.37.0 (const: 1.87.0) ·Source

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:

unsafe{letmutv =vec![0,1,2];letptr1 = v.as_ptr();let _= ptr1.read();letptr2 = v.as_mut_ptr().offset(2);    ptr2.write(2);// Notably, the write to `ptr2` did *not* invalidate `ptr1`    // because it mutated a different element:let _= ptr1.read();}
1.37.0 (const: 1.87.0) ·Source

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):

usestd::mem::{ManuallyDrop, MaybeUninit};letmutv = ManuallyDrop::new(vec![0,1,2]);letptr = v.as_mut_ptr();letcapacity = v.capacity();letslice_ptr:*mut[MaybeUninit<i32>] =    std::ptr::slice_from_raw_parts_mut(ptr.cast(), capacity);drop(unsafe{ Box::from_raw(slice_ptr) });
Source

pub const fnas_non_null(&mut self) ->NonNull<T>

🔬This is a nightly-only experimental API. (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:

#![feature(box_vec_non_null)]unsafe{letmutv =vec![0];letptr1 = v.as_non_null();    ptr1.write(1);letptr2 = v.as_non_null();    ptr2.write(2);// Notably, the write to `ptr2` did *not* invalidate `ptr1`:ptr1.write(3);}
Source

pub fnallocator(&self) ->&A

🔬This is a nightly-only experimental API. (allocator_api #32838)

Returns a reference to the underlying allocator.

1.0.0 ·Source

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_len must be less than or equal tocapacity().
  • The elements atold_len..new_len must 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 ·Source

pub fnswap_remove(&mut self, index:usize) -> T

Removes an element from the vector and returns it.

The removed element is replaced by the last element of the vector.

This does not preserve ordering of the remaining elements, but isO(1).If you need to preserve the element order, useremove instead.

§Panics

Panics ifindex is out of bounds.

§Examples
letmutv =vec!["foo","bar","baz","qux"];assert_eq!(v.swap_remove(1),"bar");assert_eq!(v, ["foo","qux","baz"]);assert_eq!(v.swap_remove(0),"foo");assert_eq!(v, ["baz","qux"]);
1.0.0 ·Source

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.

Source

pub fninsert_mut(&mut self, index:usize, element: T) ->&mut T

🔬This is a nightly-only experimental API. (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 ·Source

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
letmutv =vec!['a','b','c'];assert_eq!(v.remove(1),'b');assert_eq!(v, ['a','c']);
Source

pub fntry_remove(&mut self, index:usize) ->Option<T>

🔬This is a nightly-only experimental API. (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
#![feature(vec_try_remove)]letmutv =vec![1,2,3];assert_eq!(v.try_remove(0),Some(1));assert_eq!(v.try_remove(2),None);
1.0.0 ·Source

pub fnretain<F>(&mut self, f: F)
where F:FnMut(&T) ->bool,

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
letmutvec =vec![1,2,3,4];vec.retain(|&x| x %2==0);assert_eq!(vec, [2,4]);

Because the elements are visited exactly once in the original order,external state may be used to decide which elements to keep.

letmutvec =vec![1,2,3,4,5];letkeep = [false,true,true,false,true];letmutiter = keep.iter();vec.retain(|_|*iter.next().unwrap());assert_eq!(vec, [2,3,5]);
1.61.0 ·Source

pub fnretain_mut<F>(&mut self, f: F)
where F:FnMut(&mut T) ->bool,

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
letmutvec =vec![1,2,3,4];vec.retain_mut(|x|if*x <=3{*x +=1;true}else{false});assert_eq!(vec, [2,3,4]);
1.16.0 ·Source

pub fndedup_by_key<F, K>(&mut self, key: F)
where F:FnMut(&mut T) -> K, K:PartialEq,

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
letmutvec =vec![10,20,21,30,20];vec.dedup_by_key(|i|*i /10);assert_eq!(vec, [10,20,30,20]);
1.16.0 ·Source

pub fndedup_by<F>(&mut self, same_bucket: F)
where F:FnMut(&mut T,&mut T) ->bool,

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
letmutvec =vec!["foo","bar","Bar","baz","bar"];vec.dedup_by(|a, b| a.eq_ignore_ascii_case(b));assert_eq!(vec, ["foo","bar","baz","bar"]);
1.0.0 ·Source

pub fnpush(&mut self, value: T)

Appends an element to the back of a collection.

§Panics

Panics if the new capacity exceedsisize::MAXbytes.

§Examples
letmutvec =vec![1,2];vec.push(3);assert_eq!(vec, [1,2,3]);
§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.

Source

pub fnpush_within_capacity(&mut self, value: T) ->Result<&mut T, T>

🔬This is a nightly-only experimental API. (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.

Source

pub fnpush_mut(&mut self, value: T) ->&mut T

🔬This is a nightly-only experimental API. (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 ·Source

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
letmutvec =vec![1,2,3];assert_eq!(vec.pop(),Some(3));assert_eq!(vec, [1,2]);
§Time complexity

TakesO(1) time.

1.86.0 ·Source

pub fnpop_if(&mut self, predicate: implFnOnce(&mut T) ->bool) ->Option<T>

Removes and returns the last element from a vector if the predicatereturnstrue, orNone if the predicate returns false or the vectoris empty (the predicate will not be called in that case).

§Examples
letmutvec =vec![1,2,3,4];letpred = |x:&muti32|*x %2==0;assert_eq!(vec.pop_if(pred),Some(4));assert_eq!(vec, [1,2,3]);assert_eq!(vec.pop_if(pred),None);
Source

pub fnpeek_mut(&mut self) ->Option<PeekMut<'_, T, A>>

🔬This is a nightly-only experimental API. (vec_peek_mut #122742)

Returns a mutable reference to the last item in the vector, orNone if it is empty.

§Examples

Basic usage:

#![feature(vec_peek_mut)]letmutvec = Vec::new();assert!(vec.peek_mut().is_none());vec.push(1);vec.push(5);vec.push(2);assert_eq!(vec.last(),Some(&2));if letSome(mutval) = vec.peek_mut() {*val =0;}assert_eq!(vec.last(),Some(&0));
1.4.0 ·Source

pub fnappend(&mut self, other: &mutVec<T, A>)

Moves all the elements ofother intoself, leavingother empty.

§Panics

Panics if the new capacity exceedsisize::MAXbytes.

§Examples
letmutvec =vec![1,2,3];letmutvec2 =vec![4,5,6];vec.append(&mutvec2);assert_eq!(vec, [1,2,3,4,5,6]);assert_eq!(vec2, []);
1.6.0 ·Source

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
letmutv =vec![1,2,3];letu: Vec<_> = v.drain(1..).collect();assert_eq!(v,&[1]);assert_eq!(u,&[2,3]);// A full range clears the vector, like `clear()` doesv.drain(..);assert_eq!(v,&[]);
1.0.0 ·Source

pub fnclear(&mut self)

Clears the vector, removing all values.

Note that this method has no effect on the allocated capacityof the vector.

§Examples
letmutv =vec![1,2,3];v.clear();assert!(v.is_empty());
1.0.0 (const: 1.87.0) ·Source

pub const fnlen(&self) ->usize

Returns the number of elements in the vector, also referred toas its ‘length’.

§Examples
leta =vec![1,2,3];assert_eq!(a.len(),3);
1.0.0 (const: 1.87.0) ·Source

pub const fnis_empty(&self) ->bool

Returnstrue if the vector contains no elements.

§Examples
letmutv = Vec::new();assert!(v.is_empty());v.push(1);assert!(!v.is_empty());
1.4.0 ·Source

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, seemem::take ormem::replace.
  • If you don’t need the returned vector at all, seeVec::truncate.
  • If you want to take ownership of an arbitrary subslice, or you don’tnecessarily want to store the removed items in a vector, seeVec::drain.
§Panics

Panics ifat > len.

§Examples
letmutvec =vec!['a','b','c'];letvec2 = vec.split_off(1);assert_eq!(vec, ['a']);assert_eq!(vec2, ['b','c']);
1.33.0 ·Source

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
letmutvec =vec![1,2,3];vec.resize_with(5, Default::default);assert_eq!(vec, [1,2,3,0,0]);letmutvec =vec![];letmutp =1;vec.resize_with(4, || { p*=2; p });assert_eq!(vec, [2,4,8,16]);
1.47.0 ·Source

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:

letx =vec![1,2,3];letstatic_ref:&'staticmut[usize] = x.leak();static_ref[0] +=1;assert_eq!(static_ref,&[2,2,3]);
1.60.0 ·Source

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]);
Source

pub fnsplit_at_spare_mut(&mut self) -> (&mut[T], &mut [MaybeUninit<T>])

🔬This is a nightly-only experimental API. (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]);
Source

pub fninto_chunks<const N:usize>(self) ->Vec<[T; N], A>

🔬This is a nightly-only experimental API. (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);
Source

pub fnrecycle<U>(self) ->Vec<U, A>
where U: Recyclable<T>,

🔬This is a nightly-only experimental API. (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>
where T:Clone, A:Allocator,

1.5.0 ·Source

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
letmutvec =vec!["hello"];vec.resize(3,"world");assert_eq!(vec, ["hello","world","world"]);letmutvec =vec!['a','b','c','d'];vec.resize(2,'_');assert_eq!(vec, ['a','b']);
1.6.0 ·Source

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
letmutvec =vec![1];vec.extend_from_slice(&[2,3,4]);assert_eq!(vec, [1,2,3,4]);
1.53.0 ·Source

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,

1.80.0 ·Source

pub fninto_flattened(self) ->Vec<T, A>

Takes aVec<[T; N]> and flattens it into aVec<T>.

§Panics

Panics if the length of the resulting vector would overflow ausize.

This is only possible when flattening a vector of arrays of zero-sizedtypes, and thus tends to be irrelevant in practice. Ifsize_of::<T>() > 0, this will never panic.

§Examples
letmutvec =vec![[1,2,3], [4,5,6], [7,8,9]];assert_eq!(vec.pop(),Some([7,8,9]));letmutflattened = vec.into_flattened();assert_eq!(flattened.pop(),Some(6));
Source§

impl<T, A>Vec<T, A>
where T:PartialEq, A:Allocator,

1.0.0 ·Source

pub fndedup(&mut self)

Removes consecutive repeated elements in the vector according to thePartialEq trait implementation.

If the vector is sorted, this removes all duplicates.

§Examples
letmutvec =vec![1,2,2,3,2];vec.dedup();assert_eq!(vec, [1,2,3,2]);
Source§

impl<T, A>Vec<T, A>
where A:Allocator,

1.21.0 ·Source

pub fnsplice<R, I>( &mut self, range: R, replace_with: I,) ->Splice<'_, <I asIntoIterator>::IntoIter, A>
where R:RangeBounds<usize>, I:IntoIterator<Item = T>,

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 afterrange) is empty,
  • orreplace_with yields fewer or equal elements thanrange’s length
  • or the lower bound of itssize_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:

letmutv =vec![1,5];letnew = [2,3,4];v.splice(1..1, new);assert_eq!(v, [1,2,3,4,5]);
1.87.0 ·Source

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:

letmutitems =vec![0,0,0,0,0,0,0,1,2,1,2,1,2];letones = items.extract_if(7.., |x|*x ==1).collect::<Vec<_>>();assert_eq!(items,vec![0,0,0,0,0,0,0,2,2,2]);assert_eq!(ones.len(),3);

Methods fromDeref<Target =[T]>§

1.0.0 ·Source

pub fnlen(&self) ->usize

Returns the number of elements in the slice.

§Examples
leta = [1,2,3];assert_eq!(a.len(),3);
1.0.0 ·Source

pub fnis_empty(&self) ->bool

Returnstrue if the slice has a length of 0.

§Examples
leta = [1,2,3];assert!(!a.is_empty());letb:&[i32] =&[];assert!(b.is_empty());
1.0.0 ·Source

pub fnfirst(&self) ->Option<&T>

Returns the first element of the slice, orNone if it is empty.

§Examples
letv = [10,40,30];assert_eq!(Some(&10), v.first());letw:&[i32] =&[];assert_eq!(None, w.first());
1.0.0 ·Source

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
letx =&mut[0,1,2];if letSome(first) = x.first_mut() {*first =5;}assert_eq!(x,&[5,1,2]);lety:&mut[i32] =&mut[];assert_eq!(None, y.first_mut());
1.5.0 ·Source

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
letx =&[0,1,2];if letSome((first, elements)) = x.split_first() {assert_eq!(first,&0);assert_eq!(elements,&[1,2]);}
1.5.0 ·Source

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
letx =&mut[0,1,2];if letSome((first, elements)) = x.split_first_mut() {*first =3;    elements[0] =4;    elements[1] =5;}assert_eq!(x,&[3,4,5]);
1.5.0 ·Source

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
letx =&[0,1,2];if letSome((last, elements)) = x.split_last() {assert_eq!(last,&2);assert_eq!(elements,&[0,1]);}
1.5.0 ·Source

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
letx =&mut[0,1,2];if letSome((last, elements)) = x.split_last_mut() {*last =3;    elements[0] =4;    elements[1] =5;}assert_eq!(x,&[4,5,3]);
1.0.0 ·Source

pub fnlast(&self) ->Option<&T>

Returns the last element of the slice, orNone if it is empty.

§Examples
letv = [10,40,30];assert_eq!(Some(&30), v.last());letw:&[i32] =&[];assert_eq!(None, w.last());
1.0.0 ·Source

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
letx =&mut[0,1,2];if letSome(last) = x.last_mut() {*last =10;}assert_eq!(x,&[0,1,10]);lety:&mut[i32] =&mut[];assert_eq!(None, y.last_mut());
1.77.0 ·Source

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
letu = [10,40,30];assert_eq!(Some(&[10,40]), u.first_chunk::<2>());letv:&[i32] =&[10];assert_eq!(None, v.first_chunk::<2>());letw:&[i32] =&[];assert_eq!(Some(&[]), w.first_chunk::<0>());
1.77.0 ·Source

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
letx =&mut[0,1,2];if letSome(first) = x.first_chunk_mut::<2>() {    first[0] =5;    first[1] =4;}assert_eq!(x,&[5,4,2]);assert_eq!(None, x.first_chunk_mut::<4>());
1.77.0 ·Source

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
letx =&[0,1,2];if letSome((first, elements)) = x.split_first_chunk::<2>() {assert_eq!(first,&[0,1]);assert_eq!(elements,&[2]);}assert_eq!(None, x.split_first_chunk::<4>());
1.77.0 ·Source

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
letx =&mut[0,1,2];if letSome((first, elements)) = x.split_first_chunk_mut::<2>() {    first[0] =3;    first[1] =4;    elements[0] =5;}assert_eq!(x,&[3,4,5]);assert_eq!(None, x.split_first_chunk_mut::<4>());
1.77.0 ·Source

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
letx =&[0,1,2];if letSome((elements, last)) = x.split_last_chunk::<2>() {assert_eq!(elements,&[0]);assert_eq!(last,&[1,2]);}assert_eq!(None, x.split_last_chunk::<4>());
1.77.0 ·Source

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
letx =&mut[0,1,2];if letSome((elements, last)) = x.split_last_chunk_mut::<2>() {    last[0] =3;    last[1] =4;    elements[0] =5;}assert_eq!(x,&[5,3,4]);assert_eq!(None, x.split_last_chunk_mut::<4>());
1.77.0 ·Source

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
letu = [10,40,30];assert_eq!(Some(&[40,30]), u.last_chunk::<2>());letv:&[i32] =&[10];assert_eq!(None, v.last_chunk::<2>());letw:&[i32] =&[];assert_eq!(Some(&[]), w.last_chunk::<0>());
1.77.0 ·Source

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
letx =&mut[0,1,2];if letSome(last) = x.last_chunk_mut::<2>() {    last[0] =10;    last[1] =20;}assert_eq!(x,&[0,10,20]);assert_eq!(None, x.last_chunk_mut::<4>());
1.0.0 ·Source

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 orNone if out of bounds.
  • If given a range, returns the subslice corresponding to that range,orNone if out of bounds.
§Examples
letv = [10,40,30];assert_eq!(Some(&40), v.get(1));assert_eq!(Some(&[10,40][..]), v.get(0..2));assert_eq!(None, v.get(3));assert_eq!(None, v.get(0..4));
1.0.0 ·Source

pub fnget_mut<I>( &mut self, index: I,) ->Option<&mut <I asSliceIndex<[T]>>::Output>
where I:SliceIndex<[T]>,

Returns a mutable reference to an element or subslice depending on thetype of index (seeget) orNone if the index is out of bounds.

§Examples
letx =&mut[0,1,2];if letSome(elem) = x.get_mut(1) {*elem =42;}assert_eq!(x,&[0,42,2]);
1.0.0 ·Source

pub unsafe fnget_unchecked<I>( &self, index: I,) -> &<I asSliceIndex<[T]>>::Output
where 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
letx =&[1,2,4];unsafe{assert_eq!(x.get_unchecked(1),&2);}
1.0.0 ·Source

pub unsafe fnget_unchecked_mut<I>( &mut self, index: I,) -> &mut <I asSliceIndex<[T]>>::Output
where 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
letx =&mut[1,2,4];unsafe{letelem = x.get_unchecked_mut(1);*elem =13;}assert_eq!(x,&[1,13,4]);
1.0.0 ·Source

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
letx =&[1,2,4];letx_ptr = x.as_ptr();unsafe{foriin0..x.len() {assert_eq!(x.get_unchecked(i),&*x_ptr.add(i));    }}
1.0.0 ·Source

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
letx =&mut[1,2,4];letx_ptr = x.as_mut_ptr();unsafe{foriin0..x.len() {*x_ptr.add(i) +=2;    }}assert_eq!(x,&[3,4,6]);
1.48.0 ·Source

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:

leta = [1,2,3];letx =&a[1]as*const_;lety =&5as*const_;assert!(a.as_ptr_range().contains(&x));assert!(!a.as_ptr_range().contains(&y));
1.48.0 ·Source

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 ·Source

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 ·Source

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 ·Source

pub fnswap(&mut self, a:usize, b:usize)

Swaps two elements in the slice.

Ifa equals tob, it’s guaranteed that elements won’t change value.

§Arguments
  • a - The index of the first element
  • b - The index of the second element
§Panics

Panics ifa orb are out of bounds.

§Examples
letmutv = ["a","b","c","d","e"];v.swap(2,4);assert!(v == ["a","b","e","d","c"]);
Source

pub unsafe fnswap_unchecked(&mut self, a:usize, b:usize)

🔬This is a nightly-only experimental API. (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
#![feature(slice_swap_unchecked)]letmutv = ["a","b","c","d"];// SAFETY: we know that 1 and 3 are both indices of the sliceunsafe{ v.swap_unchecked(1,3) };assert!(v == ["a","d","c","b"]);
1.0.0 ·Source

pub fnreverse(&mut self)

Reverses the order of elements in the slice, in place.

§Examples
letmutv = [1,2,3];v.reverse();assert!(v == [3,2,1]);
1.0.0 ·Source

pub fniter(&self) ->Iter<'_, T>

Returns an iterator over the slice.

The iterator yields all items from start to end.

§Examples
letx =&[1,2,4];letmutiterator = x.iter();assert_eq!(iterator.next(),Some(&1));assert_eq!(iterator.next(),Some(&2));assert_eq!(iterator.next(),Some(&4));assert_eq!(iterator.next(),None);
1.0.0 ·Source

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
letx =&mut[1,2,4];foreleminx.iter_mut() {*elem +=2;}assert_eq!(x,&[3,4,6]);
1.0.0 ·Source

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:

letslice = ['f','o','o'];letmutiter = slice.windows(4);assert!(iter.next().is_none());

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:

usestd::cell::Cell;letmutarray = ['R','u','s','t',' ','2','0','1','5'];letslice =&mutarray[..];letslice_of_cells:&[Cell<char>] = Cell::from_mut(slice).as_slice_of_cells();forwinslice_of_cells.windows(3) {    Cell::swap(&w[0],&w[2]);}assert_eq!(array, ['s','t',' ','2','0','1','5','u','R']);
1.0.0 ·Source

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
letslice = ['l','o','r','e','m'];letmutiter = slice.chunks(2);assert_eq!(iter.next().unwrap(),&['l','o']);assert_eq!(iter.next().unwrap(),&['r','e']);assert_eq!(iter.next().unwrap(),&['m']);assert!(iter.next().is_none());
1.0.0 ·Source

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
letv =&mut[0,0,0,0,0];letmutcount =1;forchunkinv.chunks_mut(2) {foreleminchunk.iter_mut() {*elem += count;    }    count +=1;}assert_eq!(v,&[1,1,2,2,3]);
1.31.0 ·Source

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
letslice = ['l','o','r','e','m'];letmutiter = slice.chunks_exact(2);assert_eq!(iter.next().unwrap(),&['l','o']);assert_eq!(iter.next().unwrap(),&['r','e']);assert!(iter.next().is_none());assert_eq!(iter.remainder(),&['m']);
1.31.0 ·Source

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
letv =&mut[0,0,0,0,0];letmutcount =1;forchunkinv.chunks_exact_mut(2) {foreleminchunk.iter_mut() {*elem += count;    }    count +=1;}assert_eq!(v,&[1,1,2,2,0]);
1.88.0 ·Source

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 intoN-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 allowed
1.88.0 ·Source

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, and
  • slice.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:

letslice = ['R','u','s','t'];let(chunks, []) = slice.as_chunks::<2>()else{panic!("slice didn't have even length")};assert_eq!(chunks,&[['R','u'], ['s','t']]);
1.88.0 ·Source

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, and
  • slice.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(remainder, chunks) = slice.as_rchunks();assert_eq!(remainder,&['l']);assert_eq!(chunks,&[['o','r'], ['e','m']]);
1.88.0 ·Source

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 intoN-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 allowed
1.88.0 ·Source

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, and
  • slice.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
letv =&mut[0,0,0,0,0];letmutcount =1;let(chunks, remainder) = v.as_chunks_mut();remainder[0] =9;forchunkinchunks {*chunk = [count;2];    count +=1;}assert_eq!(v,&[1,1,2,2,9]);
1.88.0 ·Source

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, and
  • slice.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
letv =&mut[0,0,0,0,0];letmutcount =1;let(remainder, chunks) = v.as_rchunks_mut();remainder[0] =9;forchunkinchunks {*chunk = [count;2];    count +=1;}assert_eq!(v,&[9,1,1,2,2]);
Source

pub fnarray_windows<const N:usize>(&self) ->ArrayWindows<'_, T, N>

🔬This is a nightly-only experimental API. (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
#![feature(array_windows)]letslice = [0,1,2,3];letmutiter = slice.array_windows();assert_eq!(iter.next().unwrap(),&[0,1]);assert_eq!(iter.next().unwrap(),&[1,2]);assert_eq!(iter.next().unwrap(),&[2,3]);assert!(iter.next().is_none());
1.31.0 ·Source

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
letslice = ['l','o','r','e','m'];letmutiter = slice.rchunks(2);assert_eq!(iter.next().unwrap(),&['e','m']);assert_eq!(iter.next().unwrap(),&['o','r']);assert_eq!(iter.next().unwrap(),&['l']);assert!(iter.next().is_none());
1.31.0 ·Source

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
letv =&mut[0,0,0,0,0];letmutcount =1;forchunkinv.rchunks_mut(2) {foreleminchunk.iter_mut() {*elem += count;    }    count +=1;}assert_eq!(v,&[3,2,2,1,1]);
1.31.0 ·Source

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
letslice = ['l','o','r','e','m'];letmutiter = slice.rchunks_exact(2);assert_eq!(iter.next().unwrap(),&['e','m']);assert_eq!(iter.next().unwrap(),&['o','r']);assert!(iter.next().is_none());assert_eq!(iter.remainder(),&['l']);
1.31.0 ·Source

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
letv =&mut[0,0,0,0,0];letmutcount =1;forchunkinv.rchunks_exact_mut(2) {foreleminchunk.iter_mut() {*elem += count;    }    count +=1;}assert_eq!(v,&[0,2,2,1,1]);
1.77.0 ·Source

pub fnchunk_by<F>(&self, pred: F) ->ChunkBy<'_, T, F>
where F:FnMut(&T,&T) ->bool,

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:

letslice =&[1,1,2,3,2,3,2,3,4];letmutiter = slice.chunk_by(|a, b| a <= b);assert_eq!(iter.next(),Some(&[1,1,2,3][..]));assert_eq!(iter.next(),Some(&[2,3][..]));assert_eq!(iter.next(),Some(&[2,3,4][..]));assert_eq!(iter.next(),None);
1.77.0 ·Source

pub fnchunk_by_mut<F>(&mut self, pred: F) ->ChunkByMut<'_, T, F>
where F:FnMut(&T,&T) ->bool,

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:

letslice =&mut[1,1,2,3,2,3,2,3,4];letmutiter = slice.chunk_by_mut(|a, b| a <= b);assert_eq!(iter.next(),Some(&mut[1,1,2,3][..]));assert_eq!(iter.next(),Some(&mut[2,3][..]));assert_eq!(iter.next(),Some(&mut[2,3,4][..]));assert_eq!(iter.next(),None);
1.0.0 ·Source

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
letv = ['a','b','c'];{let(left, right) = v.split_at(0);assert_eq!(left, []);assert_eq!(right, ['a','b','c']);}{let(left, right) = v.split_at(2);assert_eq!(left, ['a','b']);assert_eq!(right, ['c']);}{let(left, right) = v.split_at(3);assert_eq!(left, ['a','b','c']);assert_eq!(right, []);}
1.0.0 ·Source

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
letmutv = [1,0,3,0,5,6];let(left, right) = v.split_at_mut(2);assert_eq!(left, [1,0]);assert_eq!(right, [3,0,5,6]);left[1] =2;right[1] =4;assert_eq!(v, [1,2,3,4,5,6]);
1.79.0 ·Source

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 ·Source

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
letmutv = [1,0,3,0,5,6];// scoped to restrict the lifetime of the borrowsunsafe{let(left, right) = v.split_at_mut_unchecked(2);assert_eq!(left, [1,0]);assert_eq!(right, [3,0,5,6]);    left[1] =2;    right[1] =4;}assert_eq!(v, [1,2,3,4,5,6]);
1.80.0 ·Source

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 ·Source

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
letmutv = [1,0,3,0,5,6];if letSome((left, right)) = v.split_at_mut_checked(2) {assert_eq!(left, [1,0]);assert_eq!(right, [3,0,5,6]);    left[1] =2;    right[1] =4;}assert_eq!(v, [1,2,3,4,5,6]);assert_eq!(None, v.split_at_mut_checked(7));
1.0.0 ·Source

pub fnsplit<F>(&self, pred: F) ->Split<'_, T, F>
where F:FnMut(&T) ->bool,

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:

letslice = [10,6,33,20];letmutiter = slice.split(|num| num %3==0);assert_eq!(iter.next().unwrap(),&[10]);assert_eq!(iter.next().unwrap(),&[]);assert_eq!(iter.next().unwrap(),&[20]);assert!(iter.next().is_none());
1.0.0 ·Source

pub fnsplit_mut<F>(&mut self, pred: F) ->SplitMut<'_, T, F>
where F:FnMut(&T) ->bool,

Returns an iterator over mutable subslices separated by elements thatmatchpred. The matched element is not contained in the subslices.

§Examples
letmutv = [10,40,30,20,60,50];forgroupinv.split_mut(|num|*num %3==0) {    group[0] =1;}assert_eq!(v, [1,40,30,1,60,1]);
1.51.0 ·Source

pub fnsplit_inclusive<F>(&self, pred: F) ->SplitInclusive<'_, T, F>
where F:FnMut(&T) ->bool,

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.

letslice = [3,10,40,33];letmutiter = slice.split_inclusive(|num| num %3==0);assert_eq!(iter.next().unwrap(),&[3]);assert_eq!(iter.next().unwrap(),&[10,40,33]);assert!(iter.next().is_none());
1.51.0 ·Source

pub fnsplit_inclusive_mut<F>(&mut self, pred: F) ->SplitInclusiveMut<'_, T, F>
where F:FnMut(&T) ->bool,

Returns an iterator over mutable subslices separated by elements thatmatchpred. The matched element is contained in the previoussubslice as a terminator.

§Examples
letmutv = [10,40,30,20,60,50];forgroupinv.split_inclusive_mut(|num|*num %3==0) {letterminator_idx = group.len()-1;    group[terminator_idx] =1;}assert_eq!(v, [10,40,1,20,1,1]);
1.27.0 ·Source

pub fnrsplit<F>(&self, pred: F) ->RSplit<'_, T, F>
where F:FnMut(&T) ->bool,

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.

letv =&[0,1,1,2,3,5,8];letmutit = v.rsplit(|n|*n %2==0);assert_eq!(it.next().unwrap(),&[]);assert_eq!(it.next().unwrap(),&[3,5]);assert_eq!(it.next().unwrap(),&[1,1]);assert_eq!(it.next().unwrap(),&[]);assert_eq!(it.next(),None);
1.27.0 ·Source

pub fnrsplit_mut<F>(&mut self, pred: F) ->RSplitMut<'_, T, F>
where F:FnMut(&T) ->bool,

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
letmutv = [100,400,300,200,600,500];letmutcount =0;forgroupinv.rsplit_mut(|num|*num %3==0) {    count +=1;    group[0] = count;}assert_eq!(v, [3,400,300,2,600,1]);
1.0.0 ·Source

pub fnsplitn<F>(&self, n:usize, pred: F) ->SplitN<'_, T, F>
where F:FnMut(&T) ->bool,

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]):

letv = [10,40,30,20,60,50];forgroupinv.splitn(2, |num|*num %3==0) {println!("{group:?}");}
1.0.0 ·Source

pub fnsplitn_mut<F>(&mut self, n:usize, pred: F) ->SplitNMut<'_, T, F>
where F:FnMut(&T) ->bool,

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
letmutv = [10,40,30,20,60,50];forgroupinv.splitn_mut(2, |num|*num %3==0) {    group[0] =1;}assert_eq!(v, [1,40,30,1,60,50]);
1.0.0 ·Source

pub fnrsplitn<F>(&self, n:usize, pred: F) ->RSplitN<'_, T, F>
where F:FnMut(&T) ->bool,

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]):

letv = [10,40,30,20,60,50];forgroupinv.rsplitn(2, |num|*num %3==0) {println!("{group:?}");}
1.0.0 ·Source

pub fnrsplitn_mut<F>(&mut self, n:usize, pred: F) ->RSplitNMut<'_, T, F>
where F:FnMut(&T) ->bool,

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
letmuts = [10,40,30,20,60,50];forgroupins.rsplitn_mut(2, |num|*num %3==0) {    group[0] =1;}assert_eq!(s, [1,40,30,20,60,1]);
Source

pub fnsplit_once<F>(&self, pred: F) ->Option<(&[T], &[T])>
where F:FnMut(&T) ->bool,

🔬This is a nightly-only experimental API. (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
#![feature(slice_split_once)]lets = [1,2,3,2,4];assert_eq!(s.split_once(|&x| x ==2),Some((&[1][..],&[3,2,4][..])));assert_eq!(s.split_once(|&x| x ==0),None);
Source

pub fnrsplit_once<F>(&self, pred: F) ->Option<(&[T], &[T])>
where F:FnMut(&T) ->bool,

🔬This is a nightly-only experimental API. (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
#![feature(slice_split_once)]lets = [1,2,3,2,4];assert_eq!(s.rsplit_once(|&x| x ==2),Some((&[1,2,3][..],&[4][..])));assert_eq!(s.rsplit_once(|&x| x ==0),None);
1.0.0 ·Source

pub fncontains(&self, x:&T) ->bool
where 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
letv = [10,40,30];assert!(v.contains(&30));assert!(!v.contains(&50));

If you do not have a&T, but some other value that you can comparewith one (for example,String implementsPartialEq<str>), you canuseiter().any:

letv = [String::from("hello"), String::from("world")];// slice of `String`assert!(v.iter().any(|e| e =="hello"));// search with `&str`assert!(!v.iter().any(|e| e =="hi"));
1.0.0 ·Source

pub fnstarts_with(&self, needle: &[T]) ->bool
where 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:

letv =&[10,40,30];assert!(v.starts_with(&[]));letv:&[u8] =&[];assert!(v.starts_with(&[]));
1.0.0 ·Source

pub fnends_with(&self, needle: &[T]) ->bool
where 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:

letv =&[10,40,30];assert!(v.ends_with(&[]));letv:&[u8] =&[];assert!(v.ends_with(&[]));
1.51.0 ·Source

pub fnstrip_prefix<P>(&self, prefix:&P) ->Option<&[T]>
where P:SlicePattern<Item = T> + ?Sized, T:PartialEq,

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 ·Source

pub fnstrip_suffix<P>(&self, suffix:&P) ->Option<&[T]>
where P:SlicePattern<Item = T> + ?Sized, T:PartialEq,

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
letv =&[10,40,30];assert_eq!(v.strip_suffix(&[30]),Some(&[10,40][..]));assert_eq!(v.strip_suffix(&[40,30]),Some(&[10][..]));assert_eq!(v.strip_suffix(&[10,40,30]),Some(&[][..]));assert_eq!(v.strip_suffix(&[50]),None);assert_eq!(v.strip_suffix(&[50,30]),None);
Source

pub fnstrip_circumfix<S, P>(&self, prefix:&P, suffix:&S) ->Option<&[T]>
where T:PartialEq, S:SlicePattern<Item = T> + ?Sized, P:SlicePattern<Item = T> + ?Sized,

🔬This is a nightly-only experimental API. (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][..]));
Source

pub fntrim_prefix<P>(&self, prefix:&P) -> &[T]
where P:SlicePattern<Item = T> + ?Sized, T:PartialEq,

🔬This is a nightly-only experimental API. (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());
Source

pub fntrim_suffix<P>(&self, suffix:&P) -> &[T]
where P:SlicePattern<Item = T> + ?Sized, T:PartialEq,

🔬This is a nightly-only experimental API. (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 ·Source

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 ·Source

pub fnbinary_search_by<'a, F>(&'a self, f: F) ->Result<usize,usize>
where F:FnMut(&'a T) ->Ordering,

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 ·Source

pub fnbinary_search_by_key<'a, B, F>( &'a self, b:&B, f: F,) ->Result<usize,usize>
where F:FnMut(&'a T) -> B, B:Ord,

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 ·Source

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
letmutv = [4, -5,1, -3,2];v.sort_unstable();assert_eq!(v, [-5, -3,1,2,4]);
1.20.0 ·Source

pub fnsort_unstable_by<F>(&mut self, compare: F)
where F:FnMut(&T,&T) ->Ordering,

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
letmutv = [4, -5,1, -3,2];v.sort_unstable_by(|a, b| a.cmp(b));assert_eq!(v, [-5, -3,1,2,4]);// reverse sortingv.sort_unstable_by(|a, b| b.cmp(a));assert_eq!(v, [4,2,1, -3, -5]);
1.20.0 ·Source

pub fnsort_unstable_by_key<K, F>(&mut self, f: F)
where F:FnMut(&T) -> K, K:Ord,

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
letmutv = [4i32, -5,1, -3,2];v.sort_unstable_by_key(|k| k.abs());assert_eq!(v, [1,2, -3,4, -5]);
1.49.0 ·Source

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 beforeindex, whose elements all satisfyx <= self[index].

  • The element atindex.

  • The unsorted subslice afterindex, 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 ·Source

pub fnselect_nth_unstable_by<F>( &mut self, index:usize, compare: F,) -> (&mut[T],&mut T, &mut[T])
where F:FnMut(&T,&T) ->Ordering,

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 beforeindex, whose elements all satisfycompare(x, self[index]).is_le().

  • The element atindex.

  • The unsorted subslice afterindex, 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 ·Source

pub fnselect_nth_unstable_by_key<K, F>( &mut self, index:usize, f: F,) -> (&mut[T],&mut T, &mut[T])
where F:FnMut(&T) -> K, K:Ord,

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 beforeindex, whose elements all satisfyf(x) <= f(self[index]).

  • The element atindex.

  • The unsorted subslice afterindex, 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]);
Source

pub fnpartition_dedup(&mut self) -> (&mut[T], &mut[T])
where T:PartialEq,

🔬This is a nightly-only experimental API. (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
#![feature(slice_partition_dedup)]letmutslice = [1,2,2,3,3,2,1,1];let(dedup, duplicates) = slice.partition_dedup();assert_eq!(dedup, [1,2,3,2,1]);assert_eq!(duplicates, [2,3,1]);
Source

pub fnpartition_dedup_by<F>(&mut self, same_bucket: F) -> (&mut[T], &mut[T])
where F:FnMut(&mut T,&mut T) ->bool,

🔬This is a nightly-only experimental API. (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
#![feature(slice_partition_dedup)]letmutslice = ["foo","Foo","BAZ","Bar","bar","baz","BAZ"];let(dedup, duplicates) = slice.partition_dedup_by(|a, b| a.eq_ignore_ascii_case(b));assert_eq!(dedup, ["foo","BAZ","Bar","baz"]);assert_eq!(duplicates, ["bar","Foo","BAZ"]);
Source

pub fnpartition_dedup_by_key<K, F>(&mut self, key: F) -> (&mut[T], &mut[T])
where F:FnMut(&mut T) -> K, K:PartialEq,

🔬This is a nightly-only experimental API. (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
#![feature(slice_partition_dedup)]letmutslice = [10,20,21,30,30,20,11,13];let(dedup, duplicates) = slice.partition_dedup_by_key(|i|*i /10);assert_eq!(dedup, [10,20,30,20,11]);assert_eq!(duplicates, [21,30,13]);
1.26.0 ·Source

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
letmuta = ['a','b','c','d','e','f'];a.rotate_left(2);assert_eq!(a, ['c','d','e','f','a','b']);

Rotating a subslice:

letmuta = ['a','b','c','d','e','f'];a[1..5].rotate_left(1);assert_eq!(a, ['a','c','d','e','b','f']);
1.26.0 ·Source

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
letmuta = ['a','b','c','d','e','f'];a.rotate_right(2);assert_eq!(a, ['e','f','a','b','c','d']);

Rotating a subslice:

letmuta = ['a','b','c','d','e','f'];a[1..5].rotate_right(1);assert_eq!(a, ['a','e','b','c','d','f']);
1.50.0 ·Source

pub fnfill(&mut self, value: T)
where T:Clone,

Fillsself with elements by cloningvalue.

§Examples
letmutbuf =vec![0;10];buf.fill(1);assert_eq!(buf,vec![1;10]);
1.51.0 ·Source

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
letmutbuf =vec![1;10];buf.fill_with(Default::default);assert_eq!(buf,vec![0;10]);
1.7.0 ·Source

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:

letmutslice = [1,2,3,4,5];slice[..2].clone_from_slice(&slice[3..]);// compile fail!

To work around this, we can usesplit_at_mut to create two distinctsub-slices from a slice:

letmutslice = [1,2,3,4,5];{let(left, right) = slice.split_at_mut(2);    left.clone_from_slice(&right[1..]);}assert_eq!(slice, [4,5,3,4,5]);
1.9.0 ·Source

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:

letmutslice = [1,2,3,4,5];slice[..2].copy_from_slice(&slice[3..]);// compile fail!

To work around this, we can usesplit_at_mut to create two distinctsub-slices from a slice:

letmutslice = [1,2,3,4,5];{let(left, right) = slice.split_at_mut(2);    left.copy_from_slice(&right[1..]);}assert_eq!(slice, [4,5,3,4,5]);
1.37.0 ·Source

pub fncopy_within<R>(&mut self, src: R, dest:usize)
where R:RangeBounds<usize>, T:Copy,

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:

letmutbytes =*b"Hello, World!";bytes.copy_within(1..5,8);assert_eq!(&bytes,b"Hello, Wello!");
1.27.0 ·Source

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:

letmutslice = [1,2,3,4,5];slice[..2].swap_with_slice(&mutslice[3..]);// compile fail!

To work around this, we can usesplit_at_mut to create two distinctmutable sub-slices from a slice:

letmutslice = [1,2,3,4,5];{let(left, right) = slice.split_at_mut(2);    left.swap_with_slice(&mutright[1..]);}assert_eq!(slice, [4,5,3,1,2]);
1.30.0 ·Source

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:

unsafe{letbytes: [u8;7] = [1,2,3,4,5,6,7];let(prefix, shorts, suffix) = bytes.align_to::<u16>();// less_efficient_algorithm_for_bytes(prefix);    // more_efficient_algorithm_for_aligned_shorts(shorts);    // less_efficient_algorithm_for_bytes(suffix);}
1.30.0 ·Source

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:

unsafe{letmutbytes: [u8;7] = [1,2,3,4,5,6,7];let(prefix, shorts, suffix) = bytes.align_to_mut::<u16>();// less_efficient_algorithm_for_bytes(prefix);    // more_efficient_algorithm_for_aligned_shorts(shorts);    // less_efficient_algorithm_for_bytes(suffix);}
Source

pub fnas_simd<const LANES:usize>(&self) -> (&[T], &[Simd<T, LANES>], &[T])

🔬This is a nightly-only experimental API. (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);
Source

pub 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)

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 ·Source

pub fnis_sorted(&self) ->bool
where 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
letempty: [i32;0] = [];assert!([1,2,2,9].is_sorted());assert!(![1,3,2,4].is_sorted());assert!([0].is_sorted());assert!(empty.is_sorted());assert!(![0.0,1.0, f32::NAN].is_sorted());
1.82.0 ·Source

pub fnis_sorted_by<'a, F>(&'a self, compare: F) ->bool
where F:FnMut(&'a T,&'a T) ->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
assert!([1,2,2,9].is_sorted_by(|a, b| a <= b));assert!(![1,2,2,9].is_sorted_by(|a, b| a < b));assert!([0].is_sorted_by(|a, b|true));assert!([0].is_sorted_by(|a, b|false));letempty: [i32;0] = [];assert!(empty.is_sorted_by(|a, b|false));assert!(empty.is_sorted_by(|a, b|true));
1.82.0 ·Source

pub fnis_sorted_by_key<'a, F, K>(&'a self, f: F) ->bool
where F:FnMut(&'a T) -> K, K:PartialOrd,

Checks if the elements of this slice are sorted using the given key extraction function.

Instead of comparing the slice’s elements directly, this function compares the keys of theelements, as determined byf. Apart from that, it’s equivalent tois_sorted; see itsdocumentation for more information.

§Examples
assert!(["c","bb","aaa"].is_sorted_by_key(|s| s.len()));assert!(![-2i32, -1,0,3].is_sorted_by_key(|n| n.abs()));
1.52.0 ·Source

pub fnpartition_point<P>(&self, pred: P) ->usize
where P:FnMut(&T) ->bool,

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:

letmuts =vec![0,1,1,1,1,2,3,5,8,13,21,34,55];letnum =42;letidx = s.partition_point(|&x| x <= num);s.insert(idx, num);assert_eq!(s, [0,1,1,1,1,2,3,5,8,13,21,34,42,55]);
1.87.0 ·Source

pub fnsplit_off<'a, R>(self: &mut &'a[T], range: R) ->Option<&'a[T]>

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:

letmutslice:&[_] =&['a','b','c','d'];assert_eq!(None, slice.split_off(5..));assert_eq!(None, slice.split_off(..5));assert_eq!(None, slice.split_off(..=4));letexpected:&[char] =&['a','b','c','d'];assert_eq!(Some(expected), slice.split_off(..4));
1.87.0 ·Source

pub fnsplit_off_mut<'a, R>( self: &mut &'a mut[T], range: R,) ->Option<&'a mut[T]>

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:

letmutslice:&mut[_] =&mut['a','b','c','d'];assert_eq!(None, slice.split_off_mut(5..));assert_eq!(None, slice.split_off_mut(..5));assert_eq!(None, slice.split_off_mut(..=4));letexpected:&mut[_] =&mut['a','b','c','d'];assert_eq!(Some(expected), slice.split_off_mut(..4));
1.87.0 ·Source

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
letmutslice:&[_] =&['a','b','c'];letfirst = slice.split_off_first().unwrap();assert_eq!(slice,&['b','c']);assert_eq!(first,&'a');
1.87.0 ·Source

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
letmutslice:&mut[_] =&mut['a','b','c'];letfirst = slice.split_off_first_mut().unwrap();*first ='d';assert_eq!(slice,&['b','c']);assert_eq!(first,&'d');
1.87.0 ·Source

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
letmutslice:&[_] =&['a','b','c'];letlast = slice.split_off_last().unwrap();assert_eq!(slice,&['a','b']);assert_eq!(last,&'c');
1.87.0 ·Source

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
letmutslice:&mut[_] =&mut['a','b','c'];letlast = slice.split_off_last_mut().unwrap();*last ='d';assert_eq!(slice,&['a','b']);assert_eq!(last,&'d');
1.86.0 ·Source

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 ·Source

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]);
Source

pub fnelement_offset(&self, element:&T) ->Option<usize>

🔬This is a nightly-only experimental API. (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 1
Source

pub fnsubslice_range(&self, subslice: &[T]) ->Option<Range<usize>>

🔬This is a nightly-only experimental API. (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:

#![feature(substr_range)]letnums =&[0,5,10,0,0,5];letmutiter = nums    .split(|t|*t ==0)    .map(|n| nums.subslice_range(n).unwrap());assert_eq!(iter.next(),Some(0..0));assert_eq!(iter.next(),Some(1..3));assert_eq!(iter.next(),Some(4..4));assert_eq!(iter.next(),Some(5..6));
1.0.0 ·Source

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
letmutv = [4, -5,1, -3,2];v.sort();assert_eq!(v, [-5, -3,1,2,4]);
1.0.0 ·Source

pub fnsort_by<F>(&mut self, compare: F)
where F:FnMut(&T,&T) ->Ordering,

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
letmutv = [4, -5,1, -3,2];v.sort_by(|a, b| a.cmp(b));assert_eq!(v, [-5, -3,1,2,4]);// reverse sortingv.sort_by(|a, b| b.cmp(a));assert_eq!(v, [4,2,1, -3, -5]);
1.7.0 ·Source

pub fnsort_by_key<K, F>(&mut self, f: F)
where F:FnMut(&T) -> K, K:Ord,

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
letmutv = [4i32, -5,1, -3,2];v.sort_by_key(|k| k.abs());assert_eq!(v, [1,2, -3,4, -5]);
1.34.0 ·Source

pub fnsort_by_cached_key<K, F>(&mut self, f: F)
where F:FnMut(&T) -> K, K:Ord,

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
letmutv = [4i32, -5,1, -3,2,10];// Strings are sorted by lexicographical order.v.sort_by_cached_key(|k| k.to_string());assert_eq!(v, [-3, -5,1,10,2,4]);
1.0.0 ·Source

pub fnto_vec(&self) ->Vec<T>
where T:Clone,

Copiesself into a newVec.

§Examples
lets = [10,40,30];letx = s.to_vec();// Here, `s` and `x` can be modified independently.
Source

pub fnto_vec_in<A>(&self, alloc: A) ->Vec<T, A>
where A:Allocator, T:Clone,

🔬This is a nightly-only experimental API. (allocator_api #32838)

Copiesself into a newVec with an allocator.

§Examples
#![feature(allocator_api)]usestd::alloc::System;lets = [10,40,30];letx = s.to_vec_in(System);// Here, `s` and `x` can be modified independently.
1.40.0 ·Source

pub fnrepeat(&self, n:usize) ->Vec<T>
where T:Copy,

Creates a vector by copying a slicen times.

§Panics

This function will panic if the capacity would overflow.

§Examples
assert_eq!([1,2].repeat(3),vec![1,2,1,2,1,2]);

A panic upon overflow:

// this will panic at runtimeb"0123456789abcdef".repeat(usize::MAX);
1.0.0 ·Source

pub fnconcat<Item>(&self) -> <[T] asConcat<Item>>::Output
where[T]:Concat<Item>, Item: ?Sized,

Flattens a slice ofT into a single valueSelf::Output.

§Examples
assert_eq!(["hello","world"].concat(),"helloworld");assert_eq!([[1,2], [3,4]].concat(), [1,2,3,4]);
1.3.0 ·Source

pub fnjoin<Separator>( &self, sep: Separator,) -> <[T] asJoin<Separator>>::Output
where[T]:Join<Separator>,

Flattens a slice ofT into a single valueSelf::Output, placing agiven separator between each.

§Examples
assert_eq!(["hello","world"].join(" "),"hello world");assert_eq!([[1,2], [3,4]].join(&0), [1,2,0,3,4]);assert_eq!([[1,2], [3,4]].join(&[0,0][..]), [1,2,0,0,3,4]);
1.0.0 ·Source

pub fnconnect<Separator>( &self, sep: Separator,) -> <[T] asJoin<Separator>>::Output
where[T]:Join<Separator>,

👎Deprecated since 1.3.0: renamed to join

Flattens a slice ofT into a single valueSelf::Output, placing agiven separator between each.

§Examples
assert_eq!(["hello","world"].connect(" "),"hello world");assert_eq!([[1,2], [3,4]].connect(&0), [1,2,0,3,4]);

Trait Implementations§

1.5.0 ·Source§

impl<T, A>AsMut<[T]> forVec<T, A>
where A:Allocator,

Source§

fnas_mut(&mut self) -> &mut[T]

Converts this type into a mutable reference of the (usually inferred) input type.
1.5.0 ·Source§

impl<T, A>AsMut<Vec<T, A>> forVec<T, A>
where A:Allocator,

Source§

fnas_mut(&mut self) -> &mutVec<T, A>

Converts this type into a mutable reference of the (usually inferred) input type.
1.0.0 ·Source§

impl<T, A>AsRef<[T]> forVec<T, A>
where A:Allocator,

Source§

fnas_ref(&self) -> &[T]

Converts this type into a shared reference of the (usually inferred) input type.
1.0.0 ·Source§

impl<T, A>AsRef<Vec<T, A>> forVec<T, A>
where A:Allocator,

Source§

fnas_ref(&self) -> &Vec<T, A>

Converts this type into a shared reference of the (usually inferred) input type.
1.0.0 ·Source§

impl<T, A>Borrow<[T]> forVec<T, A>
where A:Allocator,

Source§

fnborrow(&self) -> &[T]

Immutably borrows from an owned value.Read more
1.0.0 ·Source§

impl<T, A>BorrowMut<[T]> forVec<T, A>
where A:Allocator,

Source§

fnborrow_mut(&mut self) -> &mut[T]

Mutably borrows from an owned value.Read more
1.0.0 ·Source§

impl<T, A>Clone forVec<T, A>
where T:Clone, A:Allocator +Clone,

Source§

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
letx =vec![5,6,7];letmuty =vec![8,9,10];letyp:*consti32 = y.as_ptr();y.clone_from(&x);// The value is the sameassert_eq!(x, y);// And no reallocation occurredassert_eq!(yp, y.as_ptr());
Source§

fnclone(&self) ->Vec<T, A>

Returns a duplicate of the value.Read more
1.0.0 ·Source§

impl<T, A>Debug forVec<T, A>
where T:Debug, A:Allocator,

Source§

fnfmt(&self, f: &mutFormatter<'_>) ->Result<(),Error>

Formats the value using the given formatter.Read more
1.0.0 (const:unstable) ·Source§

impl<T>Default forVec<T>

Source§

fndefault() ->Vec<T>

Creates an emptyVec<T>.

The vector will not allocate until elements are pushed onto it.

1.0.0 ·Source§

impl<T, A>Deref forVec<T, A>
where A:Allocator,

Source§

typeTarget =[T]

The resulting type after dereferencing.
Source§

fnderef(&self) -> &[T]

Dereferences the value.
1.0.0 ·Source§

impl<T, A>DerefMut forVec<T, A>
where A:Allocator,

Source§

fnderef_mut(&mut self) -> &mut[T]

Mutably dereferences the value.
1.0.0 ·Source§

impl<T, A>Drop forVec<T, A>
where A:Allocator,

Source§

fndrop(&mut self)

Executes the destructor for this type.Read more
1.2.0 ·Source§

impl<'a, T, A>Extend<&'a T> forVec<T, A>
where T:Copy + 'a, A:Allocator,

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.

Source§

fnextend<I>(&mut self, iter: I)
where I:IntoIterator<Item =&'a T>,

Extends a collection with the contents of an iterator.Read more
Source§

fnextend_one(&mut self, _:&'a T)

🔬This is a nightly-only experimental API. (extend_one #72631)
Extends a collection with exactly one element.
Source§

fnextend_reserve(&mut self, additional:usize)

🔬This is a nightly-only experimental API. (extend_one #72631)
Reserves capacity in a collection for the given number of additional elements.Read more
1.0.0 ·Source§

impl<T, A>Extend<T> forVec<T, A>
where A:Allocator,

Source§

fnextend<I>(&mut self, iter: I)
where I:IntoIterator<Item = T>,

Extends a collection with the contents of an iterator.Read more
Source§

fnextend_one(&mut self, item: T)

🔬This is a nightly-only experimental API. (extend_one #72631)
Extends a collection with exactly one element.
Source§

fnextend_reserve(&mut self, additional:usize)

🔬This is a nightly-only experimental API. (extend_one #72631)
Reserves capacity in a collection for the given number of additional elements.Read more
1.0.0 ·Source§

impl<T>From<&[T]> forVec<T>
where T:Clone,

Source§

fnfrom(s: &[T]) ->Vec<T>

Allocates aVec<T> and fills it by clonings’s items.

§Examples
assert_eq!(Vec::from(&[1,2,3][..]),vec![1,2,3]);
1.74.0 ·Source§

impl<T, const N:usize>From<&[T; N]> forVec<T>
where T:Clone,

Source§

fnfrom(s: &[T; N]) ->Vec<T>

Allocates aVec<T> and fills it by clonings’s items.

§Examples
assert_eq!(Vec::from(&[1,2,3]),vec![1,2,3]);
1.28.0 ·Source§

impl<'a, T>From<&'aVec<T>> forCow<'a,[T]>
where T:Clone,

Source§

fnfrom(v: &'aVec<T>) ->Cow<'a,[T]>

Creates aBorrowed variant ofCowfrom a reference toVec.

This conversion does not allocate or clone the data.

1.19.0 ·Source§

impl<T>From<&mut[T]> forVec<T>
where T:Clone,

Source§

fnfrom(s: &mut[T]) ->Vec<T>

Allocates aVec<T> and fills it by clonings’s items.

§Examples
assert_eq!(Vec::from(&mut[1,2,3][..]),vec![1,2,3]);
1.74.0 ·Source§

impl<T, const N:usize>From<&mut[T; N]> forVec<T>
where T:Clone,

Source§

fnfrom(s: &mut[T; N]) ->Vec<T>

Allocates aVec<T> and fills it by clonings’s items.

§Examples
assert_eq!(Vec::from(&mut[1,2,3]),vec![1,2,3]);
1.0.0 ·Source§

implFrom<&str> forVec<u8>

Source§

fnfrom(s: &str) ->Vec<u8>

Allocates aVec<u8> and fills it with a UTF-8 string.

§Examples
assert_eq!(Vec::from("123"),vec![b'1',b'2',b'3']);
1.44.0 ·Source§

impl<T, const N:usize>From<[T; N]> forVec<T>

Source§

fnfrom(s:[T; N]) ->Vec<T>

Allocates aVec<T> and movess’s items into it.

§Examples
assert_eq!(Vec::from([1,2,3]),vec![1,2,3]);
1.5.0 ·Source§

impl<T, A>From<BinaryHeap<T, A>> forVec<T, A>
where A:Allocator,

Source§

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.18.0 ·Source§

impl<T, A>From<Box<[T], A>> forVec<T, A>
where A:Allocator,

Source§

fnfrom(s:Box<[T], A>) ->Vec<T, A>

Converts a boxed slice into a vector by transferring ownership ofthe existing heap allocation.

§Examples
letb: Box<[i32]> =vec![1,2,3].into_boxed_slice();assert_eq!(Vec::from(b),vec![1,2,3]);
Source§

implFrom<ByteString> forVec<u8>

Source§

fnfrom(s:ByteString) ->Vec<u8>

Converts to this type from the input type.
1.7.0 ·Source§

implFrom<CString> forVec<u8>

Source§

fnfrom(s:CString) ->Vec<u8>

Converts aCString into aVec<u8>.

The conversion consumes theCString, and removes the terminating NUL byte.

1.14.0 ·Source§

impl<'a, T>From<Cow<'a,[T]>> forVec<T>
where[T]:ToOwned<Owned =Vec<T>>,

Source§

fnfrom(s:Cow<'a,[T]>) ->Vec<T>

Converts a clone-on-write slice into a vector.

Ifs already owns aVec<T>, it will be returned directly.Ifs is borrowing a slice, a newVec<T> will be allocated andfilled by clonings’s items into it.

§Examples
leto: Cow<'_, [i32]> = Cow::Owned(vec![1,2,3]);letb: Cow<'_, [i32]> = Cow::Borrowed(&[1,2,3]);assert_eq!(Vec::from(o), Vec::from(b));
1.14.0 ·Source§

implFrom<String> forVec<u8>

Source§

fnfrom(string:String) ->Vec<u8>

Converts the givenString to a vectorVec that holds values of typeu8.

§Examples
lets1 = String::from("hello world");letv1 = Vec::from(s1);forbinv1 {println!("{b}");}
1.43.0 ·Source§

implFrom<Vec<NonZero<u8>>> forCString

Source§

fnfrom(v:Vec<NonZero<u8>>) ->CString

Converts aVec<NonZero<u8>> into aCString withoutcopying nor checking for inner nul bytes.

1.8.0 ·Source§

impl<'a, T>From<Vec<T>> forCow<'a,[T]>
where T:Clone,

Source§

fnfrom(v:Vec<T>) ->Cow<'a,[T]>

Creates anOwned variant ofCowfrom an owned instance ofVec.

This conversion does not allocate or clone the data.

1.21.0 ·Source§

impl<T, A>From<Vec<T, A>> forArc<[T], A>
where A:Allocator +Clone,

Source§

fnfrom(v:Vec<T, A>) ->Arc<[T], A>

Allocates a reference-counted slice and movesv’s items into it.

§Example
letunique: Vec<i32> =vec![1,2,3];letshared: Arc<[i32]> = Arc::from(unique);assert_eq!(&[1,2,3],&shared[..]);
1.5.0 ·Source§

impl<T, A>From<Vec<T, A>> forBinaryHeap<T, A>
where T:Ord, A:Allocator,

Source§

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,

Source§

fnfrom(v:Vec<T, A>) ->Box<[T], A>

Converts a vector into a boxed slice.

Before doing the conversion, this method discards excess capacity likeVec::shrink_to_fit.

§Examples
assert_eq!(Box::from(vec![1,2,3]),vec![1,2,3].into_boxed_slice());

Any excess capacity is removed:

letmutvec = Vec::with_capacity(10);vec.extend([1,2,3]);assert_eq!(Box::from(vec),vec![1,2,3].into_boxed_slice());
1.21.0 ·Source§

impl<T, A>From<Vec<T, A>> forRc<[T], A>
where A:Allocator,

Source§

fnfrom(v:Vec<T, A>) ->Rc<[T], A>

Allocates a reference-counted slice and movesv’s items into it.

§Example
letunique: Vec<i32> =vec![1,2,3];letshared: Rc<[i32]> = Rc::from(unique);assert_eq!(&[1,2,3],&shared[..]);
1.10.0 ·Source§

impl<T, A>From<Vec<T, A>> forVecDeque<T, A>
where A:Allocator,

Source§

fnfrom(other:Vec<T, A>) ->VecDeque<T, A>

Turn aVec<T> into aVecDeque<T>.

This conversion is guaranteed to run inO(1) timeand to not re-allocate theVec’s buffer or allocateany additional memory.

1.10.0 ·Source§

impl<T, A>From<VecDeque<T, A>> forVec<T, A>
where A:Allocator,

Source§

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

§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 onIterator::size_hint()
    • and panic if the number of items is outside the provided lower/upper bounds
  • use an amortized growth strategy similar topushing one 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);}
Source§

fnfrom_iter<I>(iter: I) ->Vec<T>
where I:IntoIterator<Item = T>,

Creates a value from an iterator.Read more
1.0.0 ·Source§

impl<T, A>Hash forVec<T, A>
where T:Hash, A:Allocator,

The hash of a vector is the same as that of the corresponding slice,as required by thecore::borrow::Borrow implementation.

usestd::hash::BuildHasher;letb = std::hash::RandomState::new();letv: Vec<u8> =vec![0xa8,0x3c,0x09];lets:&[u8] =&[0xa8,0x3c,0x09];assert_eq!(b.hash_one(v), b.hash_one(s));
Source§

fnhash<H>(&self, state:&mut H)
where H:Hasher,

Feeds this value into the givenHasher.Read more
1.3.0 ·Source§

fnhash_slice<H>(data: &[Self], state:&mut H)
where H:Hasher, Self:Sized,

Feeds a slice of this type into the givenHasher.Read more
1.0.0 ·Source§

impl<T, I, A>Index<I> forVec<T, A>
where I:SliceIndex<[T]>, A:Allocator,

Source§

typeOutput = <I asSliceIndex<[T]>>::Output

The returned type after indexing.
Source§

fnindex(&self, index: I) -> &<Vec<T, A> asIndex<I>>::Output

Performs the indexing (container[index]) operation.Read more
1.0.0 ·Source§

impl<T, I, A>IndexMut<I> forVec<T, A>
where I:SliceIndex<[T]>, A:Allocator,

Source§

fnindex_mut(&mut self, index: I) -> &mut <Vec<T, A> asIndex<I>>::Output

Performs the mutable indexing (container[index]) operation.Read more
1.0.0 ·Source§

impl<'a, T, A>IntoIterator for &'aVec<T, A>
where A:Allocator,

Source§

typeItem =&'a T

The type of the elements being iterated over.
Source§

typeIntoIter =Iter<'a, T>

Which kind of iterator are we turning this into?
Source§

fninto_iter(self) -> <&'aVec<T, A> asIntoIterator>::IntoIter

Creates an iterator from a value.Read more
1.0.0 ·Source§

impl<'a, T, A>IntoIterator for &'a mutVec<T, A>
where A:Allocator,

Source§

typeItem =&'a mut T

The type of the elements being iterated over.
Source§

typeIntoIter =IterMut<'a, T>

Which kind of iterator are we turning this into?
Source§

fninto_iter(self) -> <&'a mutVec<T, A> asIntoIterator>::IntoIter

Creates an iterator from a value.Read more
1.0.0 ·Source§

impl<T, A>IntoIterator forVec<T, A>
where A:Allocator,

Source§

fninto_iter(self) -> <Vec<T, A> asIntoIterator>::IntoIter

Creates a consuming iterator, that is, one that moves each value out ofthe vector (from start to end). The vector cannot be used after callingthis.

§Examples
letv =vec!["a".to_string(),"b".to_string()];letmutv_iter = v.into_iter();letfirst_element:Option<String> = v_iter.next();assert_eq!(first_element,Some("a".to_string()));assert_eq!(v_iter.next(),Some("b".to_string()));assert_eq!(v_iter.next(),None);
Source§

typeItem = T

The type of the elements being iterated over.
Source§

typeIntoIter =IntoIter<T, A>

Which kind of iterator are we turning this into?
1.0.0 ·Source§

impl<T, A>Ord forVec<T, A>
where T:Ord, A:Allocator,

Implements ordering of vectors,lexicographically.

Source§

fncmp(&self, other: &Vec<T, A>) ->Ordering

This method returns anOrdering betweenself andother.Read more
1.21.0 ·Source§

fnmax(self, other: Self) -> Self
where Self:Sized,

Compares and returns the maximum of two values.Read more
1.21.0 ·Source§

fnmin(self, other: Self) -> Self
where Self:Sized,

Compares and returns the minimum of two values.Read more
1.50.0 ·Source§

fnclamp(self, min: Self, max: Self) -> Self
where Self:Sized,

Restrict a value to a certain interval.Read more
1.0.0 ·Source§

impl<T, U, A>PartialEq<&[U]> forVec<T, A>
where A:Allocator, T:PartialEq<U>,

Source§

fneq(&self, other: &&[U]) ->bool

Tests forself andother values to be equal, and is used by==.
Source§

fnne(&self, other: &&[U]) ->bool

Tests for!=. The default implementation is almost always sufficient,and should not be overridden without very good reason.
1.0.0 ·Source§

impl<T, U, A, const N:usize>PartialEq<&[U; N]> forVec<T, A>
where A:Allocator, T:PartialEq<U>,

Source§

fneq(&self, other: &&[U; N]) ->bool

Tests forself andother values to be equal, and is used by==.
Source§

fnne(&self, other: &&[U; N]) ->bool

Tests for!=. The default implementation is almost always sufficient,and should not be overridden without very good reason.
1.0.0 ·Source§

impl<T, U, A>PartialEq<&mut[U]> forVec<T, A>
where A:Allocator, T:PartialEq<U>,

Source§

fneq(&self, other: &&mut[U]) ->bool

Tests forself andother values to be equal, and is used by==.
Source§

fnne(&self, other: &&mut[U]) ->bool

Tests for!=. The default implementation is almost always sufficient,and should not be overridden without very good reason.
1.48.0 ·Source§

impl<T, U, A>PartialEq<[U]> forVec<T, A>
where A:Allocator, T:PartialEq<U>,

Source§

fneq(&self, other: &[U]) ->bool

Tests forself andother values to be equal, and is used by==.
Source§

fnne(&self, other: &[U]) ->bool

Tests for!=. The default implementation is almost always sufficient,and should not be overridden without very good reason.
1.0.0 ·Source§

impl<T, U, A, const N:usize>PartialEq<[U; N]> forVec<T, A>
where A:Allocator, T:PartialEq<U>,

Source§

fneq(&self, other: &[U; N]) ->bool

Tests forself andother values to be equal, and is used by==.
Source§

fnne(&self, other: &[U; N]) ->bool

Tests for!=. The default implementation is almost always sufficient,and should not be overridden without very good reason.
Source§

impl<'a>PartialEq<ByteStr> forVec<u8>

Source§

fneq(&self, other: &ByteStr) ->bool

Tests forself andother values to be equal, and is used by==.
1.0.0 ·Source§

fnne(&self, other:&Rhs) ->bool

Tests for!=. The default implementation is almost always sufficient,and should not be overridden without very good reason.
Source§

impl<'a>PartialEq<ByteString> forVec<u8>

Source§

fneq(&self, other: &ByteString) ->bool

Tests forself andother values to be equal, and is used by==.
1.0.0 ·Source§

fnne(&self, other:&Rhs) ->bool

Tests for!=. The default implementation is almost always sufficient,and should not be overridden without very good reason.
1.46.0 ·Source§

impl<T, U, A>PartialEq<Vec<U, A>> for &[T]
where A:Allocator, T:PartialEq<U>,

Source§

fneq(&self, other: &Vec<U, A>) ->bool

Tests forself andother values to be equal, and is used by==.
Source§

fnne(&self, other: &Vec<U, A>) ->bool

Tests for!=. The default implementation is almost always sufficient,and should not be overridden without very good reason.
1.46.0 ·Source§

impl<T, U, A>PartialEq<Vec<U, A>> for &mut[T]
where A:Allocator, T:PartialEq<U>,

Source§

fneq(&self, other: &Vec<U, A>) ->bool

Tests forself andother values to be equal, and is used by==.
Source§

fnne(&self, other: &Vec<U, A>) ->bool

Tests for!=. The default implementation is almost always sufficient,and should not be overridden without very good reason.
1.48.0 ·Source§

impl<T, U, A>PartialEq<Vec<U, A>> for[T]
where A:Allocator, T:PartialEq<U>,

Source§

fneq(&self, other: &Vec<U, A>) ->bool

Tests forself andother values to be equal, and is used by==.
Source§

fnne(&self, other: &Vec<U, A>) ->bool

Tests for!=. The default implementation is almost always sufficient,and should not be overridden without very good reason.
1.0.0 ·Source§

impl<T, U, A>PartialEq<Vec<U, A>> forCow<'_,[T]>
where A:Allocator, T:PartialEq<U> +Clone,

Source§

fneq(&self, other: &Vec<U, A>) ->bool

Tests forself andother values to be equal, and is used by==.
Source§

fnne(&self, other: &Vec<U, A>) ->bool

Tests for!=. The default implementation is almost always sufficient,and should not be overridden without very good reason.
1.17.0 ·Source§

impl<T, U, A>PartialEq<Vec<U, A>> forVecDeque<T, A>
where A:Allocator, T:PartialEq<U>,

Source§

fneq(&self, other: &Vec<U, A>) ->bool

Tests forself andother values to be equal, and is used by==.
1.0.0 ·Source§

fnne(&self, other:&Rhs) ->bool

Tests for!=. The default implementation is almost always sufficient,and should not be overridden without very good reason.
1.0.0 ·Source§

impl<T, U, A1, A2>PartialEq<Vec<U, A2>> forVec<T, A1>
where A1:Allocator, A2:Allocator, T:PartialEq<U>,

Source§

fneq(&self, other: &Vec<U, A2>) ->bool

Tests forself andother values to be equal, and is used by==.
Source§

fnne(&self, other: &Vec<U, A2>) ->bool

Tests for!=. The default implementation is almost always sufficient,and should not be overridden without very good reason.
Source§

impl<'a>PartialEq<Vec<u8>> forByteStr

Source§

fneq(&self, other: &Vec<u8>) ->bool

Tests forself andother values to be equal, and is used by==.
1.0.0 ·Source§

fnne(&self, other:&Rhs) ->bool

Tests for!=. The default implementation is almost always sufficient,and should not be overridden without very good reason.
Source§

impl<'a>PartialEq<Vec<u8>> forByteString

Source§

fneq(&self, other: &Vec<u8>) ->bool

Tests forself andother values to be equal, and is used by==.
1.0.0 ·Source§

fnne(&self, other:&Rhs) ->bool

Tests for!=. The default implementation is almost always sufficient,and should not be overridden without very good reason.
1.0.0 ·Source§

impl<T, A1, A2>PartialOrd<Vec<T, A2>> forVec<T, A1>
where T:PartialOrd, A1:Allocator, A2:Allocator,

Implements comparison of vectors,lexicographically.

Source§

fnpartial_cmp(&self, other: &Vec<T, A2>) ->Option<Ordering>

This method returns an ordering betweenself andother values if one exists.Read more
1.0.0 ·Source§

fnlt(&self, other:&Rhs) ->bool

Tests less than (forself andother) and is used by the< operator.Read more
1.0.0 ·Source§

fnle(&self, other:&Rhs) ->bool

Tests less than or equal to (forself andother) and is used by the<= operator.Read more
1.0.0 ·Source§

fngt(&self, other:&Rhs) ->bool

Tests greater than (forself andother) and is used by the>operator.Read more
1.0.0 ·Source§

fnge(&self, other:&Rhs) ->bool

Tests greater than or equal to (forself andother) and is used bythe>= operator.Read more
1.66.0 ·Source§

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>

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:

letstate: Box<[f32;100]> =vec![1.0;100].try_into().unwrap();assert_eq!(state.len(),100);
Source§

typeError =Vec<T>

The type returned in the event of a conversion error.
1.48.0 ·Source§

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>>

Gets the entire contents of theVec<T> as an array,if its size exactly matches that of the requested array.

§Examples
assert_eq!(vec![1,2,3].try_into(),Ok([1,2,3]));assert_eq!(<Vec<i32>>::new().try_into(),Ok([]));

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.

letmutv = String::from("hello world").into_bytes();v.sort();v.truncate(2);let[a, b]: [_;2] = v.try_into().unwrap();assert_eq!(a,b' ');assert_eq!(b,b'd');
Source§

typeError =Vec<T, A>

The type returned in the event of a conversion error.
1.87.0 ·Source§

implTryFrom<Vec<u8>> forString

Source§

fntry_from( bytes:Vec<u8>,) ->Result<String, <String asTryFrom<Vec<u8>>>::Error>

Converts the givenVec<u8> into aString if it contains valid UTF-8 data.

§Examples
lets1 =b"hello world".to_vec();letv1 = String::try_from(s1).unwrap();assert_eq!(v1,"hello world");
Source§

typeError =FromUtf8Error

The type returned in the event of a conversion error.
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.

Source§

fnwrite(&mut self, buf: &[u8]) ->Result<usize>

Writes a buffer into this writer, returning how many bytes were written.Read more
Source§

fnwrite_vectored(&mut self, bufs: &[IoSlice<'_>]) ->Result<usize>

Likewrite, except that it writes from a slice of buffers.Read more
Source§

fnis_write_vectored(&self) ->bool

🔬This is a nightly-only experimental API. (can_vector #69941)
Determines if thisWriter has an efficientwrite_vectoredimplementation.Read more
Source§

fnwrite_all(&mut self, buf: &[u8]) ->Result<()>

Attempts to write an entire buffer into this writer.Read more
Source§

fnwrite_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) ->Result<()>

🔬This is a nightly-only experimental API. (write_all_vectored #70436)
Attempts to write multiple buffers into this writer.Read more
Source§

fnflush(&mut self) ->Result<()>

Flushes this output stream, ensuring that all intermediately bufferedcontents reach their destination.Read more
1.0.0 ·Source§

fnwrite_fmt(&mut self, args:Arguments<'_>) ->Result<()>

Writes a formatted string into this writer, returning any errorencountered.Read more
1.0.0 ·Source§

fnby_ref(&mut self) -> &mut Self
where Self:Sized,

Creates a “by reference” adapter for this instance ofWrite.Read more
Source§

impl<T, A>DerefPure forVec<T, A>
where A:Allocator,

1.0.0 ·Source§

impl<T, A>Eq forVec<T, A>
where T:Eq, A:Allocator,

Auto Trait Implementations§

§

impl<T, A>Freeze forVec<T, A>
where A:Freeze,

§

impl<T, A>RefUnwindSafe forVec<T, A>

§

impl<T, A>Send forVec<T, A>
where A:Send, T:Send,

§

impl<T, A>Sync forVec<T, A>
where A:Sync, T:Sync,

§

impl<T, A>Unpin forVec<T, A>
where A:Unpin, T:Unpin,

§

impl<T, A>UnwindSafe forVec<T, A>

Blanket Implementations§

Source§

impl<T>Any for T
where T: 'static + ?Sized,

Source§

fntype_id(&self) ->TypeId

Gets theTypeId ofself.Read more
Source§

impl<T>Borrow<T> for T
where T: ?Sized,

Source§

fnborrow(&self) ->&T

Immutably borrows from an owned value.Read more
Source§

impl<T>BorrowMut<T> for T
where T: ?Sized,

Source§

fnborrow_mut(&mut self) ->&mut T

Mutably borrows from an owned value.Read more
Source§

impl<T>CloneToUninit for T
where T:Clone,

Source§

unsafe fnclone_to_uninit(&self, dest:*mutu8)

🔬This is a nightly-only experimental API. (clone_to_uninit #126799)
Performs copy-assignment fromself todest.Read more
Source§

impl<T>From<T> for T

Source§

fnfrom(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U>Into<U> for T
where U:From<T>,

Source§

fninto(self) -> U

CallsU::from(self).

That is, this conversion is whatever the implementation ofFrom<T> for U chooses to do.

Source§

impl<P, T>Receiver for P
where P:Deref<Target = T> + ?Sized, T: ?Sized,

Source§

typeTarget = T

🔬This is a nightly-only experimental API. (arbitrary_self_types #44874)
The target type on which the method may be called.
Source§

impl<T>ToOwned for T
where T:Clone,

Source§

typeOwned = T

The resulting type after obtaining ownership.
Source§

fnto_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning.Read more
Source§

fnclone_into(&self, target:&mut T)

Uses borrowed data to replace owned data, usually by cloning.Read more
Source§

impl<T, U>TryFrom<U> for T
where U:Into<T>,

Source§

typeError =Infallible

The type returned in the event of a conversion error.
Source§

fntry_from(value: U) ->Result<T, <T asTryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U>TryInto<U> for T
where U:TryFrom<T>,

Source§

typeError = <U asTryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fntry_into(self) ->Result<U, <U asTryFrom<T>>::Error>

Performs the conversion.

[8]ページ先頭

©2009-2026 Movatter.jp