0

我正在构建一个优先队列,并试图使其成为一个模板类。当我弹出时,它必须返回类型 T。如果队列中没有任何内容,是否有办法不返回任何内容或避免崩溃的好习惯?

4

3 回答 3

4

The expected behavior here would be to throw an exception. The user should check the queue for being empty before trying to pop. You could return null as well, but only if your type T never has a value of null, otherwise it is ambiguous if this is being returned because an error happened or because the next value in the queue was null.

于 2013-05-03T05:35:08.787 回答
1

模板与问题无关。

有几种常见的方法来处理这种情况:

  1. 将对象存储在堆上。删除后,将对象从数据结构中分离出来,并返回对它的引用(指针)而不是对象本身。如果数据结构为空,则返回 NULL。
  2. pop仅当队列不为空时才将您定义为有效。因此,用户需要在调用之前执行空性检查pop(需要提供isEmpty功能)。如果不满足此前提条件,则异常/错误返回是一种有效的处理方式。
于 2013-05-03T05:39:50.690 回答
0

一般来说,一个pop操作不应该返回一个值。这是因为返回类型的复制构造函数可能会抛出异常;如果发生这种情况,该值将从队列中消失并且没有被复制到任何地方,所以它只是消失了。

相反,应该有两个操作:一个top返回对数据结构顶部对象的引用的pop函数,以及一个删除顶部元素但不返回任何内容的函数。如果您查看,std::queue您会看到成员void pop()reference front()返回对顶部元素的引用。

现在来回答你的问题。<g>弹出一个空队列是一个错误。在标准库中,它会产生未定义的行为。如果要添加用于错误检查的代码,则应抛出异常或中止程序。我倾向于后者;如果调用代码尚未确定有要弹出的元素,则可能尚未编写它来可靠地处理异常。另一方面,在 GUI 中,抛出异常终止当前操作可能是合适的;这将使应用程序运行并等待下一个用户请求。

于 2013-05-03T11:41:33.867 回答