我正在構建一個優先級隊列,並試圖使其成爲一個模板類。當我彈出時,它必須返回類型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. 構造函數可以返回java中的數據類型嗎?
- 8. 模板參數類返回的函數調用類型
- 9. 我可以在返回子類類型
- 10. 推導其參數的返回類型函數返回類型
- 11. 我們可以從模板返回函數訪問已解析的參數嗎?
- 12. OpenCL內聯函數可以返回OpenCL類型嗎?
- 13. XSLT 2.0函數可以返回任意類型嗎?
- 14. 函數可以在PHP中有多個返回值類型嗎?
- 15. 返回函數的函數的返回類型
- 16. main()函數可以返回double嗎?
- 17. STUFF函數可以返回NULL值嗎?
- 18. 函數中可以返回double *嗎?
- 19. VBScript函數可以返回字典嗎?
- 20. jQuery - show()函數可以返回true嗎?
- 21. 使用模板從函數返回不同的數據類型
- 22. 函數返回類型decission
- 23. Infere函數返回類型
- 24. typedefing函數返回類型
- 25. 讓函數返回類型
- 26. 避免特殊情況下`void`返回類型函
- 27. 返回類型的回調函數
- 28. 返回類型模板類未知
- 29. 獲取/推導返回值的模板函數中的類型
- 30. 推導模板的返回類型的操作符/函數
拋出異常將是合理的。 – Nbr44 2013-05-03 05:34:47
也許看看'std :: priority_queue'的靈感? – juanchopanza 2013-05-03 05:53:47