2012-10-22 5 views
4

를 사용하여 부스트 다중 인덱스에서 항목을 제거 할 때 나는 다음과 같은 코드가 표준 : : 벡터를 들어, 올바르지 않은 것을 알고 더 일반적으로 모든 STL 컨테이너 : 반복자가 될 필요가일관성 반복자

std::vector<something>::iterator it = array.begin(); 
for(; it != array.end(); it++) { 
    ... 
    array.erase(it); 
    ... 
} 

때문에 지우기 및 요소 후 업데이트 됨. 내가 확인하고 싶습니다

my_index::iterator it = index.get<0>().begin(); 
for(; it != index.get<0>().end(); it++) { 
    ... 
    index.erase(it); 
    ... 
} 

가 잘 다음 단락을 이해하기 :

나는 그것이 부스트 멀티 인덱스에 대해 동일한 있는지 궁금해서, 예를 들면 다음과 같은 올바른 여부 것 문서 : http://www.boost.org/doc/libs/1_51_0/libs/multi_index/doc/tutorial/indices.html#guarantees iterator를 무효화하지 않고 지울 수 있다고 말하는 것 같습니다. 그러나 요소를 삭제하기 때문에 반복 중에 방문해야 할 다른 요소를 현재 반복기의 위치 전에 이동하고 결코 방문 할 수 없는지 확실하지 않습니다 (즉, 반복 중에 일부 요소를 지워서, 나는 여전히 모든 요소들을 통과해야만 하는가?).

감사합니다.

답변

6

연결된 단락은 해시 된 (정렬되지 않은) 색인에만 적용됩니다. 그 때 새 요소를 삽입 할 때 해시 된 인덱스 반복기 유효 남아 있습니다.삭제하는 경우

는 주문 지표에 대한 당신은 항상 erase에서 반환 값을 사용하여 전체 반복을 보장 할 수 있습니다 :

for (; it != index.get<0>().end();) { 
    if (...) it = index.erase(it); 
    else ++it; 
} 

이것은 또한 해시 (정렬되지 않은) 인덱스에 대한 작동, 반복 순서가 지우기를 통해 안정적으로 집단.

3

아니요, 사용자 조치는 부스트 색인에서 유효하지 않습니다. 컬렉션에서 지워지는 반복자는 유효하지 않습니다. 유효 할 수있는 것은 컬렉션 내의 다른 반복자입니다. 어딘가에 저장해야합니다.

실제 텍스트이다 인해 Boost.MultiIndex기구에 의해 부과되는 내부 제약 반복자 유효성 및 예외 안전

보장 지수 반복자 유효성 및 예외 안전에 대한 보장을 제공 해싱 비 순차적 연관성 컨테이너의 경우 C++ 표준 라이브러리 기술 보고서 ​​(TR1)에서 요구되는 것보다 실제로 더 강합니다.

반복자 유효 기간은 삽입하는 동안 어떤 경우에도 유지됩니다. 재 선화 : TR1은 반박 (암시 적 또는 명시 적)이 수행 될 때 반복기 무효화를 허용합니다. 반복자를 통해 요소의 요소 나 범위를 지우는 것은 내부 해시 함수 및 동등 조건부 개체가 실제로 호출되지 않으므로 던지지 않습니다. rehash는 강력한 예외 안전 보장을 무조건 제공합니다.

TR1은 내부 해시 함수 및 동등한 조건부 개체가 throw되지 않는 경우에만 보증합니다. 약간의 놀라운 결과는 입니다. TR1 호환 비 순서 연관 컨테이너가 다시 해싱하는 동안 예외가 발생하는 경우 요소를 지울 수 있습니다! 일반적으로 이러한 강력한 보증은 사용자의 편의를 위해 특별히 반복자 안정성을 참조하는 것을 보장합니다. 하지만 실적이 저하 될 수 있으므로 상품을 교환 할 수 있습니다.

+0

원래 반복기의 복사본을 만들면이 복사본이 유효하다는 의미입니까? 내가 iterator it2 = it; index.erase (it); it = it2; 그것은 효과가있을 것인가? – sunmat

+0

아니요, 어쨌든 복사본을 "지우고"있습니다. 지우는 데 필요한 값으로 매개 변수를 사용한다고 가정 할 수 있습니다. 항상 작동하는 remove_if 알고리즘을 사용해야합니다. – CashCow