2016-12-17 1 views
4

이것은 내 시험에 대한 질문이었고 대답은 모든 포인터가 반복자이지만 모든 반복기가 포인터가 아니라는 것입니다. 왜 이런 경우입니까? 같은 구문에서 모든 포인터가 반복자로 간주됩니까?

:

(P)가 전혀 반복자 고려 될 수있는 방법
int *p = new int(4); 

?

+2

포인터는 포인터입니다. 반복자는 반복자입니다. 배열의 일부 요소에 대한 포인터는 임의 액세스 반복기의 모든 요구 사항을 충족합니다. 다른 포인터, ...별로. –

+0

@SamVarshavchik 내 생각은 정확히 왜 모든 포인터가 반복자인지 이해할 수 없다. – Bob

+1

"모든 포인터가 반복자"라는 담요 선언은 거짓이다. –

답변

10

"반복자"는 유형이 특정 의미 체계로 지원해야하는 특정 작업 집합을 설명하는 몇 가지 추상적 인 개념입니다.

포인터는 개념 iterator (그리고 더 강해서, random access iterator)을 충족시키기 때문에 반복기입니다. operator++은 다음 요소로 이동하고 operator *은 기본 요소에 액세스합니다. 특정 예에서

, 당신은 어떤 한쌍의 반복자처럼 표준 알고리즘 예를 들면 사용할 수 있습니다

[p, p+1) 

있는 표준 반복자 범위를 얻을. (특히 유용하지는 않지만 여전히 유효합니다.) 위의 내용은 어떤 "유효한"포인터, 즉 어떤 객체를 가리키는 포인터에 해당합니다.

그러나 역의 의미는 거짓입니다. 예를 들어, std::list<T>::iterator을 고려하십시오. 그것은 여전히 ​​반복자이지만 operator[]이 없기 때문에 포인터가 될 수 없습니다.

+0

포인터없이 반복자를 구현할 수있는 방법이 있습니까? – Bob

+1

@ 밥 정확히 그 뜻이 무엇입니까? 포인터가 아닌 반복자 (iterator)? 내 대답의 마지막 단락을보십시오. 포인터를 사용하여 구현할 수없는 반복자 (iterator)? 아마 아무 것도하지 않는 포인터를 하나 떨어 뜨릴 수 있습니다. 포인터는 이미 가장 강력한 반복기 카테고리에 있습니다. –

+0

포인터에 대한 iterator_traits를 구현하지 않으면, 포인터조차도 최신 표준에 따라 반복자로 완전히 규정되지 않는다는 점에 유의해야합니다. –

관련 문제