Vector迭代器不兼容

C++ Vector iterators incompatible

本文关键字:不兼容 迭代器 Vector      更新时间:2023-10-16

嗨,我在运行程序时有问题。在代码backtrack(params, set, results);

的这部分有异常"Vector iterators incompatible"

完整的代码你可以看到在这个链接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;
}

你试过使用调试器吗?如果有,你发现了什么?如果没有,那么这不是一个真正的"调试我的代码"的网站。

无论如何,如果没有应用领域的额外知识,很难弄清楚代码在做什么。而且调试起来相当麻烦,因为你要按值传递很多容器。

然而,有一个形式错误是相当明显的。您的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]

越界访问尝试在标准库的不同调试实现中会产生不同的运行时错误。在你的例子中,它恰好是关于"不兼容的迭代器"。

注:停止按值传递繁重的数据结构。使用引用。

如果类btNode在另一个DLL中定义,并且模板std::vector在该DLL中被实例化,则根据用于构建代码的标准库的版本和用于构建外部DLL的标准库的版本,您可能会遇到不兼容问题。

但是在你的情况下,所有的东西似乎都在同一个文件