这个循环不断为我提供任何修复的分段错误
This loop keeps giving me segmentation faults any fixes?
循环的目的是通过同时比较的两个堆栈,并放入临时堆栈(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
.通过以这种方式更改顺序,如果一个(或两个(为空,您肯定不会在a
或b
上调用top
。
假设此链接 http://www.cplusplus.com/reference/stack/stack/top/中的信息是正确的,则表明top
对底层容器的调用back
,这肯定会导致某些(如果不是全部(容器在为空时出现未定义的行为。
相关文章:
- 类和构造函数中的函数根本不起作用,并且不返回任何错误
- 如果用户没有输入任何内容或输入错误,如何重新输入用户的输入?
- 我正在尝试一个傻瓜 C++ 练习,我遇到了一个错误,说类 'GraduateStudent' 没有任何名为 'advisor' 的字段
- 零四元数和任何向量都不为零的特征积,这是一个错误吗?
- 如何用 C 编译,但如果使用任何C++,则会抛出错误?
- 编译器没有显示错误,但我没有得到任何输出.怎么了?
- MSVC 错误:4 个重载中的任何一个都无法转换所有参数类型
- 我的代码中是否有任何类型的错误,因为它没有给出正确的输出
- 为什么当我没有变量或其他任何命名的东西时"no match for 'operator==' "错误?
- boost::p rogram_options 在指定意外的位置参数时不报告任何错误
- Antlr cpp 运行时 任何错误的指针转换?
- 哗啦��错误:无法识别任何一组可以驱动指定关节的控制器
- 函数和指针帮助:程序生成,但崩溃,没有任何特定错误
- 无法编译任何C++程序;错误:未知类型名称'uint8_t'
- 无法在vs2012中生成任何c++项目.错误LNK1327:rc.exe
- 声明不声明任何[-fpermission]错误
- 我的C++从文本文件读取的程序无法正常工作,但我没有看到任何代码错误?
- 在c++中使用同一个fstream对象进行读写时,是否有任何导致错误的特性
- 我没有任何编译错误,但我的代码不起作用。怎么了?
- 捕获 Segfault 或任何其他错误/异常/信号C++例如在 Java 中捕获异常