我正在构建优先级que,并尝试将其设为模板类。当我弹出时,它必须返回类型T.有没有办法返回任何东西或一个好的做法,以避免在崩溃中没有任何东西崩溃?
答案 0 :(得分:4)
此处的预期行为是抛出异常。在尝试弹出之前,用户应检查队列是否为空。您也可以返回null,但前提是您的类型T的值永远不会为null,否则如果因为发生错误或者队列中的下一个值为null而返回它是不明确的。
答案 1 :(得分:1)
模板与问题无关。
有几种常见的方法来处理这种情况:
pop
定义为有效。因此,用户需要在调用pop
(需要提供isEmpty
功能)之前执行空白检查。如果不满足此前提条件,则异常/错误返回是有效的处理。答案 2 :(得分:0)
一般来说,pop
操作应该not返回一个值。那是因为返回类型的拷贝构造函数可能抛出异常;如果发生这种情况,该值将从队列中消失,并且未在任何地方复制,因此它已经消失了。
相反,应该有两个操作:一个top
函数返回对数据结构顶部对象的引用,一个pop
函数删除顶部元素但不什么都归还如果您查看std::queue
,您会看到成员void pop()
和reference front()
,它们会返回对顶部元素的引用。
现在回答你的问题。 <g>
弹出空队列是一个错误。在标准库中,它会产生未定义的行为。如果要添加用于错误检查的代码,则应该抛出异常或中止程序。我倾向于后者;如果调用代码尚未确定存在要弹出的元素,则可能尚未编写以强制处理异常。另一方面,在GUI中,可能抛出终止当前操作的异常;这将使应用程序继续运行并等待下一个用户请求。