gpt4 book ai didi

C++ vector 迭代器不兼容

转载 作者:太空宇宙 更新时间:2023-11-04 12:01:12 24 4
gpt4 key购买 nike

您好,我在运行我的程序时遇到了问题。这部分代码有异常“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;
}

最佳答案

那么,您尝试使用调试器了吗?如果有,你发现了什么?如果不是,那么这不完全是一个“为我调试我的代码”的网站。

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

但是,一个形式错误是相当明显的。您的 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 中迭代 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;
}

这会导致索引超出范围并导致程序崩溃。 IE。您尝试访问不存在的 params.input[5]

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

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

关于C++ vector 迭代器不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14034760/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com