1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | vector<int> vecN; vector<int>::iterator iter = vecN.begin(); vecN.push_back(1); vecN.push_back(2); vecN.push_back(3); vecN.push_back(4); for (; iter != vecN.end(); ++iter) { if (*iter == 2) { vecN.erase(iter); //break; } } | cs |
저걸 update() 함수에서 매 프레임마다 호출해준다고 할 때,
브레이크를 걸어주면 상관없는데
안걸면 터집니다. 보니까 이레이즈를 하면, iter에 다음 원소의 이터레이터가 들어가는데
for문으로 올라가서 내려가는 코드에서 터져버림
제가 이해한건 반복문 안의 조건에 걸리면 벡터 원소 2를 이레이즈 해주고
백터의 원소 3의 이터레이터가 iter에 들어가 있는 것 같은데
for문 증가하는 곳 ++iter를 만나면, iter가 벡터 원소 4의 이터레이터가 되지 않고 터져버림
터지는 정확인 이유가 뭐예요?
erase는 원래 쓰면 안됨 O(N) 작용이라 오버헤드 폭발함
메모리가 재배치돼서 이터레이터가 어긋남
이거 굉장히 자주있는 일이에요 컨테이너 쓸때
그리고 erase는 루프 돌리는 것보다 remove-erase 를 쓰는게 정석임
이 때문에 최근에는 이터레이터를 직접 안 건들이는 쪽으로 발전하고 있음 ranged-for 라던지
erase메서드 반환값 있는데 그걸 iter에 할당하면 괜찮아질거임
erase 할 때 사람들이 제일 많이 쓰는 방법은 erase 하고 싶은 원소랑 맨 마지막 원소랑 바꿔치기해서 pop_back 하는거임. 이러면 O(1) 삭제인데다가 이터레이터 문제도 안 생김
오 커헉횽 방법이 있구나