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

如果队列为空,则出列应返回什么 我正在用C++编写一个队列(我不应该使用STL)。我的dequeue函数需要返回它从队列中移除的整数。但是,如果队列为空,它应该返回什么?我应该抛出异常吗?如果是,是哪一个?或者我应该返回null(但这难道不会让人困惑,因为它本质上是零,并使它看起来像我返回了0),c++,queue,C++,Queue,非常感谢您的帮助。您有三种选择: 如果队列为空,则具有返回boost::none的函数 抛出或类似的异常 将文档从空队列中提取为UB(您通常不希望这样) 我喜欢第一个选项,因为它使它在类型级别上明确表示一个值不能存在,而第二个和第三个选项则更多地在文档/契约级别,这是编译器无法轻松验证的。抛出异常似乎最合适,因为用户应该总是知道队列中仍然有一个元素,或者首先调用.empty()(假设您有这样一个方法)来检查它 对于抛出什么异常的问题:对我来说似乎合适,使用“what”-字符串指向类的名称、调

非常感谢您的帮助。

您有三种选择:

  • 如果队列为空,则具有返回
    boost::none
    的函数
  • 抛出或类似的异常
  • 将文档从空队列中提取为UB(您通常不希望这样)

我喜欢第一个选项,因为它使它在类型级别上明确表示一个值不能存在,而第二个和第三个选项则更多地在文档/契约级别,这是编译器无法轻松验证的。

抛出异常似乎最合适,因为用户应该总是知道队列中仍然有一个元素,或者首先调用
.empty()
(假设您有这样一个方法)来检查它


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

标准版本的
stack
queue
拆分访问下一个元素并删除它们的功能:

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
stacks;
//把一些东西放进盒子里
int i=s.top;//获取顶部元素
s、 pop();//删除在上一操作中刚检索到的元素
这允许对空容器调用
pop()。
top
(或
队列的
front
back
函数)依赖于底层容器(您可以指定),如果在空容器上调用,这些容器通常具有未定义的行为


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

这取决于你自己!您可以与用户签订协议,只有在非空队列上才能进行排队,如果队列为空,则清除硬盘。通常称为
pop
:)@avakar IME
pop
pull
dequeue
都会出现。这是一个风格问题。如果boost不是一个选项,您也可以在
中使用
std::pair
。pair的第二个值决定第一个值是否有效。我认为
std::runtime\u error
更适合于无法预测和避免错误情况的情况;如果
.empty()
是避免错误的可靠方法,
std::logic\u error
似乎更合适。@DanielKO你说得对,谢谢。修复了答案,并添加了更多关于在异常消息中放置内容的提示。