Struct priority_queue::priority_queue::PriorityQueue
source · pub struct PriorityQueue<I, P, H = RandomState> { /* private fields */ }
Expand description
A priority queue with efficient change function to change the priority of an element.
The priority is of type P, that must implement std::cmp::Ord
.
The item is of type I, that must implement Hash
and Eq
.
Implemented as a heap of indexes, stores the items inside an IndexMap
to be able to retrieve them quickly.
§Example
use priority_queue::PriorityQueue;
let mut pq = PriorityQueue::new();
assert!(pq.is_empty());
pq.push("Apples", 5);
pq.push("Bananas", 8);
pq.push("Strawberries", 23);
assert_eq!(pq.peek(), Some((&"Strawberries", &23)));
pq.change_priority("Bananas", 25);
assert_eq!(pq.peek(), Some((&"Bananas", &25)));
for (item, _) in pq.into_sorted_iter() {
println!("{}", item);
}
Implementations§
source§impl<I, P> PriorityQueue<I, P>
impl<I, P> PriorityQueue<I, P>
sourcepub fn with_capacity(capacity: usize) -> Self
pub fn with_capacity(capacity: usize) -> Self
Creates an empty PriorityQueue
with the specified capacity.
source§impl<I, P, H> PriorityQueue<I, P, H>
impl<I, P, H> PriorityQueue<I, P, H>
sourcepub fn with_default_hasher() -> Self
pub fn with_default_hasher() -> Self
Creates an empty PriorityQueue
with the default hasher
sourcepub fn with_capacity_and_default_hasher(capacity: usize) -> Self
pub fn with_capacity_and_default_hasher(capacity: usize) -> Self
Creates an empty PriorityQueue
with the specified capacity and default hasher
source§impl<I, P, H> PriorityQueue<I, P, H>
impl<I, P, H> PriorityQueue<I, P, H>
sourcepub fn with_hasher(hash_builder: H) -> Self
pub fn with_hasher(hash_builder: H) -> Self
Creates an empty PriorityQueue
with the specified hasher
sourcepub fn with_capacity_and_hasher(capacity: usize, hash_builder: H) -> Self
pub fn with_capacity_and_hasher(capacity: usize, hash_builder: H) -> Self
Creates an empty PriorityQueue
with the specified capacity and hasher
The internal collections will be able to hold at least capacity
elements without reallocating.
If capacity
is 0, there will be no allocation.
source§impl<I, P, H> PriorityQueue<I, P, H>
impl<I, P, H> PriorityQueue<I, P, H>
sourcepub fn iter(&self) -> Iter<'_, I, P> ⓘ
pub fn iter(&self) -> Iter<'_, I, P> ⓘ
Returns an iterator in arbitrary order over the (item, priority) elements in the queue
sourcepub fn shrink_to_fit(&mut self)
pub fn shrink_to_fit(&mut self)
Shrinks the capacity of the internal data structures that support this operation as much as possible.
sourcepub fn drain(&mut self) -> Drain<'_, I, P> ⓘ
pub fn drain(&mut self) -> Drain<'_, I, P> ⓘ
Clears the PriorityQueue, returning an iterator over the removed elements in arbitrary order. If the iterator is dropped before being fully consumed, it drops the remaining elements in arbitrary order.
sourcepub fn peek(&self) -> Option<(&I, &P)>
pub fn peek(&self) -> Option<(&I, &P)>
Returns the couple (item, priority) with the greatest priority in the queue, or None if it is empty.
Computes in O(1) time
sourcepub fn capacity(&self) -> usize
pub fn capacity(&self) -> usize
Returns the number of elements the internal map can hold without reallocating.
This number is a lower bound; the map might be able to hold more, but is guaranteed to be able to hold at least this many.
sourcepub fn reserve(&mut self, additional: usize)
pub fn reserve(&mut self, additional: usize)
Reserves capacity for at least additional
more elements to be inserted
in the given PriorityQueue
. The collection may reserve more space to avoid
frequent reallocations. After calling reserve
, capacity will be
greater than or equal to self.len() + additional
. Does nothing if
capacity is already sufficient.
§Panics
Panics if the new capacity overflows usize
.
sourcepub fn reserve_exact(&mut self, additional: usize)
pub fn reserve_exact(&mut self, additional: usize)
Reserve capacity for additional
more elements, without over-allocating.
Unlike reserve
, this does not deliberately over-allocate the entry capacity to avoid
frequent re-allocations. However, the underlying data structures may still have internal
capacity requirements, and the allocator itself may give more space than requested, so this
cannot be relied upon to be precisely minimal.
Computes in O(n) time.
sourcepub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError>
pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError>
Try to reserve capacity for at least additional
more elements.
Computes in O(n) time.
sourcepub fn try_reserve_exact(
&mut self,
additional: usize,
) -> Result<(), TryReserveError>
pub fn try_reserve_exact( &mut self, additional: usize, ) -> Result<(), TryReserveError>
Try to reserve capacity for additional
more elements, without over-allocating.
Unlike reserve
, this does not deliberately over-allocate the entry capacity to avoid
frequent re-allocations. However, the underlying data structures may still have internal
capacity requirements, and the allocator itself may give more space than requested, so this
cannot be relied upon to be precisely minimal.
Computes in O(n) time.
source§impl<I, P, H> PriorityQueue<I, P, H>where
P: Ord,
impl<I, P, H> PriorityQueue<I, P, H>where
P: Ord,
sourcepub fn iter_mut(&mut self) -> IterMut<'_, I, P, H> ⓘ
pub fn iter_mut(&mut self) -> IterMut<'_, I, P, H> ⓘ
Returns an iterator in arbitrary order over the (item, priority) elements in the queue.
The item and the priority are mutable references, but it’s a logic error
to modify the item in a way that change the result of Hash
or Eq
.
It’s not an error, instead, to modify the priorities, because the heap
will be rebuilt once the IterMut
goes out of scope. It would be
rebuilt even if no priority value would have been modified, but the
procedure will not move anything, but just compare the priorities.
sourcepub fn pop(&mut self) -> Option<(I, P)>
pub fn pop(&mut self) -> Option<(I, P)>
Removes the item with the greatest priority from the priority queue and returns the pair (item, priority), or None if the queue is empty.
sourcepub fn into_sorted_vec(self) -> Vec<I>
pub fn into_sorted_vec(self) -> Vec<I>
Implements a HeapSort.
Returns a Vec<I>
sorted from the item associated to the highest priority to the lowest.
sourcepub fn into_sorted_iter(self) -> IntoSortedIter<I, P, H> ⓘ
pub fn into_sorted_iter(self) -> IntoSortedIter<I, P, H> ⓘ
Generates a new iterator from self that will extract the elements from the one with the highest priority to the lowest one.
source§impl<I, P, H> PriorityQueue<I, P, H>
impl<I, P, H> PriorityQueue<I, P, H>
sourcepub fn push(&mut self, item: I, priority: P) -> Option<P>
pub fn push(&mut self, item: I, priority: P) -> Option<P>
Insert the item-priority pair into the queue.
If an element equal to item
was already into the queue,
it is updated and the old value of its priority returned in Some
;
otherwise, returns None
.
Computes in O(log(N)) time.
sourcepub fn push_increase(&mut self, item: I, priority: P) -> Option<P>
pub fn push_increase(&mut self, item: I, priority: P) -> Option<P>
Increase the priority of an existing item in the queue, or insert it if not present.
If an element equal to item
is already in the queue with a
lower priority, its priority is increased to the new one
without replacing the element and the old priority is returned.
Otherwise, the new element is inserted into the queue.
Returns Some
if an element equal to item
is already in the
queue. If its priority is higher then priority
, the latter is returned back,
otherwise, the old priority is contained in the Option.
If the item is not in the queue, None
is returned.
Computes in O(log(N)) time.
sourcepub fn push_decrease(&mut self, item: I, priority: P) -> Option<P>
pub fn push_decrease(&mut self, item: I, priority: P) -> Option<P>
Decrease the priority of an existing item in the queue, or insert it if not present.
If an element equal to item
is already in the queue with a
higher priority, its priority is decreased to the new one
without replacing the element and the old priority is returned.
Otherwise, the new element is inserted into the queue.
Returns Some
if an element equal to item
is already in the
queue. If its priority is lower then priority
, the latter is returned back,
otherwise, the old priority is contained in the Option.
If the item is not in the queue, None
is returned.
Computes in O(log(N)) time.
sourcepub fn change_priority<Q>(&mut self, item: &Q, new_priority: P) -> Option<P>
pub fn change_priority<Q>(&mut self, item: &Q, new_priority: P) -> Option<P>
Change the priority of an Item returning the old value of priority,
or None
if the item wasn’t in the queue.
The argument item
is only used for lookup, and is not used to overwrite the item’s data
in the priority queue.
The item is found in O(1) thanks to the hash table. The operation is performed in O(log(N)) time.
sourcepub fn change_priority_by<Q, F>(&mut self, item: &Q, priority_setter: F) -> bool
pub fn change_priority_by<Q, F>(&mut self, item: &Q, priority_setter: F) -> bool
Change the priority of an Item using the provided function.
Return a boolean value where true
means the item was in the queue and update was successful
The argument item
is only used for lookup, and is not used to overwrite the item’s data
in the priority queue.
The item is found in O(1) thanks to the hash table. The operation is performed in O(log(N)) time (worst case).
sourcepub fn get_priority<Q>(&self, item: &Q) -> Option<&P>
pub fn get_priority<Q>(&self, item: &Q) -> Option<&P>
Get the priority of an item, or None
, if the item is not in the queue
sourcepub fn get<Q>(&self, item: &Q) -> Option<(&I, &P)>
pub fn get<Q>(&self, item: &Q) -> Option<(&I, &P)>
Get the couple (item, priority) of an arbitrary element, as reference
or None
if the item is not in the queue.
sourcepub fn get_mut<Q>(&mut self, item: &Q) -> Option<(&mut I, &P)>
pub fn get_mut<Q>(&mut self, item: &Q) -> Option<(&mut I, &P)>
Get the couple (item, priority) of an arbitrary element, or None
if the item was not in the queue.
The item is a mutable reference, but it’s a logic error to modify it
in a way that change the result of Hash
or Eq
.
The priority cannot be modified with a call to this function.
To modify the priority use push
, change_priority
or
change_priority_by
.
sourcepub fn peek_mut(&mut self) -> Option<(&mut I, &P)>
pub fn peek_mut(&mut self) -> Option<(&mut I, &P)>
Returns the couple (item, priority) with the greatest priority in the queue, or None if it is empty.
The item is a mutable reference, but it’s a logic error to modify it
in a way that change the result of Hash
or Eq
.
The priority cannot be modified with a call to this function.
To modify the priority use push
, change_priority
or
change_priority_by
.
Computes in O(1) time
sourcepub fn remove<Q>(&mut self, item: &Q) -> Option<(I, P)>
pub fn remove<Q>(&mut self, item: &Q) -> Option<(I, P)>
Remove an arbitrary element from the priority queue. Returns the (item, priority) couple or None if the item is not found in the queue.
The operation is performed in O(log(N)) time (worst case).
sourcepub fn append(&mut self, other: &mut Self)
pub fn append(&mut self, other: &mut Self)
Move all items of the other
queue to self
ignoring the items Eq to elements already in self
At the end, other
will be empty.
Note that at the end, the priority of the duplicated elements inside self may be the one of the elements in other, if other is longer than self
Trait Implementations§
source§impl<I: Clone, P: Clone, H: Clone> Clone for PriorityQueue<I, P, H>
impl<I: Clone, P: Clone, H: Clone> Clone for PriorityQueue<I, P, H>
source§fn clone(&self) -> PriorityQueue<I, P, H>
fn clone(&self) -> PriorityQueue<I, P, H>
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl<I, P, H> Default for PriorityQueue<I, P, H>
impl<I, P, H> Default for PriorityQueue<I, P, H>
source§impl<'de, I, P, H> Deserialize<'de> for PriorityQueue<I, P, H>
Available on crate feature serde
only.
impl<'de, I, P, H> Deserialize<'de> for PriorityQueue<I, P, H>
serde
only.source§fn deserialize<D>(deserializer: D) -> Result<PriorityQueue<I, P, H>, D::Error>where
D: Deserializer<'de>,
fn deserialize<D>(deserializer: D) -> Result<PriorityQueue<I, P, H>, D::Error>where
D: Deserializer<'de>,
source§impl<I, P, H> Extend<(I, P)> for PriorityQueue<I, P, H>
impl<I, P, H> Extend<(I, P)> for PriorityQueue<I, P, H>
source§fn extend<T: IntoIterator<Item = (I, P)>>(&mut self, iter: T)
fn extend<T: IntoIterator<Item = (I, P)>>(&mut self, iter: T)
source§fn extend_one(&mut self, item: A)
fn extend_one(&mut self, item: A)
extend_one
)source§fn extend_reserve(&mut self, additional: usize)
fn extend_reserve(&mut self, additional: usize)
extend_one
)source§impl<I, P, H> From<DoublePriorityQueue<I, P, H>> for PriorityQueue<I, P, H>
impl<I, P, H> From<DoublePriorityQueue<I, P, H>> for PriorityQueue<I, P, H>
source§fn from(pq: DoublePriorityQueue<I, P, H>) -> Self
fn from(pq: DoublePriorityQueue<I, P, H>) -> Self
source§impl<I, P, H> From<PriorityQueue<I, P, H>> for DoublePriorityQueue<I, P, H>
impl<I, P, H> From<PriorityQueue<I, P, H>> for DoublePriorityQueue<I, P, H>
source§fn from(pq: PriorityQueue<I, P, H>) -> Self
fn from(pq: PriorityQueue<I, P, H>) -> Self
source§impl<I, P, H> FromIterator<(I, P)> for PriorityQueue<I, P, H>
impl<I, P, H> FromIterator<(I, P)> for PriorityQueue<I, P, H>
source§impl<'a, I, P, H> IntoIterator for &'a PriorityQueue<I, P, H>
impl<'a, I, P, H> IntoIterator for &'a PriorityQueue<I, P, H>
source§impl<'a, I, P, H> IntoIterator for &'a mut PriorityQueue<I, P, H>
impl<'a, I, P, H> IntoIterator for &'a mut PriorityQueue<I, P, H>
source§impl<I, P, H> IntoIterator for PriorityQueue<I, P, H>
impl<I, P, H> IntoIterator for PriorityQueue<I, P, H>
source§impl<I, P1, H1, P2, H2> PartialEq<PriorityQueue<I, P2, H2>> for PriorityQueue<I, P1, H1>where
I: Hash + Eq,
P1: Ord + PartialEq<P2>,
Option<P1>: PartialEq<Option<P2>>,
P2: Ord,
H1: BuildHasher,
H2: BuildHasher,
impl<I, P1, H1, P2, H2> PartialEq<PriorityQueue<I, P2, H2>> for PriorityQueue<I, P1, H1>where
I: Hash + Eq,
P1: Ord + PartialEq<P2>,
Option<P1>: PartialEq<Option<P2>>,
P2: Ord,
H1: BuildHasher,
H2: BuildHasher,
source§impl<I, P, H> Serialize for PriorityQueue<I, P, H>
Available on crate feature serde
only.
impl<I, P, H> Serialize for PriorityQueue<I, P, H>
serde
only.impl<I, P, H> Eq for PriorityQueue<I, P, H>
Auto Trait Implementations§
impl<I, P, H> Freeze for PriorityQueue<I, P, H>where
H: Freeze,
impl<I, P, H> RefUnwindSafe for PriorityQueue<I, P, H>
impl<I, P, H> Send for PriorityQueue<I, P, H>
impl<I, P, H> Sync for PriorityQueue<I, P, H>
impl<I, P, H> Unpin for PriorityQueue<I, P, H>
impl<I, P, H> UnwindSafe for PriorityQueue<I, P, H>
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.