2016-11-10 3 views
1

Я использовал пакет container/heap для реализации очереди приоритетов. Меня это беспокоит. Каким должно быть поведение метода interface.Pop(), если куча пуста? Я не вижу ничего, упомянутые в документации и не кажется, исходный код, чтобы ожидать такую ​​ситуацию:Контейнер/куча Поп() на пустой куче

// Pop removes the minimum element (according to Less) from the heap 
// and returns it. The complexity is O(log(n)) where n = h.Len(). 
// It is equivalent to Remove(h, 0). 
// 
func Pop(h Interface) interface{} { 
     n := h.Len() - 1 
     h.Swap(0, n) 
     down(h, 0, n) 
     return h.Pop() 
} 

Ясно, что если h.Len() является 0 это не будет хорошо работать. Это просто означает panic или пользователь должен всегда проверять, остались ли какие-либо предметы?

+0

Это зависит от вас. Вы можете либо вернуть ноль, либо панику. (Я бы сказал, что более правильно позволить ему паниковать, а не позволять пользователю получить нулевое возвращаемое значение) – JimB

+0

go глубже и проверить методы h.Swap() и down(), они проверяют пределы –

+0

@YandryPozo - 'if j1> = n || j1 <0 {// j1 <0 после int overflow' Я думаю, что это немного другое. И 'h.Swap()' реализуется базовым 'sort.Interface'. –

ответ

1

Естественное поведение - паника. Это то, что делает IntHeap example.

Как указано в комментариях, контроль не достигнет h.Pop(), если h.Swap() паники. Тем не менее, h.Pop() еще можно назвать на пустой куче, если heap.Remove() дается -1 как индекс:

// Remove removes the element at index i from the heap. 
// The complexity is O(log(n)) where n = h.Len(). 
// 
func Remove(h Interface, i int) interface{} { 
    n := h.Len() - 1 
    if n != i { 
     h.Swap(i, n) 
     down(h, i, n) 
     up(h, i) 
    } 
    return h.Pop() 
} 

If h.Swap() паника по негативным показателям, h.Pop() следует также паническим для последовательности.

Имея h.Swap() молча игнорировать отрицательные индексы и h.Pop() возвращают значение по умолчанию, как nil соответствует, но и другие программисты считают, что удивительно, так что я не рекомендую.

Смежные вопросы