繁体   English   中英

C ++矢量迭代器不兼容

[英]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;
}

好吧,您是否尝试过使用调试器 如果是这样,您找到了什么? 如果不是,那么这不完全是“为我调试代码”网站。

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

但是,一个形式上的错误是相当明显的。 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() params.input只有5元素时,这正是使您的set数组增大到6

然后,稍后在getPathSummary ,对索引值从0sets.size() - 1input数组进行迭代。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM