2010-04-15 4 views
2

컨테이너에서 방문자의 현재 위치를 저장하기 위해 STL과 같은 반복기를 사용하여 C++로 Visitor 패턴을 구현했습니다. 이제 컨테이너를 반복하는 동안 컨테이너를 변경하고 싶습니다. 컨테이너에서 항목을 삭제하는 데 특히 관심이 있습니다. 현재 컨테이너에있는 항목까지도 삭제하려고합니다.방문자를 사용하는 동안 컨테이너 변경

이제 분명히이 항목을 가리키고 있기 때문에 방문자 내부 반복기가 무효화됩니다. 현재 컨테이너에 모든 반복자 목록을 저장하고 목록에 항목이 추가되거나 목록에서 제거되는 즉시 업데이트합니다. 따라서 이것은 반복자 (Observer)와 목록 (Observable)에 적용된 Observer 패턴과 유사합니다.

또는 방문객() 메소드가 방문객에게 현재 항목에 어떤 일이 발생했는지 반복 처리하는 방법에 대한 힌트를 반환하는 것으로 생각했지만 방문()이 너무 좋았 기 때문에 방문객 구현은 실제로 다음 항목을 찾는데 신경 쓰지 않아야합니다.

그럼, 내 질문은 : 방문자가 컨테이너에 추가되거나 컨테이너에서 제거 된 경우에도 방문자를 계속 유지하는 가장 좋은 방법은 무엇입니까?

감사합니다, 플로리안

업데이트 :이 컨테이너를 통해 실행 한 방문자는하지만 방문() 메소드의 내부에 추가 반복자의 수는 같은 컨테이너에서 사용할 수 있습니다. 컨테이너의 항목 중 하나가 삭제 된 visit() 호출에서 돌아온 후에도 방문자가 컨테이너의 나머지 항목을 계속 사용하기를 원합니다.

+0

귀하의 설명에 다소 혼란 스럽습니다. 방문객이 변경 될 때마다 업데이트해야하는 컨테이너를 통해 여러 방문자가 방문하고 있습니까? 방문객이 아닌 사람이 컨테이너에 변경 사항이있을 때마다 방문자의 직위를 재확인하기를 원하십니까? 또는 한 번에 한 명의 방문자 만 있고 그 컨테이너의 요소를 방문한 후에 방문자가 항상 유효한 반복자를 사용해야한다고 말했습니까? –

+0

나는 또한 혼란 스럽다. STL 컨테이너를 통해 방문자를 구현 한 방법에 대한 더 큰 설명 (또는 코드)이 여기에 도움이 될 수 있다고 생각합니다. 방문자가 객체, 객체 및 반복자를 수락한다는 것은 무엇입니까? 다음 요소를 방문하도록 이터레이터를 변경하는 사람은 누구입니까? –

답변

0

탐색 중에 컨테이너를 변경하면 이터레이터는 기껏해야 위험합니다. 색인을 사용하고 거꾸로 걸어가는 것이 가장 안전합니다.

+3

시퀀스 컨테이너를 사용할 때 컨테이너를 변형 할 때도 반복자를 안전하게 사용할 수 있습니다. 사용중인 반복자를 삽입 또는 삭제 메소드에 의해 반환 된 반복자로 바꾸면됩니다. –

+0

'it = container.erase (it);'와 같은 의미입니까? 그 정도면 충분 하긴하지만 방문객 패턴과 어떻게 조합할까요? – Florian

0

너무 많은 반복자 및 삭제 작업이 없으면 (첫 번째) 구현이 매우 유용하다고 생각합니다. 이런 경우라면 Eddy와 같은 알고리즘처럼 마크와 스윕을 사용하는 것이 좋습니다. 또한, 나는 후자가 더 쉽고 에러가 발생하기 쉽다고 생각한다. 삭제 표시된 노드를 건너 뛰는 것을 잊지 마십시오. 한편, 반복자를 업데이트해야하는 경우 '삭제'이외의 경우가 있으면 현재 구현을 계속 사용하십시오.

0

이러한 경우에, 내 컨테이너를 복사하는 것이 비용이 많이 들지 않는다면, 나는 그것을 복사하고 복사본을 반복합니다. 원본 컨테이너는 shared_ptr에 의해 객체를 보유하고 복사본은 weak_ptr을 보유합니다.

관련 문제