2010-08-10 3 views
1

최근에 주로 C++로 작성된 프로젝트를 상속 했으므로 이번이 처음입니다. 벡터의 요소가 벡터의 begin()end()에 묶여있는 루프 내에서 벡터의 요소를 지우는 데 문제가 있을지 궁금합니다.루프 경계 무효화

은 여기 (기본적으로) 내가 어떻게 노력했는지 :

for (vector<double>::iterator i = distance.begin(); i < distance.end(); i++) { 
    for (vector<double>::iterator j = i + 1; j < distance.end(); j++) { 

     /* code to assemble *i, *j, and some other values, say *x & *y 
     (also iterators) assumed to be in the distance vector */ 

     vector< vector<double >::iterator remove; 
     remove.push_back(i); remove.push_back(j); 
     remove.push_back(x); remove.push_back(y); 

     sort(remove.begin(), remove.end()); 

     for (int r = remove.size() - 1; r >= 0; r--) { 
      distance.erase(remove.at(r)); 
     } 
    } 
} 

나는 그것을 테스트하고있어,이 작업이 나타납니다. 그러나, 나는 우연 때문에 우연한 일이며,이 해결책은 사용되어서는 안된다. distance.end()은 각 루프의 시작 부분에서 리셋 되나요? 아니면 C++이 초기 값으로 확인하나요?

+0

반복자를 비교할 때 <를 사용하지 마십시오. 루프의 반복자를 비교하려면! =을 사용하십시오. –

답변

1

for-loop는 각 루프에서 i < distance.end()을 평가합니다. 문제가 distance.erase 인 경우 i이 무효화되므로 i++의 결과는 정의되지 않습니다.

0

distance.end()은 항상 벡터의 현재 상태에 대해 정확합니다.

루프는 항상 모든 루프에서 조건을 재평가합니다.