如果队列为空,取消排队应返回什么
What should dequeue return if the queue is empty
我正在用C++编写一个队列(我不应该使用 STL)。我的取消排队函数需要返回它从队列中删除的整数。但是,如果队列为空,它应该返回什么? 我应该抛出一个异常,如果是,是哪一个?或者我应该返回 null(但这不会令人困惑,因为它本质上是零并让它看起来像我返回 0)?
任何帮助将不胜感激。
抛出异常似乎是最合适的,因为用户应该始终知道队列中仍有元素,或者首先通过调用.empty()
来检查它(假设您确实有这样的方法)。
对于您抛出的异常的问题:std::logic_error
对我来说似乎合适,请使用"what"字符串指向您的类的名称、调用的方法以及队列为空。
您有三个选择:
- 有一个函数
boost::optional<T> pull()
,它在队列为空时返回boost::none
。 - 抛出
std::out_of_range
或一些类似的异常。 - 从空队列中以 UB 格式拉取文档(您通常不希望这样做)。
我喜欢第一个选项,因为它在类型级别明确表示值不存在,而第二个和第三个选项更多地在文档/合同级别,编译器不容易验证。
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
这允许在空容器上调用pop()
(并且不执行任何操作)。 top
(或queue
的front
和back
函数)依赖于基础容器(您可以指定),如果在空容器上调用它们,则通常具有未定义的行为。
因此,如果你想遵循标准的方法去做,你可以简单地说,在空容器上调用它是未定义的。 如果没有,你可以做任何你想做的事(也许是说出你前女友的电话号码?
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何获取std::result_of函数的返回类型
- QueryWorkingSet总是返回false
- (C++)分析树以计算返回错误值的简单算术表达式
- 访问者访问变体并返回不同类型时出错
- 如何返回一个类的两个对象相加的结果
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- lower_bound()返回最后一个元素
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何取消对nullptr的屏蔽,返回正确的对象
- 奇怪的结构&GCC&clang(void*返回类型)
- 架构决策:返回std::future还是提供回调
- 从python中调用C++函数并获取返回值
- 矩阵向量乘法(cublasDgemv)返回零
- 如果队列为空,取消排队应返回什么