这个循环不断为我提供任何修复的分段错误

This loop keeps giving me segmentation faults any fixes?

本文关键字:任何修 错误 分段 循环      更新时间:2023-10-16

循环的目的是通过同时比较的两个堆栈,并放入临时堆栈(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 是要放置在 C 和 D 中的 A 和 B 内部项的值占位符。

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);
}

请注意测试的顺序。 如果任一容器为空,则代码将显示未定义的行为。测试的顺序很重要,因为如果第一个操作数的计算结果为 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();
}

没有模式代码很难说,但假设这些是std::stack对象,你可能想在调用它们之前检查它们是否为空top改变

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

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

top返回一个引用,但如果堆栈上没有任何内容,那么那将是什么引用?这将导致未定义的行为。 打电话检查空虚是没有意义的top.通过以这种方式更改顺序,如果一个(或两个(为空,您肯定不会在ab上调用top

假设此链接 http://www.cplusplus.com/reference/stack/stack/top/中的信息是正确的,则表明top对底层容器的调用back,这肯定会导致某些(如果不是全部(容器在为空时出现未定义的行为。

相关文章: