向量下标超出范围错误使用三个向量,如何知道哪一个是迭代错误 P>嗨,我尝试在C++框架内实现算法。我有一个类,我定义了两个向量,称为walkers和fixed,分别包含死粒子和活粒子/移动粒子和不移动粒子。我的更新功能如下所示: void DLA::update() { // Permutation buffer vector<int> buffer; for (std::size_t i = 0; i != walkers.size(); ++i) // go through every main/alive particles { walkers[i].update(); for (std::size_t j = 0; j != fixed.size(); ++j) // go through every fixed/dead particles { float distance = walkers[i].position.distance(fixed[j].position); // calculate the distance between them if (distance < 5) // if the distance is small enough { buffer.push_back(i); // put the index of the alvie walker in buffer for deletion } } } // Apply buffered information for (std::size_t i = buffer.size(); i != 0; --i) { walkers[buffer[i]].randomWalk = 0; // make it dead fixed.push_back(walkers[buffer[i]]); // put it in the fixed/dead vector walkers.erase(walkers.begin() + buffer[i]); // take it out from the main alive vector } buffer.clear();

向量下标超出范围错误使用三个向量,如何知道哪一个是迭代错误 P>嗨,我尝试在C++框架内实现算法。我有一个类,我定义了两个向量,称为walkers和fixed,分别包含死粒子和活粒子/移动粒子和不移动粒子。我的更新功能如下所示: void DLA::update() { // Permutation buffer vector<int> buffer; for (std::size_t i = 0; i != walkers.size(); ++i) // go through every main/alive particles { walkers[i].update(); for (std::size_t j = 0; j != fixed.size(); ++j) // go through every fixed/dead particles { float distance = walkers[i].position.distance(fixed[j].position); // calculate the distance between them if (distance < 5) // if the distance is small enough { buffer.push_back(i); // put the index of the alvie walker in buffer for deletion } } } // Apply buffered information for (std::size_t i = buffer.size(); i != 0; --i) { walkers[buffer[i]].randomWalk = 0; // make it dead fixed.push_back(walkers[buffer[i]]); // put it in the fixed/dead vector walkers.erase(walkers.begin() + buffer[i]); // take it out from the main alive vector } buffer.clear();,c++,loops,vector,openframeworks,C++,Loops,Vector,Openframeworks,} 但是每次我运行这个,我都会得到一个向量下标超出范围的错误。不熟悉C++和VisualStudio,也不习惯于框架,我很难读取错误的来源,因为我找不到我在写的脚本中的问题是从哪里来的。编译器将我发送到属于基本openframeworks类代码的另一页代码,说明在其中检测到的错误 我已经开始进入调试模式,但从那里我看到的是我的RandomWalker数组的原始值 我的代码有什么问题,如何根据VisualStudio提供的信息清楚地诊断?谢谢 编辑: 修正了它,没有使用缓冲区,只是以相反的顺序运行

}

但是每次我运行这个,我都会得到一个向量下标超出范围的错误。不熟悉C++和VisualStudio,也不习惯于框架,我很难读取错误的来源,因为我找不到我在写的脚本中的问题是从哪里来的。编译器将我发送到属于基本openframeworks类代码的另一页代码,说明在其中检测到的错误

我已经开始进入调试模式,但从那里我看到的是我的RandomWalker数组的原始值

我的代码有什么问题,如何根据VisualStudio提供的信息清楚地诊断?谢谢

编辑:

修正了它,没有使用缓冲区,只是以相反的顺序运行两个向量

for (std::size_t i = walkers.size() - 1; i != -1; --i)
{
    for (std::size_t j = fixed.size() - 1; j != -1; --j) // go through every fixed/dead particles
    {
        // Calculate Distance
        float distance = walkers[i].position.distance(fixed[j].position); 

        if (distance < (walkers[i].radius + fixed[j].radius)) // if the distance is small enough
        {
            walkers[i].randomWalk = 0; // make it dead
            fixed.push_back(walkers[i]); // put it in the fixed/dead vector
            walkers.erase(walkers.begin() + i); // take it out from the main alive vector
            break;
        }
    }
}
就是这个循环

// Apply buffered information
for (std::size_t i = 0; i != buffer.size(); ++i)
{
    walkers[i].randomWalk = 0; // make it dead
    fixed.push_back(walkers[i]); // put it in the fixed/dead vector
    walkers.erase(walkers.begin() + i); // take it out from the main alive vector
}
当您在Walker上循环时,您正在从Walker前面移除元素,并通过buffer.size对其进行限制


是否要使用缓冲区中的索引?

您知道调用堆栈是什么吗?旁白:对于auto&walker:walker和auto&fix:Fixed,请查看最后一个for循环。循环变量i增加,而walker中的条目数减少。看到可能发生的任何错误了吗?你完全正确,我感到困惑,在我的最后一个for循环中,我用buffer[I]替换了所有I实例,但是我得到了相同的错误。这次我不应该在我正在修改的向量上循环though@Asymetr如果要删除第一个元素和第六个元素,那么按哪个顺序执行很重要。如果在索引5之前删除索引0,则位于5的元素现在位于4。我正在尝试使用std::size\u t I=buffer.size反向遍历缓冲区以解决此问题;我!=0; -我在for循环中,但它似乎不起作用,您可以使用std::set buffer;相反,它是唯一的,并且是按降序排列的