2009-07-27 4 views
11

비교 C++ 표준은 두 개의 기본 생성 STL 반복기를 비교할 수 있다고 말합니까? 기본 생성 iterators는 동등한가?기본 생성 반복자와 연산자 ==

나는 예를 들어 표준 : : 목록을 사용하여, 다음 원하는 : 내가 여기에 원하는 것은

void foo(const std::list<int>::iterator iter) { 
    if (iter == std::list<int>::iterator()) { 
     // Something 
    } 
} 

std::list<int>::iterator i; 
foo(i); 

는 반복자에 대한 NULL 값 같은 것입니다,하지만 난 그게 합법적인지 확실하지 않다. Visual Studio 2008에 포함 된 STL 구현에서 std :: list의 연산자 ==()에 어설 션을 포함하여이 용도를 배제합니다. (그들은 각각의 반복자가 동일한 컨테이너에 의해 소유되고 기본 생성 반복자가 컨테이너가 없다는 것을 확인합니다.) 이것은 합법적이지 않거나 지나치게 열광적 인 것임을 암시합니다.

+0

'boost :: optional '가 떠오른다. – MSalters

답변

15

그래, 나는 찌를 것이다. C++ 표준, 제 24.1/5 :

반복자는 모든 컨테이너와 연관되지 않은 단일 값을 가질 수 있습니다. [예 : 초기화되지 않은 포인터 x (int * x;와 같이)를 선언하면 x는 포인터의 값이 항상 인 것으로 가정해야합니다. ] 대부분 식의 결과는 단 하나의 경우에 대해 정의되지 않았습니다 값; 유일 한 예외는 에 비 고유 값을 할당하고 단 하나의 값을 보유하는 반복기를 지정하는 것입니다.

아니요, 비교할 수 없습니다.

+0

니스, 알았어 :) – AraK

+0

'std :: istream_iterator는 어떨까요? 이것이 바로 시험을 끝까지 비교하는 방법입니다. –

1

나는 범위을이 함수에 전달해야한다고 생각합니다.

void fun(std::list<int>::iterator beg, std::list<int>::iterator end) 
{ 
    while(beg != end) 
    { 
     // do what you want here. 
     beg++; 
    } 
} 
+1

아마도 사실이지만 질문에 대답하지 않습니다. –

+0

그래, 내 2 센트 :) – AraK

+1

당신이 무슨 말을하는지 이해 하겠지만, 그 의미는 실제로 std :: list :: erase()와 같은 단일 항목을 요구합니다. 나는 반복자의 개념을 악용하고 있을지 모른다. 그게 제가 발견에 관심이있는 이유입니다. – Adrian

1

사양은 기본 생성자의 사후 조건은 반복자가 singular이라는 것입니다. 평등에 대한 비교는 정의되지 않았으므로 일부 구현에서는 다를 수 있습니다.

6

이것은 C++ 14에서 변경 될 예정입니다. [forward.iterators] N3936의 24.2.5p2는

하지만, 값 초기화 반복자 비교 될 수 있고, 동일한 형태의 다른 값으로 초기화 반복자 동일 비교한다 말한다.

+0

나는 직장에서 뭔가를 구현할 때이 바로 지금을 쳤다. (나는 C++ 2014를 가지고 있었으면 좋겠다.하지만 시각적 인 스튜디오 2012를 가지고있다. : D –

+0

비 특이한 반복자는 다음과 같은 이유로 C++에서도 여전히 좋은 생각이 아니다. 값 초기화 된 반복자와 비교할 수 없습니다. –

관련 문제