STL iterator에 관한 질문

kuaaan의 이미지

Quote:

map testMap;
...
map::iterator cur;

cur = testMap.begin();

while (cur != testMap.end())
{
// Do Something
cur++; // 여기!!
}

STL에서 iterator를 다음 원소로 한칸 이동시킬때...

인터넷의 샘플코드들을 찾아보면...
cur++ 이렇게 쓰시는 분이 계시고...
*cur++ 이렇게 쓰시는 분도 계십니다.
어떤 차이가 있는 건가요?

자룡의 이미지

iterator 를 증가시키는건 cur++ 으로 됩니다.
(보통은 ++cur 로 선행 ++ 를 사용합니다.
후행 ++ 은 선행 ++ 로 구현되도록 하고있기에
cur++ 보다는 ++cur 가 효율적입니다.)

*cur++ 로 접근한다면
연산자 우선순위에 따라 cur++ 로 iterator 를 다음으로 옮기고
*(cur++) 로 해당 iterator 가 가리키고있는 값을 꺼내오는 내용이 됩니다.

-----
이글을 읽는 모든 이에게 평화가 함께 하기를... ^^;

-----
이글을 읽는 모든 이에게 평화가 함께 하기를... ^^;

kewlbear의 이미지

연산자 우선순위를 착각하신 것 같습니다. 값을 먼저 꺼내오고 iterator를 이동하는 것입니다.

kslee80의 이미지

연산자 우선순위는 맞습니다. ( * 보다 ++ 이 우선순위가 높죠 )
단지, ++ 이 postfix 라서 * 가 수행된 이후에 수행될 뿐입니다.

doldori의 이미지

실은 ++이 먼저 수행됩니다.
일반적인 수식의 경우 값을 평가(evaluation)하는 과정을 거치는데,
오버로드된 연산자의 경우 이는 결국 함수호출을 뜻하지요.
a+b*c를 평가하려면 b*c를 먼저 평가해야 하듯이
*i++을 평가하려면 i++를 먼저 평가(호출)해야 합니다.

자룡의 이미지

연산자 우선순위만 생각했는데.. 잘못된 답이 되고 말았네요 죄송합니다.

일단 *cur++ 의 의미는
"현재 iterator 가 가리키는 값을 꺼내오고 iterator 는 증가시킨다" 로 이해하시면 될듯합니다.
두줄로 쓰면 *cur; ++cur; 와 같은 의미입니다.

그런데 우선순위가 ++ 가 높은데 * 가 먼저 평가되는 듯한 이유가 헷갈려서 책을 찾아봤습니다.
다음은 사후증가의 일반적 형태라고 합니다.
(후행 ++ 라고 위에 적었었는데.. 책에선 사후증가라고 하는군요;; 죄송;;)

const T T::operator++(int) ()
{
    T old(*this);   // 원래 값을 기억한다.
    ++*this;        // 사전증가를 이용하여 사후증가 구현
 
    return old;     // 원래 값을 반환한다.
}

사후증가는 값을 증가시키긴 하지만 반환값은 증가시키기 전의 값이네요.

즉, 사후증가가 우선순위 상 먼저 실행되는게 맞고
그 후 반환값을 가지고 * 를 하게 되는군요.

그래서 *cur++ 는
"iterator 를 증가시킨 후 이전에 iterator 가 가리키던 값을 반환한다." 정도가 될것 같습니다.

이거 생각보다 재미있는 문제네요. :)

-----
이글을 읽는 모든 이에게 평화가 함께 하기를... ^^;

-----
이글을 읽는 모든 이에게 평화가 함께 하기를... ^^;

doldori의 이미지

Quote:
(후행 ++ 라고 위에 적었었는데.. 책에선 사후증가라고 하는군요;; 죄송;;)

죄송할 것까지야 없겠죠.
원어로는 postfix인데, 저도 후위형, 후치형 등으로 그때그때 다르게 쓰고 있습니다. ^^;

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.