[英]C++ Vector iterators incompatible
嗨,我在运行程序时遇到问题。 代码backtrack(params, set, results);
这一部分有异常“ Vector迭代器不兼容” backtrack(params, set, results);
您可以在此链接上看到完整的代码http://liveworkspace.org/code/MjgyND $ 7
ps>在XCode的MacOS上一切正常,但是在VS 2012(Win7)上我遇到此错误。
ps>在liveworkspace上工作正常。 可能需要修改编译器设置吗?
int backtrack(btIData params, std::vector<float> set, std::vector<btNode> &results)
{
if (reject(params, set)) {
return 0;
} else {
accept(params, set, results);
}
set = first(params,set);
while( (set.size() != 0) || reject(params, set)) {
backtrack(params, set, results);
set = right(params,set);
}
return 0;
}
好吧,您是否尝试过使用调试器 ? 如果是这样,您找到了什么? 如果不是,那么这不完全是“为我调试代码”网站。
无论如何,如果没有应用程序领域的额外知识,就很难弄清楚代码在做什么。 而且调试非常麻烦,因为您按值传递了许多容器。
但是,一个形式上的错误是相当明显的。 您right
和first
功能将成长set
阵列(从backtrack
)比规模更大的大小params.input
阵列。 例如,如果您的params.input
数组的大小为5
(如测试代码中一样),则您set
数组将增长为6
。
这两个函数中的这种情况显然应该限制set
数组的增长
int l = (int) candiates.size(); // `candiates` is `set`
if (l > params.input.size())
// Don't grow array
else
// Grow array
但是由于某种原因,您使用了严格的比较l > params.input.size()
而不是非严格的l >= params.input.size()
。 当params.input
只有5
元素时,这正是使您的set
数组增大到6
。
然后,稍后在getPathSummary
,对索引值从0
到sets.size() - 1
的input
数组进行迭代。
float getPathSummary(btIData params, std::vector<float> sets)
{
float summary = 0;
for (int i =0; i < sets.size(); i++) {
summary += params.input[i] * sets[i];
}
return summary;
}
这会导致索引超出范围并导致程序崩溃。 也就是说,您尝试访问不存在的params.input[5]
。
越界访问尝试将在标准库的不同调试实现中产生不同的运行时错误。 在您的情况下,它恰好与“不兼容的迭代器”有关。
PS停止按值传递繁重的数据结构。 使用参考。
如果在另一个DLL中定义了btNode类,并且该DLL中隐含了模板std :: vector,则可能不兼容,具体取决于用于构建代码的标准库的版本和用于构建外部DLL的标准库的版本。
但是在您的情况下,所有内容似乎都驻留在同一文件中
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.