2009-05-05 2 views
22

가능한 중복 :
C++ Best way to check if an iterator is validSTL 반복기가 무엇을 가리키고 있는지 확인하는 방법은 무엇입니까?

내가 이런 식으로 뭔가를 할 :

std::vector<int>::iterator it; 
// /cut/ search for something in vector and point iterator at it. 
if(!it) //check whether found 
    do_something(); 

그러나 어떤 운영자가 없다! 반복자의 경우. 반복자가 어떤 점을 지적하는지 어떻게 확인할 수 있습니까?

+0

iterator 컨테이너에 대한 참조없이 iterating. 제임스 홉킨 (James Hopkin)의 대답을보십시오. –

+0

어둠을 분명히 함 STL 반복자의 무효화 : http://www.angelikalanger.com/Conferences/Slides/CppInvalidIterators-DevConnections-2002.pdf – lsalamon

답변

46

수 없습니다. 일반적인 관용구는 컨테이너의 끝 반복자를 '찾을 수 없음'마커로 사용하는 것입니다. 이것은 std::find가 반환하는 것입니다.

std::vector<int>::iterator i = std::find(v.begin(), v.end(), 13); 
if (i != v.end()) 
{ 
    // ... 
} 

할당되지 않은 반복기로 수행 할 수있는 유일한 작업은 값을 할당하는 것입니다. 루프에서 반복자를 사용하려면

+1

반복자가 초기화되어 여전히 유효한 경우 케이스를 덮었습니다. 그러나 일부 컨테이너에서 일부 작업을 수행하면 반복기가 무효화 될 수 있습니다. 예를 들어 벡터에서 요소를 제거하면 이터레이터 (이 경우 벡터의 마지막 요소를 가리키는 반복자)가 무효화 될 수 있습니다. –

+1

@ Cătălin : 그건 사실이지만 질문의 범위를 벗어난 것 같아요. 마찬가지로! ('not') 연산자는 유효한 포인터 나 널 포인터로만 작동합니다. 위의 코드는 유효한 반복자 ('end' 반복자 포함)에서만 작동합니다. –

+0

Iterator 유효성은 프로그래머가 걱정해야 할 범위에 있습니다. 당신은 당신이 당신의 반복자로 심술 궂은 일을하지 않는 것을 확인하는 유일한 사람입니다. – Spidey

0

, 가장 안전한 방법은이 방식에 사용 :

for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) 
{ 
do_smth(); 
} 
+0

실제로 많은 표준 알고리즘은 반복자 (예 : find)와 컨테이너의 메소드를 반환합니다 (예 : map :: find) –

+0

지우기 후에 루프가 'erase (it)'하지 않으면 안전합니다. 그것은 유효하지 않습니다. –

+0

질문에 대답하지 않습니다 – lalitm

2

을 반복자는 포인터의 일반적인 형태로 간주하지만, 그들은 정확히 포인터하지 않습니다. 표준에서는 컨테이너에서 검색 실패를 나타내는 반복자를 Past-the-end으로 정의합니다. 따라서 이터레이터에서 NULL을 확인하는 것은 바람직하지 않습니다.

Past-the-end 값은 비정규이고 참조 할 수없는 값입니다. 나는이 일반적해야 생각

if(it != aVector.end()) //past-the-end iterator 
    do_something(); 
-3

는 당신에게 좋은 시험을 제공 :

if (iterator._Mycont == &MyContainer) 
{ 
Probably a valid iterator! 
} 
당신은 반복자가 동일하지 않은 말을하지 있는지 확인하기 위해 테스트를 할 수

...

iterator != MyContainer.end() 

및 :

iterator >= MyContainer.begin() 
+2

매우 컴파일러 (및 버전!)에 따라 다릅니다. –

관련 문제