pub struct BinaryHeap<T, A =Global>where A:Allocator,{/* private fields */ }Expand description
A priority queue implemented with a binary heap.
This will be a max-heap.
It is a logic error for an item to be modified in such a way that theitem’s ordering relative to any other item, as determined by theOrdtrait, changes while it is in the heap. This is normally only possiblethrough interior mutability, global state, I/O, or unsafe code. Thebehavior resulting from such a logic error is not specified, but willbe encapsulated to theBinaryHeap that observed the logic error and notresult in undefined behavior. This could include panics, incorrect results,aborts, memory leaks, and non-termination.
As long as no elements change their relative order while being in the heapas described above, the API ofBinaryHeap guarantees that the heapinvariant remains intact i.e. its methods all behave as documented. Forexample if a method is documented as iterating in sorted order, that’sguaranteed to work as long as elements in the heap have not changed order,even in the presence of closures getting unwinded out of, iterators gettingleaked, and similar foolishness.
§Examples
usestd::collections::BinaryHeap;// Type inference lets us omit an explicit type signature (which// would be `BinaryHeap<i32>` in this example).letmutheap = BinaryHeap::new();// We can use peek to look at the next item in the heap. In this case,// there's no items in there yet so we get None.assert_eq!(heap.peek(),None);// Let's add some scores...heap.push(1);heap.push(5);heap.push(2);// Now peek shows the most important item in the heap.assert_eq!(heap.peek(),Some(&5));// We can check the length of a heap.assert_eq!(heap.len(),3);// We can iterate over the items in the heap, although they are returned in// a random order.forxin&heap {println!("{x}");}// If we instead pop these scores, they should come back in order.assert_eq!(heap.pop(),Some(5));assert_eq!(heap.pop(),Some(2));assert_eq!(heap.pop(),Some(1));assert_eq!(heap.pop(),None);// We can clear the heap of any remaining items.heap.clear();// The heap should now be empty.assert!(heap.is_empty())ABinaryHeap with a known list of items can be initialized from an array:
§Min-heap
Eithercore::cmp::Reverse or a customOrd implementation can be used tomakeBinaryHeap a min-heap. This makesheap.pop() return the smallestvalue instead of the greatest one.
usestd::collections::BinaryHeap;usestd::cmp::Reverse;letmutheap = BinaryHeap::new();// Wrap values in `Reverse`heap.push(Reverse(1));heap.push(Reverse(5));heap.push(Reverse(2));// If we pop these scores now, they should come back in the reverse order.assert_eq!(heap.pop(),Some(Reverse(1)));assert_eq!(heap.pop(),Some(Reverse(2)));assert_eq!(heap.pop(),Some(Reverse(5)));assert_eq!(heap.pop(),None);§Time complexity
The value forpush is an expected cost; the method documentation gives amore detailed analysis.
Implementations§
Source§impl<T>BinaryHeap<T>where T:Ord,
impl<T>BinaryHeap<T>where T:Ord,
1.0.0 (const: 1.80.0) ·Sourcepub const fnnew() ->BinaryHeap<T>
pub const fnnew() ->BinaryHeap<T>
1.0.0 ·Sourcepub fnwith_capacity(capacity:usize) ->BinaryHeap<T>
pub fnwith_capacity(capacity:usize) ->BinaryHeap<T>
Creates an emptyBinaryHeap with at least the specified capacity.
The binary heap will be able to hold at leastcapacity elements withoutreallocating. This method is allowed to allocate for more elements thancapacity. Ifcapacity is zero, the binary heap will not allocate.
§Examples
Basic usage:
Source§impl<T, A>BinaryHeap<T, A>
impl<T, A>BinaryHeap<T, A>
Sourcepub const fnnew_in(alloc: A) ->BinaryHeap<T, A>
🔬This is a nightly-only experimental API. (allocator_api #32838)
pub const fnnew_in(alloc: A) ->BinaryHeap<T, A>
allocator_api #32838)Sourcepub fnwith_capacity_in(capacity:usize, alloc: A) ->BinaryHeap<T, A>
🔬This is a nightly-only experimental API. (allocator_api #32838)
pub fnwith_capacity_in(capacity:usize, alloc: A) ->BinaryHeap<T, A>
allocator_api #32838)Creates an emptyBinaryHeap with at least the specified capacity, usingA as allocator.
The binary heap will be able to hold at leastcapacity elements withoutreallocating. This method is allowed to allocate for more elements thancapacity. Ifcapacity is zero, the binary heap will not allocate.
§Examples
Basic usage:
1.12.0 ·Sourcepub fnpeek_mut(&mut self) ->Option<PeekMut<'_, T, A>>
pub fnpeek_mut(&mut self) ->Option<PeekMut<'_, T, A>>
Returns a mutable reference to the greatest item in the binary heap, orNone if it is empty.
Note: If thePeekMut value is leaked, some heap elements might getleaked along with it, but the remaining elements will remain a validheap.
§Examples
Basic usage:
usestd::collections::BinaryHeap;letmutheap = BinaryHeap::new();assert!(heap.peek_mut().is_none());heap.push(1);heap.push(5);heap.push(2);if letSome(mutval) = heap.peek_mut() {*val =0;}assert_eq!(heap.peek(),Some(&2));§Time complexity
If the item is modified then the worst case time complexity isO(log(n)),otherwise it’sO(1).
1.0.0 ·Sourcepub fnpop(&mut self) ->Option<T>
pub fnpop(&mut self) ->Option<T>
Removes the greatest item from the binary heap and returns it, orNone if itis empty.
§Examples
Basic usage:
usestd::collections::BinaryHeap;letmutheap = BinaryHeap::from([1,3]);assert_eq!(heap.pop(),Some(3));assert_eq!(heap.pop(),Some(1));assert_eq!(heap.pop(),None);§Time complexity
The worst case cost ofpop on a heap containingn elements isO(log(n)).
1.0.0 ·Sourcepub fnpush(&mut self, item: T)
pub fnpush(&mut self, item: T)
Pushes an item onto the binary heap.
§Examples
Basic usage:
usestd::collections::BinaryHeap;letmutheap = BinaryHeap::new();heap.push(3);heap.push(5);heap.push(1);assert_eq!(heap.len(),3);assert_eq!(heap.peek(),Some(&5));§Time complexity
The expected cost ofpush, averaged over every possible ordering ofthe elements being pushed, and over a sufficiently large number ofpushes, isO(1). This is the most meaningful cost metric when pushingelements that arenot already in any sorted pattern.
The time complexity degrades if elements are pushed in predominantlyascending order. In the worst case, elements are pushed in ascendingsorted order and the amortized cost per push isO(log(n)) against a heapcontainingn elements.
The worst case cost of asingle call topush isO(n). The worst caseoccurs when capacity is exhausted and needs a resize. The resize costhas been amortized in the previous figures.
1.5.0 ·Sourcepub fninto_sorted_vec(self) ->Vec<T, A>
pub fninto_sorted_vec(self) ->Vec<T, A>
1.11.0 ·Sourcepub fnappend(&mut self, other: &mutBinaryHeap<T, A>)
pub fnappend(&mut self, other: &mutBinaryHeap<T, A>)
Sourcepub fndrain_sorted(&mut self) ->DrainSorted<'_, T, A>ⓘ
🔬This is a nightly-only experimental API. (binary_heap_drain_sorted #59278)
pub fndrain_sorted(&mut self) ->DrainSorted<'_, T, A>ⓘ
binary_heap_drain_sorted #59278)Clears the binary heap, returning an iterator over the removed elementsin heap order. If the iterator is dropped before being fully consumed,it drops the remaining elements in heap order.
The returned iterator keeps a mutable borrow on the heap to optimizeits implementation.
Note:
.drain_sorted()isO(n * log(n)); much slower than.drain().You should use the latter for most cases.
§Examples
Basic usage:
Source§impl<T, A>BinaryHeap<T, A>where A:Allocator,
impl<T, A>BinaryHeap<T, A>where A:Allocator,
1.0.0 ·Sourcepub fniter(&self) ->Iter<'_, T>ⓘ
pub fniter(&self) ->Iter<'_, T>ⓘ
Returns an iterator visiting all values in the underlying vector, inarbitrary order.
§Examples
Basic usage:
Sourcepub fninto_iter_sorted(self) ->IntoIterSorted<T, A>ⓘ
🔬This is a nightly-only experimental API. (binary_heap_into_iter_sorted #59278)
pub fninto_iter_sorted(self) ->IntoIterSorted<T, A>ⓘ
binary_heap_into_iter_sorted #59278)Returns an iterator which retrieves elements in heap order.
This method consumes the original heap.
§Examples
Basic usage:
1.0.0 ·Sourcepub fncapacity(&self) ->usize
pub fncapacity(&self) ->usize
1.0.0 ·Sourcepub fnreserve_exact(&mut self, additional:usize)
pub fnreserve_exact(&mut self, additional:usize)
Reserves the minimum capacity for at leastadditional elements more thanthe current length. 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.
§Panics
Panics if the new capacity overflowsusize.
§Examples
Basic usage:
1.0.0 ·Sourcepub fnreserve(&mut self, additional:usize)
pub fnreserve(&mut self, additional:usize)
Reserves capacity for at leastadditional elements more than thecurrent length. The allocator may reserve more space to speculativelyavoid frequent allocations. 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 overflowsusize.
§Examples
Basic usage:
1.63.0 ·Sourcepub fntry_reserve_exact( &mut self, additional:usize,) ->Result<(),TryReserveError>
pub fntry_reserve_exact( &mut self, additional:usize,) ->Result<(),TryReserveError>
Tries to reserve the minimum capacity for at leastadditional elementsmore than the current length. Unliketry_reserve, this will notdeliberately over-allocate to speculatively avoid frequent allocations.After callingtry_reserve_exact, capacity will be greater than orequal 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::BinaryHeap;usestd::collections::TryReserveError;fnfind_max_slow(data:&[u32]) ->Result<Option<u32>, TryReserveError> {letmutheap = BinaryHeap::new();// Pre-reserve the memory, exiting if we can'theap.try_reserve_exact(data.len())?;// Now we know this can't OOM in the middle of our complex workheap.extend(data.iter());Ok(heap.pop())}1.63.0 ·Sourcepub fntry_reserve(&mut self, additional:usize) ->Result<(),TryReserveError>
pub fntry_reserve(&mut self, additional:usize) ->Result<(),TryReserveError>
Tries to reserve capacity for at leastadditional elements more than thecurrent length. The allocator may reserve more space to speculativelyavoid frequent allocations. 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::BinaryHeap;usestd::collections::TryReserveError;fnfind_max_slow(data:&[u32]) ->Result<Option<u32>, TryReserveError> {letmutheap = BinaryHeap::new();// Pre-reserve the memory, exiting if we can'theap.try_reserve(data.len())?;// Now we know this can't OOM in the middle of our complex workheap.extend(data.iter());Ok(heap.pop())}1.0.0 ·Sourcepub fnshrink_to_fit(&mut self)
pub fnshrink_to_fit(&mut self)
1.56.0 ·Sourcepub fnshrink_to(&mut self, min_capacity:usize)
pub fnshrink_to(&mut self, min_capacity:usize)
Discards capacity with a lower bound.
The capacity will remain at least as large as both the lengthand the supplied value.
If the current capacity is less than the lower limit, this is a no-op.
§Examples
1.80.0 ·Sourcepub fnas_slice(&self) -> &[T]
pub fnas_slice(&self) -> &[T]
1.5.0 ·Sourcepub fninto_vec(self) ->Vec<T, A>
pub fninto_vec(self) ->Vec<T, A>
Sourcepub fnallocator(&self) ->&A
🔬This is a nightly-only experimental API. (allocator_api #32838)
pub fnallocator(&self) ->&A
allocator_api #32838)Returns a reference to the underlying allocator.
1.6.0 ·Sourcepub fndrain(&mut self) ->Drain<'_, T, A>ⓘ
pub fndrain(&mut self) ->Drain<'_, T, A>ⓘ
Clears the binary heap, returning an iterator over the removed elementsin arbitrary order. If the iterator is dropped before being fullyconsumed, it drops the remaining elements in arbitrary order.
The returned iterator keeps a mutable borrow on the heap to optimizeits implementation.
§Examples
Basic usage:
Trait Implementations§
1.0.0 ·Source§impl<T, A>Clone forBinaryHeap<T, A>
impl<T, A>Clone forBinaryHeap<T, A>
Source§fnclone_from(&mut self, source: &BinaryHeap<T, A>)
fnclone_from(&mut self, source: &BinaryHeap<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.
SeeVec::clone_from() for more details.
Source§fnclone(&self) ->BinaryHeap<T, A>
fnclone(&self) ->BinaryHeap<T, A>
1.4.0 ·Source§impl<T, A>Debug forBinaryHeap<T, A>
impl<T, A>Debug forBinaryHeap<T, A>
1.0.0 ·Source§impl<T>Default forBinaryHeap<T>where T:Ord,
impl<T>Default forBinaryHeap<T>where T:Ord,
Source§fndefault() ->BinaryHeap<T>
fndefault() ->BinaryHeap<T>
Creates an emptyBinaryHeap<T>.
1.2.0 ·Source§impl<'a, T, A>Extend<&'a T> forBinaryHeap<T, A>
impl<'a, T, A>Extend<&'a T> forBinaryHeap<T, A>
1.0.0 ·Source§impl<T, A>Extend<T> forBinaryHeap<T, A>
impl<T, A>Extend<T> forBinaryHeap<T, A>
Source§fnextend<I>(&mut self, iter: I)where I:IntoIterator<Item = T>,
fnextend<I>(&mut self, iter: I)where I:IntoIterator<Item = T>,
Source§fnextend_one(&mut self, item: T)
fnextend_one(&mut self, item: T)
extend_one #72631)1.56.0 ·Source§impl<T, const N:usize>From<[T; N]> forBinaryHeap<T>where T:Ord,
impl<T, const N:usize>From<[T; N]> forBinaryHeap<T>where T:Ord,
Source§fnfrom(arr:[T; N]) ->BinaryHeap<T>
fnfrom(arr:[T; N]) ->BinaryHeap<T>
1.5.0 ·Source§impl<T, A>From<BinaryHeap<T, A>> forVec<T, A>where A:Allocator,
impl<T, A>From<BinaryHeap<T, A>> forVec<T, A>where A:Allocator,
Source§fnfrom(heap:BinaryHeap<T, A>) ->Vec<T, A>
fnfrom(heap:BinaryHeap<T, A>) ->Vec<T, A>
Converts aBinaryHeap<T> into aVec<T>.
This conversion requires no data movement or allocation, and hasconstant time complexity.
1.5.0 ·Source§impl<T, A>From<Vec<T, A>> forBinaryHeap<T, A>
impl<T, A>From<Vec<T, A>> forBinaryHeap<T, A>
Source§fnfrom(vec:Vec<T, A>) ->BinaryHeap<T, A>
fnfrom(vec:Vec<T, A>) ->BinaryHeap<T, A>
Converts aVec<T> into aBinaryHeap<T>.
This conversion happens in-place, and hasO(n) time complexity.