2013-04-12 4 views
1

나는 C++ 프라이머 5를 읽고 있어요, 나는 다음과 같다 코드가 발생 :포인터가 아니더라도 C++ 반복기를 역 참조 할 수 있습니까?

string s("some string"); 
    if (s.begin() != s.end()) 
    { 
     auto it = s.begin(); 
     *it = toupper(*it); 
    } 

it 문자열 s의 첫 번째 문자로 반복자의 값을 수신을; toupper()에 의해 대문자로 변경됩니다. it은 어떻게 역 참조 될 수 있습니까? 그냥 char 형식의 변수가 아니라 포인터가 아니어야합니까?

+0

'it'는'char' 변수가되어야한다고 생각합니까? 반복자는 포인터와 비슷하게 동작하지만'연산자 ++ '는 배열이 아닌 링크 된 목록과 맵을 통해 이동할 수 있도록 재정의됩니다. –

+0

반복자의 참조 해제 연산자는 복사본이 아닌 문자에 대한 참조를 반환합니다. –

답변

1

ititerator이다

C++에서

는 반복자 (이러한 어레이 또는 컨테이너) 소자 범위의 일부 요소를 가리키는 능력 있고, 어떤 목적 연산자 집합 (적어도 증가 연산자 (++) 및 역 참조 연산자 (*))을 사용하여 해당 범위의 요소를 반복합니다.

이터레이터의 가장 명백한 형태는 포인터입니다. 포인터는 배열의 요소를 가리킬 수 있으며 증가 자 연산자 (++)를 사용하여 반복 할 수 있습니다. 그러나 다른 형태의 반복자가 존재합니다. 예를 들어, 각각의 컨테이너 유형 (예 : 벡터)은 효율적으로 요소를 반복하도록 설계된 특정 반복자 유형 을가집니다.

포인터가 반복자의 형식이지만 모든 반복자가 포인터와 동일한 기능을 수행하는 것은 아닙니다. 반복자는 특정 알고리즘 가진다 요구 사항을 구별하기 위해, 다섯 개 다른 반복자 범주가 존재 : 반복자 이후

처음의 시작을 가리키는 포인터 (처럼 동작 스마트 오브젝트 입니다 문자열 - container)이며 해당 컨테이너에서 반복합니다. 코드 샘플에 표시된대로 it을 역 참조 할 수 있습니다. 따라서 일반적으로 it을 포인터로 사용할 수 있습니다.

, 귀하의 경우, 문자열의 포인터의 현재 위치가 그것을 그 위치에서 무엇의 대문자 동등한에 할당되고있는 :

*it = toupper(*it); 
+0

견적서는 좋지만 추가 한 문장이 잘못되었습니다. '벡터 :: iterator'는 포인터가 아니며 대부분 포인터처럼 동작하는 스마트 오브젝트입니다. –

+0

@BenVoigt, 편집 해 주셔서 감사합니다. – jrd1

0

반복자 타입 (이것은 마법의 auto 키워드를 사용하여 가려진 것입니다)은 원시 객체가 아니라 복잡한 것입니다.

*it을 묻는 메시지가 표시되면 그 위치에이라는 이라는 참조가 지정됩니다. 따라서 수정할 수 있습니다.

0
Shouldn't it just be a char type variable and not a pointer? 

"it"은 포인터가 아닌 반복자 (포인터 같은 개체)입니다. 포인터를 통해 반복자를 선택할 때 확실한 이점이 있습니다. 한 가지 놀라운 이점은 알고리즘을 컨테이너와 분리하는 것입니다. 따라서 일반 알고리즘 (반복자의 유형에 의해서만 제약 됨)을 가지므로 컨테이너를 알고리즘에서 분리합니다.

Pls는 STL iterators - purpose입니다.

관련 문제