2010-04-28 2 views
26

반복기가있는 코드는 포인터가있는 코드와 매우 흡사합니다. 반복자는 다소 모호한 유형입니다 (예 : std::vector<int>::iterator).반복자와 포인터는 어떤 관계가 있습니까?

필자가 얻지 못하는 것은 반복자와 포인터가 서로 어떻게 관련되어 있는지입니다. 반복자가 오버로드 된 연산을 사용하여 인접 요소로 이동하는 래퍼입니까? 아니면 다른 것입니까?

답변

44

반복자는 포인터의 일반화입니다.

반복자 (변종에 따라이) * 구현해야하고 ++

그래서 포인터는 반복자이다. 그러나 꼭 다른 길은 아닙니다.

복잡한 구조 (트리, 그래프 ...)를 반복하고 싶다면 이터레이터는 포인터 이상이며 램의 실제 위치를 참조하지 않습니다.

+7

포인터를 반복자의 하위 집합이라고 할 수 있습니까? – solti

+7

예, 절대적으로 –

7

개념적으로 예 -하지만 포인터 일 필요는 없습니다. 내부 구조와 기능은 "감싸는"데이터 구조에 따라 달라집니다.

다른 이유는 "classes" of iterators입니다. 예 : 단방향, 양방향, 랜덤 액세스 등

일부는 여러 클래스가 가능합니다.

예. 내부 구조가 Red-Black 트리 또는 링크 된 목록 인 경우 반복기는 양방향 일 수 있지만 RandomAccess는 아닙니다. 배열로 구현 된 벡터를 래핑하면 RandomAccess와 Bidirectional을 갖게됩니다.

7

반복자는 특정 연산자에 과부하가 걸리는 개체이므로 사용법이 포인터 인 것처럼 보입니다. 그것은 주어진 반복자 범주의 기능 내에 있습니다. 무작위 액세스 반복자는 포인터처럼 보이지만 다른 유형의 반복자는 일부 조작을 제공하지 않습니다 (예 : 양방향 인 list<X>::iterator에는 임의 액세스가 필요한 많은 연산자 중에서 += 연산자가 없습니다). 은 "모호한 이름"는 반복자에 대한 일반 포인터를 사용하는 것이 완전히 상상하지에 관해서는

:

template <class T> 
class MyContainer 
{ 
    ... 
    typedef T* iterator; 
} 

MyContainer<int>::iterator it; //the type is really int* 
3

반복자입니다 반복자에 필요한 인터페이스를 제공합니다 단지 개념 - 이들은 다른를 C++ 표준 (반복자 요구 사항)의 24.1 절에 지정되어 있습니다.

반복자가 구현되는 방법은 벡터에 대해 일반적으로 배열에 대한 단일 포인터를 감싸는 래퍼 (배포 빌드에서 어쨌든 빌드 됨)입니다. 복잡한 컨테이너의 경우 구현이 복잡합니다. 개방형 범위의 경우 요소를 생성하는 데 사용되는 알고리즘의 상태를 포함합니다.

배열의 요소에 대한 포인터는 임의 액세스 반복기의 요구 사항을 충족하므로 어느 정도까지는 상호 교환 가능하다는 점에 유의하십시오.

+2

단어가 * 유형 *이 아닌 * 개념 *이라고 생각합니다. –

관련 문제