Movatterモバイル変換


[0]ホーム

URL:


BinaryHeap

std::collections

StructBinaryHeap 

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

usestd::collections::BinaryHeap;letheap = BinaryHeap::from([1,5,2]);

§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

pushpoppeek/peek_mut
O(1)~O(log(n))O(1)

The value forpush is an expected cost; the method documentation gives amore detailed analysis.

Implementations§

Source§

impl<T>BinaryHeap<T>
where T:Ord,

1.0.0 (const: 1.80.0) ·Source

pub const fnnew() ->BinaryHeap<T>

Creates an emptyBinaryHeap as a max-heap.

§Examples

Basic usage:

usestd::collections::BinaryHeap;letmutheap = BinaryHeap::new();heap.push(4);
1.0.0 ·Source

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:

usestd::collections::BinaryHeap;letmutheap = BinaryHeap::with_capacity(10);heap.push(4);
Source§

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

Source

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

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

Creates an emptyBinaryHeap as a max-heap, usingA as allocator.

§Examples

Basic usage:

#![feature(allocator_api)]usestd::alloc::System;usestd::collections::BinaryHeap;letmutheap = BinaryHeap::new_in(System);heap.push(4);
Source

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

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

#![feature(allocator_api)]usestd::alloc::System;usestd::collections::BinaryHeap;letmutheap = BinaryHeap::with_capacity_in(10, System);heap.push(4);
1.12.0 ·Source

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

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

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

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

Consumes theBinaryHeap and returns a vector in sorted(ascending) order.

§Examples

Basic usage:

usestd::collections::BinaryHeap;letmutheap = BinaryHeap::from([1,2,4,5,7]);heap.push(6);heap.push(3);letvec = heap.into_sorted_vec();assert_eq!(vec, [1,2,3,4,5,6,7]);
1.11.0 ·Source

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

Moves all the elements ofother intoself, leavingother empty.

§Examples

Basic usage:

usestd::collections::BinaryHeap;letmuta = BinaryHeap::from([-10,1,2,3,3]);letmutb = BinaryHeap::from([-20,5,43]);a.append(&mutb);assert_eq!(a.into_sorted_vec(), [-20, -10,1,2,3,3,5,43]);assert!(b.is_empty());
Source

pub fndrain_sorted(&mut self) ->DrainSorted<'_, T, A>

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

#![feature(binary_heap_drain_sorted)]usestd::collections::BinaryHeap;letmutheap = BinaryHeap::from([1,2,3,4,5]);assert_eq!(heap.len(),5);drop(heap.drain_sorted());// removes all elements in heap orderassert_eq!(heap.len(),0);
1.70.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. The elements are visited in unsorted (and unspecified) order.

§Examples

Basic usage:

usestd::collections::BinaryHeap;letmutheap = BinaryHeap::from([-10, -5,1,2,4,13]);heap.retain(|x| x %2==0);// only keep even numbersassert_eq!(heap.into_sorted_vec(), [-10,2,4])
Source§

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

1.0.0 ·Source

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

Returns an iterator visiting all values in the underlying vector, inarbitrary order.

§Examples

Basic usage:

usestd::collections::BinaryHeap;letheap = BinaryHeap::from([1,2,3,4]);// Print 1, 2, 3, 4 in arbitrary orderforxinheap.iter() {println!("{x}");}
Source

pub fninto_iter_sorted(self) ->IntoIterSorted<T, A>

