STL iterator에 관한 질문
글쓴이: kuaaan / 작성시간: 월, 2006/05/22 - 12:01오전
Quote:
map testMap;
...
map::iterator cur;cur = testMap.begin();
while (cur != testMap.end())
{
// Do Something
cur++; // 여기!!
}
STL에서 iterator를 다음 원소로 한칸 이동시킬때...
인터넷의 샘플코드들을 찾아보면...
cur++ 이렇게 쓰시는 분이 계시고...
*cur++ 이렇게 쓰시는 분도 계십니다.
어떤 차이가 있는 건가요?
Forums:
...
iterator 를 증가시키는건 cur++ 으로 됩니다.
(보통은 ++cur 로 선행 ++ 를 사용합니다.
후행 ++ 은 선행 ++ 로 구현되도록 하고있기에
cur++ 보다는 ++cur 가 효율적입니다.)
*cur++ 로 접근한다면
연산자 우선순위에 따라 cur++ 로 iterator 를 다음으로 옮기고
*(cur++) 로 해당 iterator 가 가리키고있는 값을 꺼내오는 내용이 됩니다.
-----
이글을 읽는 모든 이에게 평화가 함께 하기를... ^^;
-----
이글을 읽는 모든 이에게 평화가 함께 하기를... ^^;
연산자 우선순위를
연산자 우선순위를 착각하신 것 같습니다. 값을 먼저 꺼내오고 iterator를 이동하는 것입니다.
연산자 우선순위는
연산자 우선순위는 맞습니다. ( * 보다 ++ 이 우선순위가 높죠 )
단지, ++ 이 postfix 라서 * 가 수행된 이후에 수행될 뿐입니다.
실은 ++이 먼저
실은 ++이 먼저 수행됩니다.
일반적인 수식의 경우 값을 평가(evaluation)하는 과정을 거치는데,
오버로드된 연산자의 경우 이는 결국 함수호출을 뜻하지요.
a+b*c를 평가하려면 b*c를 먼저 평가해야 하듯이
*i++을 평가하려면 i++를 먼저 평가(호출)해야 합니다.
어렵군요 ^^;
연산자 우선순위만 생각했는데.. 잘못된 답이 되고 말았네요 죄송합니다.
일단 *cur++ 의 의미는
"현재 iterator 가 가리키는 값을 꺼내오고 iterator 는 증가시킨다" 로 이해하시면 될듯합니다.
두줄로 쓰면 *cur; ++cur; 와 같은 의미입니다.
그런데 우선순위가 ++ 가 높은데 * 가 먼저 평가되는 듯한 이유가 헷갈려서 책을 찾아봤습니다.
다음은 사후증가의 일반적 형태라고 합니다.
(후행 ++ 라고 위에 적었었는데.. 책에선 사후증가라고 하는군요;; 죄송;;)
사후증가는 값을 증가시키긴 하지만 반환값은 증가시키기 전의 값이네요.
즉, 사후증가가 우선순위 상 먼저 실행되는게 맞고
그 후 반환값을 가지고 * 를 하게 되는군요.
그래서 *cur++ 는
"iterator 를 증가시킨 후 이전에 iterator 가 가리키던 값을 반환한다." 정도가 될것 같습니다.
이거 생각보다 재미있는 문제네요. :)
-----
이글을 읽는 모든 이에게 평화가 함께 하기를... ^^;
-----
이글을 읽는 모든 이에게 평화가 함께 하기를... ^^;
Quote: (후행 ++ 라고
죄송할 것까지야 없겠죠.
원어로는 postfix인데, 저도 후위형, 후치형 등으로 그때그때 다르게 쓰고 있습니다. ^^;
댓글 달기