2015-02-06 54 views
0

我认为我在某处读取distance()时返回的迭代器位置可能会很挑剔。有时它不会返回正确的位置。我想知道这是否属实,或者我没有正确使用它。find()和distance()的精确程度如何?

我试图找出21向量中的某个粒子是否被徘徊。这个想法是一旦徘徊就改变别人的状态。

我使用find()来知道粒子何时悬空,因此属实。

vector<bool>::iterator it; 
it = find(_tmp->isParticleHovered.begin(), _tmp->isParticleHovered.end(), true); 
if (it != _tmp->isParticleHovered.end()){// we look if a particle is being hovered. 

    isHovered = true;// we use this to check internally the first boid 

    }else{   

     isHovered = false; 

    } 

现在我也想不仅知道什么时候有人徘徊,但其中一人徘徊,所以我说这一点:

vector<bool>::iterator it; 
it = find(_tmp->isParticleHovered.begin(), _tmp->isParticleHovered.end(), true); 
if (it != _tmp->isParticleHovered.end()){// we look if a particle is being hovered. 

    l = distance(_tmp->isParticleHovered.begin(), it); 
    isHovered = true;// we use this to check internally the first boid 

    }else{   

     isHovered = false; 
    l = -1; 
    } 

因此,了解指数,我想切换他人的状态所以我想出了以下情况:

if (l == -1){ 

    if (boidState5){ 

    resetFamilyBoidState(_tmp);// makes all the particles go back to the same state 
    boidState2 = true; 
    boidState5 = false; 

} 

}else if (l != -1){ 

if (boidState2){ 

    makeBoidStateless(_tmp, l);// I pass L, to this function, tell the function to switch all the particles to a different state except the one that is being hovered. 
    boidState5 = true; 
    boidState2 = false; 
} 

}

它将为几次工作但是当我将从粒子快速悬停到粒子时,它会变得混乱,有时l将返回21,这将使粒子矢量大小为21,从而导致它崩溃 - 是最新的容器。

我想出了一个解决方案,而无需使用既不find()也不distance()

int FamiliesController::returnInfoBoxState(){ 

for (int i = 0; i < boidList.size(); i++){ 

    if (boidList[i]->boidState == 2){ 

     return i; 
    } 
} 

return -1; 

} 

在我创建了一个将返回我,当该特定状态被称为指数函数控制器类,否则它会返回-1。使用相同的if语句,它工作正常。

我很想找到关于find()distance()的信息。任何澄清非常感谢。

+0

'std :: distance()'不是“finicky”。也许你在代码中做错了你没有向我们展示的东西(例如,'l'的声明类型是什么,顺便说一下,它是一个可怕的变量名,因为它看起来像'1')。如果您发布完整的演示该问题的工作程序,这将会很有帮助。 – 2015-02-06 05:39:40

+0

@JohnZwinck我相当确定的是这种情况。我的应用程序变得越来越大,很难跟踪事情。这就是为什么我很难发布能够证明整个问题的东西。 – mauricioSanchez 2015-02-06 16:10:52

回答

3

std::distance是确切的。没有任何怀疑的余地。尽管如此,你很可能会误解它的功能。你说它可能会返回“错误的位置”。无论如何它永远不会返回位置。迭代器是一个位置。您也可以检查std::bitset<21>。当位数固定时它更合适,并且它有额外的辅助函数,如.reset()

+0

感谢您澄清。 'std :: bitset <>'唯一的问题是不是动态的,有时候数字或粒子会改变。我也想到了一个更多的指针对象而不是实际的索引号的迭代器,直到我意识到我可以这样做:'int number = it - isParticleHovered.begin()' – mauricioSanchez 2015-02-06 16:13:53