这个循环一直给我分段错误任何修复?

时间:2015-10-26 09:17:30

标签: c++

循环的目的是通过两个同时进行比较的堆栈,并放入临时堆栈(c和d),同时弹出其余堆栈,但这会给我分段错误。我还在学习c ++,而段错误是我最大的问题。

    while((a.top()==b.top())&&(!a.empty())&&(!b.empty())){
        e=a.top();
        f=b.top();
        a.pop();
        b.pop();
        c.push(e);
        d.push(f);
    }

编辑:a和b是两个先前已定义并将相互比较的堆栈。

c和d是临时堆栈,它们会在弹出时保存a和b的数据,

e和f是a和b中项目放置在c和d中的值占位符。

2 个答案:

答案 0 :(得分:2)

while(!(a.empty() || b.empty())
      && (a.top() == b.top()))
{
        e=a.top();
        f=b.top();
        a.pop();
        b.pop();
        c.push(e);
        d.push(f);
}

记下测试的顺序。如果任一容器为空,您的代码将显示未定义的行为。测试的顺序很重要,因为对&&amp ;;的第二个操作数的评估。如果第一个评估为false,则不会被评估。

编辑:

我对循环中的副本数量感到有点困扰(是的,我也想找到过早优化程序的方法:-))。

根据您的堆栈中匹配项的数量,您可能会获得更好的性能(c ++ 11或更高版本):

while(!(a.empty() || b.empty())
      && (a.top() == b.top()))
{
    c.push(std::move(a.top()));  // move the top item of a to the top of c
    a.pop();                     // destroy the shrivelled husk of what used to be 
                                 // at the top of a.

    d.push(std::move(b.top()));
    b.pop();
}

答案 1 :(得分:1)

很难说没有模式代码,但假设这些是std::stack个对象,您可能需要检查它们是否为空之前在它们上面调用top 变化

 while((a.top()==b.top())&&(!a.empty())&&(!b.empty())){

while((!a.empty())&&(!b.empty())&&(a.top()==b.top())){

top返回一个引用,但如果堆栈上什么都没有,那么那将是什么?这将导致未定义的行为。 强调top之后,没有必要检查空虚。通过这种方式更改订单,如果其中一个(或两个)为空,您肯定不会在topa上调用b

假设此链接http://www.cplusplus.com/reference/stack/stack/top/中的信息是正确的,那么它表明top在底层容器上调用back,这肯定会导致一些未定义的行为(如果不是所有的容器都是空的。