map에서 원소를 erase하면 반복자가 무효화 됩니다.
이후에 map전체를 순회하려는데 반복자의 무효화 때문에 불가능 하네요.
해결책으로는 사라진 원소 앞뒤에 존재하던 원소끼리 서로 카리키도록(list의 erase처럼)하면 될 것 같은데 이런 방법이 존재하는지 모르겠고,
아니면 무언가 다른 방법이 있나요?
무효화되는건 삭제되는 위치의 반복자 뿐이기 때문에, 미리 다음걸 복사해두면 됩니다. 주로 다음과 같은 코드가 많이 쓰입니다.
std::map map; ... for (auto it = map.begin(); it != map.end(); ) { ... if (needToDelete) map.erase(it++); else ++it; }
제 문제는 이렇습니다. 위의 코드와 달리 한곳에서 삭제가 이루어지는 것이 아니라, 실행중에 불규칙하게 삭제가 이루어집니다. 그러면 무효화 된 반복자들이 몇개 생길 겁니다. 그 후에 전체순회를 하면서 삭제를 하려는 거라서 위와 같은 방식은 불가능 한걸로 보입니다.
코드를 못봐서 제가 파악이 안되는걸수도 있는데, 적으신걸로봐선 아무런 문제가 없어보입니다. 한번에 삭제를하던, 중간중간 삭제를 하던 다를바가 없지 않나요? 중요한건 삭제된 반복자만 무효화되고 다른 반복자는 그대로 유효하다는 것입니다. 만약에 스레딩을 통해서 동시에 삭제를 해야한다면 어차피 동기화가 들어가야될테구요.
제가 10개의 원소를 가진 map을 생성하여 3개를 삭제하면 3개의 반복자가 무효화 되는것이 맞지요? 그 후에 for문을 통해 순차접근하여 무효화된 반복자에 도달해 버리면 여기서 에러가 발생하지 않습니까? 그런 경우에 어떻게 한다는 건지요?
맵에서 노드가 삭제되면 순회접근할떄 지워진 iterator에 도달 안하죠.
> 제가 10개의 원소를 가진 map을 생성하여 3개를 삭제하면 3개의 반복자가 무효화 되는것이 맞지요? 네
> 그 후에 for문을 통해 순차접근하여 무효화된 반복자에 도달해 버리면 여기서 에러가 발생하지 않습니까? 아니오
> 그런 경우에 어떻게 한다는 건지요? 되나 안되나 해보고 말씀하세요.
for문안에서 호출하는 함수에서 반복자를 무효화 하여 생기는 문제였는데 미리 제거한 원소 때문에 문제가 생기는 것으로 잘못 생각했습니다. 무지한 질문에 답변주신분들 감사합니다. 꾸벅~(기분이 상하셨다면 더욱 죄송합니다)
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
무효화되는건 삭제되는 위치의 반복자 뿐이기 때문에,
무효화되는건 삭제되는 위치의 반복자 뿐이기 때문에, 미리 다음걸 복사해두면 됩니다.
주로 다음과 같은 코드가 많이 쓰입니다.
std::map map;
...
for (auto it = map.begin(); it != map.end(); ) {
...
if (needToDelete)
map.erase(it++);
else
++it;
}
제 문제는 이렇습니다. 위의 코드와 달리 한곳에서
제 문제는 이렇습니다.
위의 코드와 달리 한곳에서 삭제가 이루어지는 것이 아니라, 실행중에 불규칙하게 삭제가 이루어집니다.
그러면 무효화 된 반복자들이 몇개 생길 겁니다.
그 후에 전체순회를 하면서 삭제를 하려는 거라서 위와 같은 방식은 불가능 한걸로 보입니다.
코드를 못봐서 제가 파악이 안되는걸수도 있는데,
코드를 못봐서 제가 파악이 안되는걸수도 있는데, 적으신걸로봐선 아무런 문제가 없어보입니다.
한번에 삭제를하던, 중간중간 삭제를 하던 다를바가 없지 않나요?
중요한건 삭제된 반복자만 무효화되고 다른 반복자는 그대로 유효하다는 것입니다.
만약에 스레딩을 통해서 동시에 삭제를 해야한다면 어차피 동기화가 들어가야될테구요.
제가 10개의 원소를 가진 map을 생성하여 3개를
제가 10개의 원소를 가진 map을 생성하여 3개를 삭제하면 3개의 반복자가 무효화 되는것이 맞지요?
그 후에 for문을 통해 순차접근하여 무효화된 반복자에 도달해 버리면 여기서 에러가 발생하지 않습니까?
그런 경우에 어떻게 한다는 건지요?
맵에서 노드가 삭제되면 순회접근할떄 지워진
맵에서 노드가 삭제되면 순회접근할떄 지워진 iterator에 도달 안하죠.
> 제가 10개의 원소를 가진 map을 생성하여
> 제가 10개의 원소를 가진 map을 생성하여 3개를 삭제하면 3개의 반복자가 무효화 되는것이 맞지요?
네
> 그 후에 for문을 통해 순차접근하여 무효화된 반복자에 도달해 버리면 여기서 에러가 발생하지 않습니까?
아니오
> 그런 경우에 어떻게 한다는 건지요?
되나 안되나 해보고 말씀하세요.
for문안에서 호출하는 함수에서 반복자를 무효화 하여
for문안에서 호출하는 함수에서 반복자를 무효화 하여 생기는 문제였는데 미리 제거한 원소 때문에 문제가 생기는 것으로 잘못 생각했습니다.
무지한 질문에 답변주신분들 감사합니다. 꾸벅~(기분이 상하셨다면 더욱 죄송합니다)
댓글 달기