Vector迭代器不兼容
C++ Vector iterators incompatible
嗨,我在运行程序时有问题。在代码backtrack(params, set, results);
完整的代码你可以看到在这个链接http://liveworkspace.org/code/MjgyND$7
p。s>在MacOS上的XCode都工作正常,但在VS 2012 (Win7)我有这个错误…
p。在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()
。这正是允许set
数组增长到6
大小的原因,而params.input
只有5
个元素。
然后在getPathSummary
中,你迭代input
数组,索引值从0
到sets.size() - 1
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]
。
越界访问尝试在标准库的不同调试实现中会产生不同的运行时错误。在你的例子中,它恰好是关于"不兼容的迭代器"。
注:停止按值传递繁重的数据结构。使用引用。
如果类btNode在另一个DLL中定义,并且模板std::vector在该DLL中被实例化,则根据用于构建代码的标准库的版本和用于构建外部DLL的标准库的版本,您可能会遇到不兼容问题。
但是在你的情况下,所有的东西似乎都在同一个文件
- 不明白迭代器,引用和指针失效,一个例子
- 自定义 STL 兼容迭代器,用于迭代 2D 数组类的列
- 为什么某些 STL 容器(堆栈、队列、优先级队列)不支持迭代器?
- 为什么 min_element() 返回最小元素的索引,而不是迭代器?
- 我从 std::set 得到const_iterator而不是迭代器
- 为什么向量的.at()成员函数返回引用而不是迭代器
- 如果我有一个指向矢量元素的指针,而不是迭代器,如何删除它?
- 对于使用 C 样式指针矢量化的循环,但不使用迭代器
- 使用循环(而不是迭代器)从向量中删除指针
- 将指针而不是迭代器传递到std ::复制
- 如何在不使用迭代器的情况下在 C++ 中打印地图
- C++模板不接受迭代器
- 容器不可知迭代器参数
- 为什么 void* 不是迭代器类型?
- 如何在不使用迭代器的情况下访问任何向量的第 i 个元素
- 为什么在达到容量后在向量中插入时,C++不处理迭代器?
- 我可以用cout而不是迭代器循环打印STL映射吗?
- 为什么 std::bitset 不附带迭代器?
- 字符串::擦除不接受迭代器?
- 是否有一个标准容器允许在不使迭代器无效的情况下插入元素