2010-02-10 3 views
2

좋은 날,STL에서 반복자와 컨테이너 사이의 관계

C++에서 파이썬과 같은 범위를 작성한다고 가정합니다. 랜덤 액세스 컨테이너의 모든 특성을 제공합니다 (물론 불변). 다음과 같은 상황에 대한 질문이 제기됩니다.

두 개의 다른 이터레이터가 있습니다. 즉, 다른 범위 컨테이너의 인스턴스를 가리 킵니다. 이 두 범위는 과 동일하고입니다. 즉 이들은 동일한 범위를 나타낸다. 다음과 같은 상황이 허용겠습니까 : 나는 STL :)의 심플한 디자인 규칙을 잃었 경우

fact: range1 == range2 e.g. 
--------------------------- 
range range1(10, 20, 1), range2((10, 20, 1); 
range::iterator i = range1.begin(), j = range2.begin(); 
assert(i == j); // would you allow this? 

미안

기본적으로

답변

3

는 STL에서, 두 개의 서로 다른 컨테이너에서 두 반복자는 비교할 수 없습니다. 이는 동작이 지정되지 않았 음을 의미합니다. 그래서 네가 원하는대로해라. 아무도 시도해서는 안된다. 반복자의 j는 반복자 난 경우에만 이 경우 에서 도달이라고

:

편집

표준, 섹션 24.1, 단락을주의 깊게 6 개 상태를보고 한 후 의 응용 프로그램의 유한 시퀀스는 ++ i로 i == j가됩니다. j가 i에서 도달 할 수있는 경우 을 동일한 컨테이너에 연결합니다. 당신이 두 개의 서로 다른 용기에 iji == j을 허용하는 경우, 당신이 정말로 같은 것으로 모두 용기를 고려하는 것이 의미

. 그것들은 불변이므로, 이것은 완벽합니다. 의미 론적 질문.

+0

감사합니다. 이 사실을 처음 알았습니다. 표준에서 어디에서 찾을 수 있습니까? – AraK

+0

문자열을 사용하고 있었는지, 모든 문자열에서 인턴 연산을 수행하면 두 개의 == 문자열을 비교하면 동일한 문제가 발생할 수 있습니다. 필수는 아니지만 일어날 수 있습니다. 나는 그것이 일어날 지 걱정하지 않을 것이지만, 나는 그것이 일어날 것을 요구하지 않을 것이다. – KitsuneYMG

+0

VC는 다른 컨테이너를 가리키는 반복자를 비교하려고 할 때 적어도 불평합니다. 표준에서 비교하는 것이 불법이라고 말하는가 알고 있습니까? 또는 VC가 지나치게 도움이됩니까? 24.1의 단락 7은 지금 말하기에 가장 가까운 것으로 보이지만 실제로는 범위와 알고리즘을 설명합니다. 질문 : 'i == j'와 같은 컨테이너를 가리 키지 않아도 비교할 수 있습니까? –

0

STL에서 비교 규칙은 컨테이너 자체가 아닌 컨테이너 요소에 의해 결정되므로 내 의견으로는 == 연산자 오버로드에서 자신을 역 참조하지 않아야합니다.

1

boost::counting_iterator을 확인하는 것이 좋습니다.

auto rng = boost::make_iterator_range(boost::make_counting_iterator(0), 
             boost::make_counting_iterator(10)); 
for(auto it = rng.begin(), e = rng.end(); it != e; ++it) 
    std::cout << it << " "; // Prints 0,1,2,3,...,9 
이 클래스

이 반복자가 같은 수를 포함하는 것을 제공하는 동일한 것으로 간주됩니다 : (그것은 단지 하나의 스텝 크기를 허용하는 것을 제외하고) 당신이 당신의 범위 클래스에 유사한 무언가를 얻을 수 있습니다 boost::iterator_range과 결합 . 그러나 각 반복자가 어느 범위에 속해 있는지 알지 못하기 때문에 상황이 당신과 다릅니다.