[英]This loop keeps giving me segmentation faults any fixes?
循环的目的是同时比较两个要比较的堆栈,并在弹出其余堆栈时将它们放入临时堆栈(c和d),但这给我带来了分段错误。 我仍在学习c ++,segfaults是我最大的问题。
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,则不会对其进行评估。
编辑:
我对循环中的拷贝数感到不安(是的,我也很内looking地寻找过早优化程序的方法:-))。
根据堆栈中有多少个匹配项,您可能会获得更好的性能(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
之后,没有任何检查是否为空的步骤。 通过以这种方式更改顺序,可以确定如果一个(或两个)为空,则不要在a
或b
上调用top
。
假设此链接http://www.cplusplus.com/reference/stack/stack/top/中的信息是正确的,则表明top
back
了基础容器,这肯定会导致某些行为的不确定( (如果不是全部)容器,则它们为空。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.