如果队列为空,取消排队应返回什么

What should dequeue return if the queue is empty

本文关键字:排队 返回 什么 取消 队列 如果      更新时间:2023-10-16

我正在用C++编写一个队列(我不应该使用 STL)。我的取消排队函数需要返回它从队列中删除的整数。但是,如果队列为空,它应该返回什么? 我应该抛出一个异常,如果是,是哪一个?或者我应该返回 null(但这不会令人困惑,因为它本质上是零并让它看起来像我返回 0)?

任何帮助将不胜感激。

抛出异常似乎是最合适的,因为用户应该始终知道队列中仍有元素,或者首先通过调用.empty()来检查它(假设您确实有这样的方法)。

对于您抛出异常的问题:std::logic_error对我来说似乎合适,请使用"what"字符串指向您的类的名称、调用的方法以及队列为空。

您有三个选择:

  • 有一个函数boost::optional<T> pull(),它在队列为空时返回boost::none
  • 抛出std::out_of_range或一些类似的异常。
  • 从空队列中以 UB 格式拉取文档(您通常不希望这样做)。

我喜欢第一个选项,因为它在类型级别明确表示值不存在,而第二个和第三个选项更多地在文档/合同级别,编译器不容易验证。

stackqueue 的标准版本拆分了访问下一个元素和删除它们的功能:

stack<int> s;
// put some stuff in s
int i = s.top; // gets the top element
s.pop(); // removes the element you just retrieved in the previous operation

这允许在空容器上调用pop()(并且不执行任何操作)。 top(或queuefrontback函数)依赖于基础容器(您可以指定),如果在空容器上调用它们,则通常具有未定义的行为。

因此,如果你想遵循标准的方法去做,你可以简单地说,在空容器上调用它是未定义的。 如果没有,你可以做任何你想做的事(也许是说出你前女友的电话号码?