我正在用C++编写一个队列(我不应该使用STL)。我的出队函数需要返回从我的队列中删除的整数。但是,如果队列为空,它应该返回什么?我应该抛出一个异常,如果是的话,哪一个?或者我应该返回null(但不能混淆因为它基本上为零,并使它看起来像我返回0)?如果队列为空,应该返回什么队列?
任何帮助将不胜感激。
我正在用C++编写一个队列(我不应该使用STL)。我的出队函数需要返回从我的队列中删除的整数。但是,如果队列为空,它应该返回什么?我应该抛出一个异常,如果是的话,哪一个?或者我应该返回null(但不能混淆因为它基本上为零,并使它看起来像我返回0)?如果队列为空,应该返回什么队列?
任何帮助将不胜感激。
你有三个选择:
boost::optional<T> pull()
当且仅当队列为空返回boost::none
。std::out_of_range
或一些类似的例外。我喜欢的第一选择,因为它使得有明确的在型水平,一个值可以是不存在,而第二和第三选项是更在文档/收缩水平,不能用很容易被编译器验证。
抛出一个异常似乎是最合适的,因为用户应该总是知道队列中还有一个元素,或者通过调用.empty()
(假设你有这种方法)来检查它。
对于你扔什么异常问题:std::logic_error
似乎是适当的我,用“什么” -string指向你的类的名字,叫做方法和队列是空的。
我认为'std :: runtime_error'更适用于无法预测和避免错误情况的场合;如果'.empty()'是避免错误的可靠方法,'std :: logic_error'似乎更合适。 – DanielKO
@DanielKO你是对的,谢谢。修正了答案,并添加了一些关于在异常消息中放置什么的提示。 –
的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()
一个空的容器被称为(什么都不做)。对于queue
,top
(或front
和back
函数)依赖于底层容器(您可以指定),如果在空容器上调用它们,通常会有未定义的行为。
所以,如果你想遵循标准的方法来做到这一点,你可以简单地说,它是未定义的,以在空容器上调用它。如果没有,你可以做任何你想做的事(把你的前女友的电话号码给出,也许?)。
这取决于你!您可以与用户签订一份合同,该合同只能在非空队列上完成,并在队列为空时擦除硬盘。 –