2015-02-06 2 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이므로 가장 최근 컨테이너 인 20이므로 충돌이 발생합니다. 그렇지 않으면 반환, 내가 나에게 특정 상태가 호출 인덱스 번호를 반환하는 함수를 만든 컨트롤러 클래스에서

int FamiliesController::returnInfoBoxState(){ 

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

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

     return i; 
    } 
} 

return -1; 

} 

:

나는 어느 find()distance()를 사용하지 않고 해결책을했다 -1. 동일한 if 문을 사용하여 정상적으로 작동했습니다.

나는 find()distance()에 대해 궁금합니다. 모든 설명은 크게 감사드립니다.

+0

과 같은 추가 도우미 기능을 가지고 있습니다. std :: distance()는 "까다롭게"하지 않습니다. 아마도 당신은 우리에게 보여주지 않은 코드에서 뭔가 잘못하고있는 것입니다 (예를 들어'l '의 선언 된 타입이 무엇인지, 그런데 그것은'1 '처럼 보이기 때문에 끔찍한 변수 이름입니다). 문제를 보여주는 완전한 작업 프로그램을 게시하면 도움이됩니다. –

+0

@JohnZwinck 나는 그것이 사실이라고 확신한다. 내 응용 프로그램이 커지고 사물을 추적하기가 어렵습니다. 그래서 전체 문제를 보여주는 무언가를 게시하는 것이 어렵습니다. – mauricioSanchez

답변

3

std::distance은 정확합니다. 의심의 여지가 없습니다.

당신은 그 기능을 오해 할 가능성이 가장 높습니다. 당신은 그것이 "잘못된 위치"를 반환 할 수 있다고 말했다. 어쨌든 위치를 반환하지 않습니다. 반복자는 위치입니다.

또한 std::bitset<21>을 확인하십시오. 비트 수가 고정되어있을 때 더 적합하며

+0

설명해 주셔서 감사합니다. 'std :: bitset <>'의 유일한 문제는 그것이 동적이 아니며 때로는 수 또는 입자가 변경된다는 것입니다. 나는 또한 다음과 같은 것을 할 수있을 때까지 실제 인덱스 번호가 아닌 포인터 객체의 반복자를 생각했다 :'int number = it - isParticleHovered.begin()' – mauricioSanchez

관련 문제