std::vector<A_Star_Node> v_selective;//가능성을 선택하기위한 자료구조
std::vector<A_Star_Node>::iterator v_selective_pos;
//이 함수는 여러가능성이 들어있는 노드들의 모임안에서 규칙위반인것을 찾아서 삭제하는 함수이다.
for(v_selective_pos = v_selective.begin() ; v_selective_pos != v_selective.end(); ++v_selective_pos)
{
if(detect_violation(v_selective_pos->s1.val, v_selective_pos->s1.size()) == true ||
detect_violation(v_selective_pos->s2.val, v_selective_pos->s2.size()) == true ||
detect_violation(v_selective_pos->s3.val, v_selective_pos->s3.size()) == true)
{
std::vector<A_Star_Node>::iterator temp;
temp = v_selective_pos;
v_selective_pos = v_selective.erase(v_selective_pos);
if(v_selective_pos == v_selective.end())
v_selective_pos = temp;
}
}
if 문 안에서 해당 노드를 삭제 할 경우 v_selective.erase(v_selective_pos) 가 v_selective_pos 다음번 반복자를 리턴하기 떄문에
만약 v_selective_pos 가 end() 일 경우 문제가 생기는것 같습니다. 흔히들 반복자 무효화 문제라고 하던데요
나름 std::vector<A_Star_Node>::iterator temp 를 선언해서 erase() 되기 전에 백업하고 지우고 난 다음 다시 백업된 값을 넘겨주는
것을 생각하기도 했는데.. 역시 죽어버리는 군요
또 다른 방법으로 if(v_selective_pos == v_selective.end()) break;
를 해봣는데 이상하게 함수가 정상작동이 안되고 규칙이 위배된것들이 남아있는 현상을 볼 수 있었습니다.
이 반복자 무효화문제를 해결하는 방법이 있다면 알려주시면 감사하겠습니다.
#include <vector>
int main()
{
std::vector< int > testVec ;
testVec.push_back( 1 ) ;
testVec.push_back( 2 ) ;
testVec.push_back( 3 ) ;
testVec.push_back( 1 ) ;
testVec.push_back( 2 ) ;
testVec.push_back( 3 ) ;
for( std::vector< int >::iterator it = testVec.begin() ;
it != testVec.end() ; )
{
if ( 3 == *it )
{
it = testVec.erase( it ) ;
}
else
{
++it ;
}
}
return 0 ;
}