我正在構建一個優先級隊列,並試圖使其成爲一個模板類。當我彈出時,它必須返回類型T.有沒有辦法不返回任何內容或一個好的做法,以避免崩潰,如果沒有任何內容?我可以避免返回函數的模板返回類型嗎?
回答
這裏的預期行爲是拋出異常。用戶應該在嘗試彈出之前檢查隊列是否爲空。您也可以返回null,但前提是您的類型T從不具有null值,否則,如果由於發生錯誤或由於隊列中的下一個值爲null而返回該值,則不明確。
我覺得有點不好意思,但'可選
返回null或其他平凡的值可能不是一個好的理想。如果我實例化priority_queue
作爲一個模板類作家,你不能對'T'和'null'類型之間的關係做出假設。 「空」至多是一個概念。 'NULL'是一個空**指針**常量,你不能假設'T'是一個指針。畢竟,C++不是Java。 – MSalters 2013-05-03 09:29:08
模板與問題無關。
有兩個常見的方法來處理這種情況:
- Store中的堆對象。移除時,將數據結構中的對象從數據結構中分離出來,並返回給它的引用(指針),而不是對象本身。如果數據結構爲空,則返回NULL。
- 只有在隊列不爲空的情況下,將您的
pop
定義爲有效。因此用戶需要在調用pop
(需要提供isEmpty
功能)之前執行空虛檢查。如果這個前提條件不符合,異常/錯誤返回是一種有效的處理。
一般來說,pop
操作應not返回一個值。這是因爲返回類型的拷貝構造函數可能會拋出異常;如果發生這種情況,價值從隊列中消失,並沒有被複制到任何地方,所以它已經消失。
相反,應該有兩個操作:一個top
函數返回的數據結構的頂部的參考對象和pop
功能,消除頂部元素,但不返回任何東西。如果您查看std::queue
,您將看到成員void pop()
和reference front()
,它返回對頂部元素的引用。
現在來看看你的問題。 <g>
彈出空隊列是一個錯誤。在標準庫中它會產生未定義的行爲。如果你想添加錯誤檢查的代碼,你應該拋出異常或中止程序。我傾向於後者;如果調用代碼未確定存在可彈出的元素,則可能尚未寫入以強有力地處理異常。另一方面,在GUI中,可能適合拋出終止當前操作的異常;這會使應用程序運行並等待下一個用戶請求。
- 1. 我可以使用類模板返回類型的函數嗎?
- 2. 我可以避免在不返回無效的函數中返回值嗎?
- 3. 與模板返回類型的函數
- 4. 讓函數返回模板類型
- 5. 返回類型模板函數
- 6. 模板函數採用任何函數並返回函子的類型返回
- 7. 從函數創建和返回對象:可以避免垃圾回收嗎?
- 8. 我可以從另一個函數返回返回值嗎?
- 9. 返回模板類型
- 10. 成員函數的模板類和類型返回類型
- 11. 構造函數可以返回java中的數據類型嗎?
- 12. 基於模板參數C++模板函數返回類型
- 13. 從函數返回類型推斷模板參數類型
- 14. 在Scala中可以匹配函數的返回類型嗎?
- 15. 模板模板從成員函數返回類型
- 16. C++返回模板函數
- 17. 模板參數類返回的函數調用類型
- 18. 我可以在返回子類類型
- 19. 我們可以從模板返回函數訪問已解析的參數嗎?
- 20. 推導其參數的返回類型函數返回類型
- 21. 函數可以在PHP中有多個返回值類型嗎?
- 22. XSLT 2.0函數可以返回任意類型嗎?
- 23. OpenCL內聯函數可以返回OpenCL類型嗎?
- 24. jQuery - show()函數可以返回true嗎?
- 25. VBScript函數可以返回字典嗎?
- 26. main()函數可以返回double嗎?
- 27. 函數中可以返回double *嗎?
- 28. JavaScript函數可以自行返回嗎?
- 29. 可以tr1 ::函數swallow返回值嗎?
- 30. STUFF函數可以返回NULL值嗎?
拋出異常將是合理的。 – Nbr44 2013-05-03 05:34:47
也許看看'std :: priority_queue'的靈感? – juanchopanza 2013-05-03 05:53:47