向量下标超出范围错误,使用三个向量,怎么知道哪个向量迭代错了?

问题描述 投票:0回答:1

嗨,我正试图实现 扩散有限聚合 在openframeworks里面用c++实现了一个算法,我有一个类,在这个类里面我定义了两个向量,分别叫做walkers和fixed,分别包含死的和活的移动和不动的粒子。我有一个类,在这个类中,我定义了两个向量,分别叫做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++和visual studio,也不习惯依赖框架,我很难读懂错误来自哪里,因为我找不到我写的脚本中,问题起源于哪里。编译器给我发送了另一个页面的代码,属于基础openframeworks类代码,说是在那里检测到的错误。

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

我的代码有什么问题,我怎样才能从Visual Studio给我的信息中清楚地看出问题呢? 谢谢!

编辑:

在不使用缓冲区的情况下固定了它,只是以相反的顺序运行两个向量。

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;
        }
    }
}
c++ loops vector openframeworks
1个回答
1
投票

就是这个循环

// 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
}

您正在从前面的 walkers 当你在它上面循环的时候,你会通过 buffer.size()

你的意思是要使用 buffer?

© www.soinside.com 2019 - 2024. All rights reserved.