C ++ Vector迭代器不兼容

时间:2012-12-25 23:42:53

标签: c++ vector

我运行程序时遇到问题。有例外"矢量迭代器不兼容"代码的这一部分backtrack(params, set, results);

完整代码你可以在这个链接上看到http://liveworkspace.org/code/MjgyND $ 7

p.s>在XCode的MacOS上一切正常,但在VS 2012(Win7)上我有这个错误..

p.s>在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;
}

2 个答案:

答案 0 :(得分:1)

嗯,您是否尝试使用调试器?如果是这样,你发现了什么?如果没有,那么这不是“为我调试我的代码”网站。

无论如何,如果没有应用领域的额外知识,很难弄清楚你的代码在做什么。调试非常麻烦,因为你按价值传递了很多容器。

然而,一个正式错误是相当明显的。您的rightfirst函数会将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数组,其索引值从0sets.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]

越界访问尝试将在标准库的不同调试实现中产生不同的运行时错误。在你的情况下,它恰好是“不兼容的迭代器”。

P.S。停止按值传递繁重的数据结构。使用参考。

答案 1 :(得分:0)

如果类btNode在另一个DLL中定义并且模板std :: vector在该DLL中被取消,则可能存在不兼容性,具体取决于用于构建代码的标准库的版本以及用于构建外部的标准库的版本DLL。

但在你的情况下,一切似乎都存在于同一个文件中