The heapqueue module implements a двоичная куча data structure that can be used as a очередь с приоритетами. They are represented as arrays for which a[k]<=a[2*k+1] and a[k]<=a[2*k+2] for all indices k (counting elements from 0). The interesting property of a heap is that a[0] is always its smallest element.
Основные использование
Пример:
import std/heapqueue
var heap = [8, 2].toHeapQueue
heap.push(5)
# the first element is the lowest element
assert heap[0] == 2
# remove and return the lowest element
assert heap.pop() == 2
# the lowest element remaining is 5
assert heap[0] == 5
Использование с пользовательскими объектами
Для использования HeapQueue с пользовательским объектом, необходимо реализовать оператор <.
Пример:
import std/heapqueue
type Job = object
priority: int
proc `<`(a, b: Job): bool = a.priority < b.priority
var jobs = initHeapQueue[Job]()
jobs.push(Job(priority: 1))
jobs.push(Job(priority: 2))
assert jobs[0].priority == 1
proc replace[T](heap: var HeapQueue[T]; item: sink T): T
Извлекает и возвращает текущее наименьшее значение и добавляет новый элемент. Это более эффективно, чем pop() с последующим push(), и может быть более подходящим при использовании кучи фиксированного размера. Обратите внимание, что возвращаемое значение может быть больше, чем item! Это ограничивает разумное использование данной функции, если она не используется в условной замене.