2009-04-17 3 views
11

요소가 순서가 벗어나는 C++의 목록을 구현할 계획입니다. 어떤 종류의 랜덤 액세스 (필자는 주기적으로 목록을 스윕해야 함)가 필요하다고 생각하지 않으며 항목의 순서도 중요하지 않습니다.C++ 반복기의 수명 및 유효 기간은 어떻게됩니까?

그래서 나는 std::list<Thing*> with this->position = insert(lst.end(), thing)의 트릭을해야한다고 생각했습니다. Thing 클래스가 각 인스턴스의 위치를 ​​기억하여 나중에 쉽게 할 수 있도록하고 싶습니다. lst.erase(this->position) 일정 시간.

그러나 나는 아직 C++ STL 컨테이너에 익숙하지 않으며 오랜 시간 동안 반복자를 유지하는 것이 안전한지 잘 모르겠습니다. 특히 삽입하기 전에 삭제 된 다른 요소가있을 것이라는 점을 감안할 때 특히 그렇습니다.

답변

13

목록에서 모든 반복기는 삽입 중에 유효하며 삭제 된 요소에 대한 반복자 만 지우기 중에 유효하지 않게됩니다.

삽입 된 사물 앞에 다른 요소가 삭제 된 경우에도 반복자를 유지해야합니다.

편집 :

벡터 : 벡터 및 양단 큐에 대한

추가 세부 사항은 재 할당, 그렇지 않으면 그 유효 발생하는 경우

  • 삽입 --- 모든 반복자는 유효 수 .
  • 지우기 ----- 모든 반복기가 지우기 포인트 이후에 유효하지 않습니다.

양단 큐 :

  • 가 삽입 --- 모든 반복자는 무효 얻을.
  • 지우기 ---- 모든 반복기는 을 가져옵니다.
+0

좋은 대답은 어떤 원인으로 인해 벡터를 재 할당 할 수 있는지 파악하는 데 도움이됩니다. (요소를 삽입하는 것이 명백하지만 다른 요소가 있습니까?) – Malabarba

+0

벡터의 수정 (삽입 및 제거 모두)은 반복기를 재 할당하고 무효화 할 수 있습니다. 구현 여부에 관계없이 구현 정의됩니다. 따라서 어떤 방식 으로든 벡터를 수정하면 항상 기존의 모든 반복기가 무효화된다고 가정하면 가장 좋습니다. – Miral

3

이것은 사용하는 컨테이너에 따라 다릅니다.

확인 : http://www.sgi.com/tech/stl/
마지막에 각 컨테이너 설명서를 살펴보면 반복기가 유효하게 유지되는 조건에 대한 설명이됩니다.

std :: list <의 경우 실제로 참조하는 요소가 컨테이너에서 제거 될 때까지 모든 조건에서 유효합니다 (이 시점에서는 유효하지 않습니다).

+0

정보 주셔서 감사합니다. 나는 이미 SGI의 문서를 사용하고 있었지만, 나는 그 메모를 간과하고 그 대답을 알지 못했다고 생각한다. – PypeBros