find()和距离()有多准确

时间:2015-02-06 05:19:44

标签: c++ vector function-templates

我想在返回迭代器位置时我读到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 - 是20最新的容器。

我想出了一个解决方案,但没有同时使用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()。非常感谢任何澄清。

1 个答案:

答案 0 :(得分:3)

std::distance是确切的。毫无疑问。

但你很可能误解了它的功能。你说它可能会回到“错误的位置”。无论如何它永远不会返回位置。迭代器是一个位置。

另外,您可能需要查看std::bitset<21>。当位数固定时更合适,并且它具有额外的辅助函数,例如.reset()