【问题标题】:How do i fix this code so that it wont pop_back or back() if the vector/stack is empty?如果向量/堆栈为空,我如何修复此代码以使其不会 pop_back 或 back()?
【发布时间】:2014-07-30 15:08:26
【问题描述】:

我的 Stack.h 有问题,我不确定我缺少什么。我收到分段错误错误。我知道这与“void pop()”和“T top()”函数有关。我很确定这是由空堆栈引起的。只编辑这两个函数,如何确保我的程序能够运行?我的 .cpp 文件需要在 (!s2.empty) 检查之外添加 s2.pop。

【问题讨论】:

  • 对我来说听起来像是 X Y 问题。 “我的 .cpp 文件需要 s2.pop 在 (!s2.empty) 检查之外。” 为什么? 这没有意义,因为您在前一个循环中清空了堆栈。你总是在一个空的上执行它。
  • 如果您不再需要该问题,请将其删除。但不要只是编辑它,其他通过搜索或其他方式达到此目的的人只会感到不必要的困惑。

标签: c++ class stack


【解决方案1】:

答案是你应该真正删除最后的s2.pop()。在那里没有意义。

while (!s2.empty()) {
    cout << s2.top();
    s2.pop();
} // s2 is always empty by now, another pop() wouldn't make sense.
cout << endl;
s2.pop();

您可以将 pop() 函数更改为

void pop() {
    if (!empty())
        container.pop_back();
}

然后你的pop() 甚至可以在一个空的堆栈上工作,但你的top() 仍然会崩溃。你也不能那么容易地修复top(),这样你最终会得到不同的行为,这是令人困惑的,你不应该有。或者一些不直观的实现也很糟糕。

【讨论】:

  • 对。我确实弄清楚了 pop 函数的 if 语句,但是我不能那么容易地做 top() 。不过有办法。
  • @user3579810 是的,不是未定义的行为(可能是分段错误),您可以在异常为空时抛出异常并让调用者处理异常。 (在实际调用top 之前检查它是否为空比这容易得多。)您还可以返回一个pair&lt;bool, T&gt; 并带有bool 指示它是否实际工作,或者T 只是一些默认构造的虚拟值。或者返回一个布尔值并将 T 作为参考参数。他们都是丑陋的。你无缘无故地试图让它变得困难。
【解决方案2】:

删除最后一行s2.pop();。当你到达那里时,堆栈已经为空,因为堆栈为空是上面循环的退出条件。

【讨论】:

  • 我的问题在头文件中,因为 s2.pop();必须留下。我试图弄清楚如何在这种情况下避免分段错误。
  • @user3579810 你不需要。在调用 pop 之前检查堆栈是否为空是调用者的责任。
  • 我可以通过删除最后一行让它运行,它会工作,但是我想找到一种简单的方法来编辑我在头文件中的函数以绕过这个问题并让它打印不管。没有办法吗?了解这是为了提高我的知识。
  • @user3579810 您的问题在当前形式下没有意义,或者您正在尝试做一些您确实不应该做的事情。
  • @user3579810:如果容器已经是空的,你可以让pop 成为空操作。
猜你喜欢
  • 2019-10-06
  • 2021-06-19
  • 1970-01-01
  • 2017-01-11
  • 2021-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多