문제

요소가 순서 없이 제거될 수 있는 항목 목록을 C++로 구현할 계획입니다.나는 임의의 종류의 임의 액세스가 필요하다고 기대하지 않으며(단지 주기적으로 목록을 청소하면 됩니다) 항목의 순서도 중요하지 않습니다.

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

그러나 저는 아직 C++ STL 컨테이너를 처음 접했고 그렇게 오랫동안 반복자를 유지하는 것이 안전한지 모르겠습니다.특히 삽입된 사물이 사라지기 전에 삽입된 사물 전후에 다른 요소가 삭제될 것이라는 점을 고려하면 더욱 그렇습니다.

도움이 되었습니까?

해결책

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

귀하의 경우 삽입된 Thing* 앞뒤에 다른 요소가 삭제된 경우에도 반복자를 유지하는 것이 좋습니다.

편집하다:

벡터 및 데크에 대한 추가 세부정보:

벡터:

  • 삽입 --- 모든 반복자는 재할당이 발생하면 유효하지 않습니다. 그렇지 않으면 유효합니다.
  • 지우기 ---- 이후의 모든 반복자 지우기 포인트가 유효하지 않습니다.

데크:

  • 삽입 --- 모든 반복자는 올바르지 않음.
  • erasing ---- 모든 반복자가 올바르지 않음.

다른 팁

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

확인하다: http://www.sgi.com/tech/stl/
각 컨테이너 문서의 마지막 부분에는 반복자가 유효한 조건에 대한 설명이 나와 있습니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top