2013-05-03 92 views
0

我正在構建一個優先級隊列,並試圖使其成爲一個模板類。當我彈出時,它必須返回類型T.有沒有辦法不返回任何內容或一個好的做法,以避免崩潰,如果沒有任何內容?我可以避免返回函數的模板返回類型嗎?

+0

拋出異常將是合理的。 – Nbr44 2013-05-03 05:34:47

+0

也許看看'std :: priority_queue'的靈感? – juanchopanza 2013-05-03 05:53:47

回答

4

這裏的預期行爲是拋出異常。用戶應該在嘗試彈出之前檢查隊列是否爲空。您也可以返回null,但前提是您的類型T從不具有null值,否則,如果由於發生錯誤或由於隊列中的下一個值爲null而返回該值,則不明確。

+1

我覺得有點不好意思,但'可選''會有效*使它可以爲空。不過,一個例外確實比嘗試處理返回無效值更好。 – chris 2013-05-03 05:52:05

+0

返回null或其他平凡的值可能不是一個好的理想。如果我實例化priority_queue ,構造一個實例並返回它,這可能會導致意外的結果。 – 2013-05-03 06:24:50

+0

作爲一個模板類作家,你不能對'T'和'null'類型之間的關係做出假設。 「空」至多是一個概念。 'NULL'是一個空**指針**常量,你不能假設'T'是一個指針。畢竟,C++不是Java。 – MSalters 2013-05-03 09:29:08

1

模板與問題無關。

有兩個常見的方法來處理這種情況:

  1. Store中的堆對象。移除時,將數據結構中的對象從數據結構中分離出來,並返回給它的引用(指針),而不是對象本身。如果數據結構爲空,則返回NULL。
  2. 只有在隊列不爲空的情況下,將您的pop定義爲有效。因此用戶需要在調用pop(需要提供isEmpty功能)之前執行空虛檢查。如果這個前提條件不符合,異常/錯誤返回是一種有效的處理。
0

一般來說,pop操作應not返回一個值。這是因爲返回類型的拷貝構造函數可能會拋出異常;如果發生這種情況,價值從隊列中消失,並沒有被複制到任何地方,所以它已經消失。

相反,應該有兩個操作:一個top函數返回的數據結構的頂部的參考對象和pop功能,消除頂部元素,但不返回任何東西。如果您查看std::queue,您將看到成員void pop()reference front(),它返回對頂部元素的引用。

現在來看看你的問題。 <g>彈出空隊列是一個錯誤。在標準庫中它會產生未定義的行爲。如果你想添加錯誤檢查的代碼,你應該拋出異常或中止程序。我傾向於後者;如果調用代碼未確定存在可彈出的元素,則可能尚未寫入以強有力地處理異常。另一方面,在GUI中,可能適合拋出終止當前操作的異常;這會使應用程序運行並等待下一個用戶請求。