我有下面的代码:
#include<iostream>
#include <vector>
using namespace std;
template<class T>
class Stack
{
private:
vector<T> stack;
public:
T Pop()
{
if (stack.size()!=0)
{
T temp;
temp=stack[stack.size()-1];
stack.erase(stack.begin()+stack.size()-1);
return temp;
}
else
//return nothing
^^^^^^^^^^^^^^^^
//How i can do above by code
}
Run Code Online (Sandbox Code Playgroud)
在pop功能中:我想要stack.size==0; 弹出功能什么都不返回
我怎么能这样做?
这基本上是如何处理非总函数函数的问题,这些函数不一定是针对所有可能的输入定义的.有很多方法可以解决它,但它们都不是类型安全的:
有用于检索和擦除堆栈的顶部元件,很像两个单独的功能std::stack::top()和std::stack::pop().
使用引用参数并返回bool指示是否返回了元素:
bool pop(T& value) {
if (stack.empty())
return false;
value = stack.back();
stack.pop_back();
return true;
}
Run Code Online (Sandbox Code Playgroud)
来电者可以写:
T value;
if (stack.pop(value)) {
use(value);
}
Run Code Online (Sandbox Code Playgroud)回来一个boost::optional<T>.
返回默认构造的T实例.这要求T是默认可构造的,这已经由某些std::vector成员函数强加.
抛出异常,记录违反前提条件.
保持弹出空堆栈的行为未定义.
我推荐#1,#2或#3,具体取决于偏好以及最适合周围代码的内容.