🔬This is a nightly-only experimental API. (binary_heap_into_iter_sorted #59278)

Returns an iterator which retrieves elements in heap order.

This method consumes the original heap.

§Examples

Basic usage:

#![feature(binary_heap_into_iter_sorted)]usestd::collections::BinaryHeap;letheap = BinaryHeap::from([1,2,3,4,5]);assert_eq!(heap.into_iter_sorted().take(2).collect::<Vec<_>>(), [5,4]);
1.0.0 ·Source

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

Returns the greatest item in the binary heap, orNone if it is empty.

§Examples

Basic usage:

usestd::collections::BinaryHeap;letmutheap = BinaryHeap::new();assert_eq!(heap.peek(),None);heap.push(1);heap.push(5);heap.push(2);assert_eq!(heap.peek(),Some(&5));
§Time complexity

Cost isO(1) in the worst case.

1.0.0 ·Source

pub fncapacity(&self) ->usize

Returns the number of elements the binary heap can hold without reallocating.

§Examples

Basic usage:

usestd::collections::BinaryHeap;letmutheap = BinaryHeap::with_capacity(100);assert!(heap.capacity() >=100);heap.push(4);
1.0.0 ·Source

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:

usestd::collections::BinaryHeap;letmutheap = BinaryHeap::new();heap.reserve_exact(100);assert!(heap.capacity() >=100);heap.push(4);
1.0.0 ·Source

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:

usestd::collections::BinaryHeap;letmutheap = BinaryHeap::new();heap.reserve(100);assert!(heap.capacity() >=100);heap.push(4);
1.63.0 ·Source

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

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

pub fnshrink_to_fit(&mut self)

Discards as much additional capacity as possible.

§Examples

Basic usage:

usestd::collections::BinaryHeap;letmutheap: BinaryHeap<i32> = BinaryHeap::with_capacity(100);assert!(heap.capacity() >=100);heap.shrink_to_fit();assert!(heap.capacity() ==0);
1.56.0 ·Source

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
usestd::collections::BinaryHeap;letmutheap: BinaryHeap<i32> = BinaryHeap::with_capacity(100);assert!(heap.capacity() >=100);heap.shrink_to(10);assert!(heap.capacity() >=10);
1.80.0 ·Source

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

Returns a slice of all values in the underlying vector, in arbitraryorder.

§Examples

Basic usage:

usestd::collections::BinaryHeap;usestd::io::{self, Write};letheap = BinaryHeap::from([1,2,3,4,5,6,7]);io::sink().write(heap.as_slice()).unwrap();
1.5.0 ·Source

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

Consumes theBinaryHeap and returns the underlying vectorin arbitrary order.

§Examples

Basic usage:

usestd::collections::BinaryHeap;letheap = BinaryHeap::from([1,2,3,4,5,6,7]);letvec = heap.into_vec();// Will print in some orderforxinvec {println!("{x}");}
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 fnlen(&self) ->usize

Returns the length of the binary heap.

§Examples

Basic usage:

usestd::collections::BinaryHeap;letheap = BinaryHeap::from([1,3]);assert_eq!(heap.len(),2);
1.0.0 ·Source

pub fnis_empty(&self) ->bool

Checks if the binary heap is empty.

§Examples

Basic usage:

usestd::collections::BinaryHeap;letmutheap = BinaryHeap::new();assert!(heap.is_empty());heap.push(3);heap.push(5);heap.push(1);assert!(!heap.is_empty());
1.6.0 ·Source

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:

usestd::collections::BinaryHeap;letmutheap = BinaryHeap::from([1,3]);assert!(!heap.is_empty());forxinheap.drain() {println!("{x}");}assert!(heap.is_empty());
1.0.0 ·Source

pub fnclear(&mut self)

Drops all items from the binary heap.

§Examples

Basic usage:

usestd::collections::BinaryHeap;letmutheap = BinaryHeap::from([1,3]);assert!(!heap.is_empty());heap.clear();assert!(heap.is_empty());

Trait Implementations§

1.0.0 ·Source§

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

Source§

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>

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

impl<T, A>Debug forBinaryHeap<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 ·Source§

impl<T>Default forBinaryHeap<T>
where T:Ord,

Source§

fndefault() ->BinaryHeap<T>

Creates an emptyBinaryHeap<T>.

1.2.0 ·Source§

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

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> forBinaryHeap<T, A>
where T:Ord, 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.56.0 ·Source§

impl<T, const N:usize>From<[T; N]> forBinaryHeap<T>
where T:Ord,

Source§

fnfrom(arr:[T; N]) ->BinaryHeap<T>

usestd::collections::BinaryHeap;letmuth1 = BinaryHeap::from([1,4,2,3]);letmuth2: BinaryHeap<_> = [1,4,2,3].into();while letSome((a, b)) = h1.pop().zip(h2.pop()) {assert_eq!(a, b);}
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.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.0.0 ·Source§

impl<T>FromIterator<T> forBinaryHeap<T>
where T:Ord,

Source§

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

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

impl<'a, T, A>IntoIterator for &'aBinaryHeap<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) ->Iter<'a, T>

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

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

Source§

fninto_iter(self) ->IntoIter<T, A>

Creates a consuming iterator, that is, one that moves each value out ofthe binary heap in arbitrary order. The binary heap cannot be usedafter calling this.

§Examples

Basic usage:

usestd::collections::BinaryHeap;letheap = BinaryHeap::from([1,2,3,4]);// Print 1, 2, 3, 4 in arbitrary orderforxinheap.into_iter() {// x has type i32, not &i32println!("{x}");}
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?

Auto Trait Implementations§

§

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

§

impl<T, A>RefUnwindSafe forBinaryHeap<T, A>

§

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

§

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

§

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

§

impl<T, A>UnwindSafe forBinaryHeap<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<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-2025 Movatter.jp