2012-04-28 4 views
0

C++의 모든 변수는 int i과 같은 유형이며 i 유형은 int입니다. 마찬가지로 우리는 우리가이STL의 반복자 유형은 무엇입니까?

 map<string,int>::iterator it . 

같은 것이 여기에 걸쳐 it의 유형은 무엇이라고 선언 STL의 반복자가? 포인터 타입인가 아니면 포인터 타입인가? int 또는 다른 형식을 저장하는 벡터의 경우 해당 itearors가 가리키는 값을 가져 오도록 iterator를 온전하게 추론합니다. 또는 연산자 *은 STL의 반복자에 대해 오버로드됩니까?

답변

4

24.2.1/1 iterator.requirements.general] 멋지게 요약 :

반복자는 C 균일 상이한 데이터 구조 (용기)과 함께 작동 할 수 ++ 프로그램 포인터의 일반화이다

방법. 서로 다른 유형의 데이터 구조에서 정확하고 효율적으로 작동하는 템플릿 알고리즘을 구성 할 수 있도록 라이브러리는 인터페이스뿐만 아니라 반복자의 의미 및 복잡성 가정을 공식화합니다.

"포인터의 일반화"는 포인터가 이터레이터라는 것을 의미합니다. std::vector<T>::iterator은 typedef T *이 될 수 있습니다. 그러나 대부분의 반복자는 연산자 오버로딩을 통해 인터페이스를 구현합니다. 이터레이터는 컨테이너에 속할 필요가 없습니다.

이러한 언어는 C++ 표준 작성 방법과 매우 유사합니다. 그것은 어떻게 동작 하는지를 설명하지만 기본 클래스의 측면에서 인터페이스를 정의하지 않아야합니다. 반복자에는 입력, 출력, 전달, 양방향 및 임의 액세스 등 다양한 종류가 있습니다. 각각은 다른 명세를 가지고 있으며 랜덤 액세스는 양방향 인터페이스의 엄격한 수퍼 세트이지만 C++ 유형 시스템에서는 전혀 관련이 없습니다.

반복자는 ++*이 오버로드되고 유효한 특수화가 std::iterator_traits 인 모든 클래스가 될 수 있습니다. 기본 클래스 std::iterator이며 std::iterator_traits과 함께 필요한 인터페이스를 정의합니다. C++ 제네릭 프로그래밍 및 특성 클래스에서 좋은 사례 연구입니다.

+0

std :: map :: iterator는 어떨까요? 그래서 tpedef는 무엇이 될까요? 'T *'또는''T1 *'? – Invictus

+1

@Ritesh'std :: map :: iterator'는 포인터와 근본적으로 다르므로 어느 것도 될 수 없습니다. – Potatoswatter

+0

+1은 행동 측면에서 정의됩니다. –

6

it의 유형은 무엇입니까?

it의 유형은 map<string,int>::iterator입니다.이 유형은 많은 수의 연산자가 오버로드 된 클래스입니다.

일부 컨테이너 유형의 경우 Container::iterator은 원시 포인터 유형이 될 수 있습니다. map의 경우 클래스 여야합니다.

+0

iterators에 대해'*'연산자가 오버로드 되었습니까? – Invictus

+0

@Ritesh : 예, 그렇습니다. – NPE

+0

예, 단순히 포인터로 구현하지 않는 한 ('std :: vector :: iterator'에서 발생할 수 있기 때문에). –