STL iterator
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®
ÇöÀçÀ§Ä¡ : article>STL_iterator



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

<a href="/modules/moniwiki/wiki.php/manSearch?google=none&name=STL">STL</a>(4) - iterator

STL(4) - iterator

À± »ó¹è

dreamyun@yahoo.co.kr



1절. Iterator

1.1절. Iterator À̶õ

¿ì¸®³ª¶ó ¸»·Î Çϸé "¹Ýº¹ÀÚ", "¼øÈ¯ÀÚ" Á¤µµ°¡ µÉ°ÍÀÌ´Ù. ±×·±µ¥ ±»ÀÌ ¹ø¿ªµÈ ¸»¿¡ ½Å°æ¾µÇÊ¿ä ¾øÀÌ C¿¡¼­ »ç¿ëµÇ´Â Æ÷ÀÎÅÍ ¶ó°í »ý°¢ÇÏ´Â°Ô °¡Àå ÀÌÇØÇϱ⠽¬¿ïµíÇÏ´Ù. ´Ù¸¥¸»·Î pointer ¸¦ °´Ã¼µî¿¡ À¯¿¬ÇÏ°Ô »ç¿ëÇÒ¼ö ÀÖµµ·Ï ÀϹÝÈ­ ½ÃŲ ¹öÁ¯ À̶ó°í ÇÒ¼ö ÀÖ´Ù. Æ÷ÀÎÅÍ¿Í ¸¶Âù°¡Áö·Î iterator ¸¦ Áõ°¡½ÃŰ°Å³ª °¨¼Ò ½ÃÅ´À¸·Î½á °´Ã¼°£À» À̵¿ÇÒ¼ö ÀÖ´Ù.

iterator ´Â ÀÚ·áÇü¿¡ ´ëÇÑ Á¤º¸¸¦ °¡Áö°í ÀÖÀ¸¸ç, ÀÌ·¯ÇÑ Á¤º¸¿¡ ¾î¶»°Ô Á¢±ÙÇØ¾ß ÇÏ´ÂÁö¿¡ ´ëÇÑ Á¤º¸¸¦ °¡Áö°í ÀÖ´Ù. Æ÷ÀÎÅͰ¡ ÀÚ·á¿¡ Á¢±ÙÇϱâ À§Çؼ­ ÁÖ¼ÒÁ¤º¸¸¦ °¡Áö°í Àִ°Ͱú ºñ½ÁÇѵ¥, iterator ´Â °´Ã¼¿¡ Á¢±ÙÇϱâÀ§ÇÑ Á¤º¸¸¦ °¡Áö°í ÀÖ´Â ¶Ç´Ù¸¥ °´Ã¼ÀÌ´Ù.

iterator ´Â ÀϹÝÈ­(generic) ÇÁ·Î±×·¡¹ÖÀ» Çϴµ¥ À־ °¡Àå ÇÙ½ÉÀÌ µÇ´Â ¿ä¼ÒÁß Çϳª·Î½á, ÄÁÅ×ÀÌ³Ê¿Í ¾Ë°í¸®Áò »çÀÌ¿¡¼­ ¼­·Î¸¦ ¿¬°á ½ÃÄÑÁÖ´Â ÀÎÅÍÆäÀ̽º(°¡±³) ¿ªÈ°À» ÇÑ´Ù(º¸Åë ¾Ë°í¸®ÁòÀº iterator ¸¦ ¾Æ±Ô¸ÕÆ®·Î ¹Þ¾ÆµéÀδÙ). ÀÌ·¸µí ¾Ë°í¸®ÁòµéÀÌ iterator ¸¦ ¹Þ¾Æ µéÀÓÀ¸·Î½á ¸¹Àº Á¾·ùÀÇ ´Ù¸¥ ÄÁÅ×À̳ʵéÀ» »ç¿ëÇÒ¼ö(Àû¿ë½Ãų¼ö) ÀÖ°Ô µÈ´Ù. ¿¹¸¦µé¾î ¾î¶² ÄÁÅ×À̳ʿ¡ sort ¾Ë°í¸®ÁòÀ» Àû¿ë½ÃŰ±â ¿øÇÑ ´Ù¸é ÄÁÅ×ÀÌ³Ê °´Ã¼¸¦ ³Ö´Â´ë½Å¿¡, sort ÇÏ°í ½ÍÀº ¹üÀ§¸¦ iterator ¸¦ ÅëÇØ ÁöÁ¤ÇÒ¼ö ÀÖÀ½À¸·Î(º¸ÅëÀº óÀ½°ú ³¡, Áï Àüü°¡ µÇ°ÚÁö¸¸) Á»´õ À¯¿¬ÇÏ°Ô ÇÁ·Î±×·¡¹Ö ÀÛ¾÷ÀÌ °¡´ÉÇÒ°ÍÀÌ´Ù.

ÀÌ·¸µí iterator ÀÇ °³³ä ÀÚü´Â °£´ÜÇÏÁö¸¸, iterator ¿¡µµ ¿©·¯°¡Áö Á¾·ù°¡ ÀÖ´Ù. Input Iterator, Output Iterator, Forward Iterator, Bidirectional Iterator, Random Access Iterator µîÀÌ ÀÖ´Ù. Çä ¹¹°¡ À̸® Á¾·ù°¡ ¸¹Áö? ¶ó°í °ÆÁ¤ÇÒ¼ö µµ ÀÖ°ÚÁö¸¸, ±×¸® °ÆÁ¤ÇÒ ÇÊ¿ä´Â ¾ø´Ù. ±×³É »ó½ÄÀû? À¸·Î »ý°¢ÇÏ¸é µÇ±â ¶§¹®ÀÌ´Ù. ´ÙÀ½Àå¿¡¼­´Â ÀÌ·¯ÇÑ Iterator ÀÇ Á¾·ù¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇÒ°ÍÀÌ´Ù.


1.2절. Output Iterator

Ãâ·Â ¹Ýº¹ÀÚ¶ó°í ºÎ¸¦¼ö ÀÖÀ¸¸ç, ¾²±â Àü¿ëÀÇ ¹Ýº¹ÀÚÀÌ´Ù. Áï ¾î¶² ÄÁÅ×À̳ʿ¡ ¿ø¼Ò¸¦ ¾²´Â°Ç °¡´ÉÇÏÁö¸¸ ÀÐÀ»¼ö´Â ¾ø´Â Á¾·ùÀÇ iterator µéÀÌ´Ù. À̵é ÀÌÅÍ·¹ÀÌÅÍ¿¡´Â ++ ¿¬»êÀÌ °¡´ÉÇÏ(.


1.2.1절. ostream_iterator<T>

Output Iterator ÀÇ °¡Àå ´ëÇ¥ÀûÀÎ iterator class ÀÌ´Ù. Ãâ·Â½ºÆ®¸²¿¡ ¾²´ÂÀÏÀ» ÇÑ´Ù.

#include <vector>
#include <string>

int main()
{
    vector<string> V;
    vector<string> V2;

    V.push_back("hello");
    V.push_back("Myname is yundream");

    copy(V.begin(), V.end(), ostream_iterator<string>(cout, "
"));
}
				
À§ÀÇ ÇÁ·Î±×·¥À» ÄÄÆÄÀÏÈÄ ½ÇÇà½Ã۸é vector V ÀÇ ¿ø¼Ò°¡ Â÷·Ê·Î È­¸é¿¡ Ãâ·ÂµÇ´Â°ÍÀ» º¼¼ö ÀÖÀ»°ÍÀÌ´Ù. ostream_iterator ÀÌ ¿Ö Output Iterator ÀÎ ÀÌÀ¯´Â ÇØ´ç ostream ¿¡ ¾²±â(Output) Àü¿ëÀ̱⠶§¹®ÀÌ´Ù. ±âº»ÀûÀ¸·Î Output Iterator ¿¡ ¼ÓÇÏ´Â iterator µéÀº ¾²±â Àü¿ëÀÌ´Ù. ¹Ý´ë·Î Input Iterator ¿¡ ¼ÓÇÏ´Â iterator µéÀº Àбâ Àü¿ëÀϰÍÀÌ´Ù.

¸¸¾à À§ÀÇ Äڵ带 copy(V.begin(), V.end(), V2.begin()); À¸·Î ¹Ù²Ù¸é ¾î¶»°Ô µÉ±î ? ÄÄÆÄÀÏÀº ¹®Á¦¾øÀÌ µÇÁö¸¸ ½ÇÇà½Ã ¹®Á¦°¡(¾Æ¸¶µµ ¼¼±×¸àÅ×ÀÌ¼Ç ¿À·ù) »ý±â¸é¼­ ½ÇÇàÀÌ Áß´ÜµÉ °ÍÀÌ´Ù. V2.begin()ÀÌ ³Ñ°ÜÁÖ´Â iterator ´Â ¾î¶°ÇÑ ¿ëµµ·Îµµ »ç¿ë°¡´ÉÇÏÁö¸¸, V2 ÄÁÅ×À̳ÊÀÇ »çÀÌÁî°¡ ÀÚµ¿ÀûÀ¸·Î ÇÒ´çµÇ¾î ÀÖÁö ¾Ê´Ù´Â°Ô ¹®Á¦°¡ µÇ±â ¶§¹®ÀÌ´Ù. copy ¾Ë°í¸®ÁòÀº ÄÁÅ×À̳ÊÀÇ °ø°£À» ÀÚµ¿À¸·Î ÇÒ´çÇØÁÖ´Â ±â´ÉÀ» °¡Áö°í ÀÖÁö ¾Ê´Ù. ¹°·Ð À̹®Á¦´Â ÄÁÅ×À̳ÊÀÇ Å©±â¸¦ ÀÚµ¿À¸·Î ´Ã·ÁÁÖ´Â ´Ù¸¥ ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ÇØ°á°¡´ÉÇÏ´Ù. ÀÌ °ÍÀº ÀÌ ´ÙÀ½Àå¿¡¼­ °£´ÜÇÏ°Ô ´Ù·ç°Ô µÉ°ÍÀÌ´Ù.

copy ´Â STL ¿¡¼­ Á¦°øÇÏ´Â Algorithms ÀÇ Çϳª·Î iterator ·Î ÁÖ¾îÁø ÀÏÁ¤ÇÑ ¹üÀ§ÀÇ ¿ä¼ÒµéÀ» Ä«ÇÇÇϱâ À§Çؼ­ »ç¿ëµÈ´Ù. Ä«ÇÇ´Â ¾²±â(Output) ÇàÀ§ À̹ǷΠOutput iterator À» »ç¿ëÇØ¾ß¸¸ ÇÒ°ÍÀÌ´Ù. ±×·¡¼­ ¸¶Áö¸· ÀÎÀÚ°¡ Output iterator ÀÎ ostream_iterator ÀÌ ¾²¿´´Ù. ¾ÕÀ¸·Î´Â copy ¾Ë°í¸®ÁòÀ» ÅëÇØ¼­ iterator Ŭ·¡½º¸¦ ¼³¸íÇÒ°ÍÀÌ´Ù. copy ´Â ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÇ¾î ÀÖ´Ù.

OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result);
				


1.2.2절. front_insert_iterator<FrontInsertionSequence>

À§ÀÇ ostream_iterator Àº ½ºÆ®¸² ¾²±â¿ëµµµµ·Î »ç¿ëµÇ´Â Á» ƯÀÌÇÑ °æ¿ì¶ó°í ÇÒ¼ö ÀÖ´Ù. ¿©±â¿¡ front_insert_iterator À̶ó´Â Á»´õ STL ´Ù¿î, ¾²±âÀü¿ë iterator °¡ ÀÖ´Ù. À̸§¿¡¼­ ¾Ë¼ö ÀÖµíÀÌ ÀÌ iterator Àº ÄÁÅ×À̳ÊÀÇ °¡Àå ¾ÕºÎºÐ¿¡ ¿ø¼Ò¸¦ »ðÀÔÇϰíÀÚ ÇÒ¶§ »ç¿ëÇÒ¼ö ÀÖ´Ù.

#include <list>
#include <vector>

int main()
{
    list<int> L;
    L.push_front(3);

    front_insert_iterator<list<int> > ml(L);

    *ml++ = 0;
    *ml++ = 1;
    *ml++ = 2;

    copy(L.begin(), L.end(), ostream_iterator<int>(cout, " "));
}
				
À§ÀÇ Äڵ带 ½ÇÇà½ÃÄÑ º¸¸é "2 1 0 3" ÀÇ ¼ø¼­·Î È­¸é¿¡ Ãâ·ÂµÊÀ» º¼¼ö ÀÖÀ»°ÍÀÌ´Ù.

À§ÀÇ ÄÚµå´Â list ¸¦ »ç¿ëÇߴµ¥, list ´ë½Å deque ¸¦ ±×´ë·Î »ç¿ëÇØµµ ¹®Á¦ ¾øÀÌ ½ÇÇàµÈ´Ù. ±×·¯³ª vector À» »ç¿ëÇÒ°æ¿ì¿¡´Â ¹®Á¦°¡ µÈ´Ù. ¿Ö³ÄÇϸé list ¿Í deque °°Àº °æ¿ì¿¡´Â ÄÁÅ×À̳ÊÀÇ °¡Àå ¾Õ¿¡ ¿ø¼Ò¸¦ »ðÀÔÇϱâ À§ÇÑ push_front() ÇÔ¼ö¸¦ Áö¿øÇÏÁö¸¸, vector Àº Áö¿øÀÌ ¾ÈµÇ±â ¶§¹®ÀÌ´Ù. ÀÌÀ¯´Â ¾Ë°ÚÁö¸¸, vector ÄÁÅ×ÀÌ³Ê ¾Õ¿¡ ¿ø¼Ò¸¦ »ðÀÔÇϴ°ÍÀº ³Ê¹« ºñÈ¿À²ÀûÀ̱⠶§¹®ÀÌ´Ù.


1.2.3절. back_insert_iterator<BackInsertionSequence>

À§ÀÇ fornt_insert_iterator °ú´Â ¹Ý´ë·Î ÄÁÅ×À̳ÊÀÇ °¡Àå µÚ¿¡ ¿ø¼Ò¸¦ »ðÀÔÇϱâ À§Çؼ­ »ç¿ëÇÑ´Ù.

#include <list>
#include <vector>

int main()
{
    list<int> L;
    L.push_front(3);

    back_insert_iterator<list<int> > ml(L);

    *ml++ = 0;
    *ml++ = 1;
    *ml++ = 2;

    copy(L.begin(), L.end(), ostream_iterator<int>(cout, " "));
}
				
À§ÀÇ ÇÁ·Î±×·¥À» ½ÇÇà½ÃÄѺ¸¸é Ãâ·Â°á°ú°¡ "3 0 1 2" ·Î ³ª¿Ã°ÍÀÌ´Ù.

À§ÀÇ list ´Â deque ·Î ´ë½Å »ç¿ëÇÒ¼öµµ ÀÖ´Ù. ¶ÇÇÑ front_insert_iterator °ú´Â ´Þ¸® vector ¿¡µµ Àû¿ë°¡´ÉÇÏ´Ù. µÚ¿¡ ¿ø¼Ò¸¦ »ðÀÔÇϴ°Ŷó¸é vector µµ È¿À²ÀûÀ¸·Î ¼öÇàÀÌ °¡´ÉÇϱ⠶§¹®ÀÌ´Ù.


1.2.4절. insert_iterator<Container>

insert_iterator ´Â ´Ù¸¥ ÄÁÅ×À̳ʿ¡ Output Iterator ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇØÁÖ±â À§ÇÑ iterator adaptor ·Î »ç¿ëµÈ´Ù.

#include <list>

int main()
{
    list<int> L;
    L.push_front(3);
    L.push_front(4);

    insert_iterator<list<int> > ii(L, L.begin());


    *ii++ = 0;
    *ii++ = 1;
    *ii++ = 2;
    copy(L.begin(), L.end(), ostream_iterator<int>(cout, " "));
}
				
À§ÀÇ Äڵ带 ½ÇÇà½Ã۸é "0 1 2 4 3"À¸·Î °á°ú°¡ Ãâ·ÂµÉ°ÍÀÌ´Ù. insert_iterator ´Â ´Ù¸¥ Output iterator µé°ú´Â ´Þ¸® 2°³ÀÇ ¾Æ±Ô¸ÕÆ®¸¦ °¡Áø´Ù. Ãß°¡µÈ ¾Æ±Ô¸ÕÆ®´Â insert ÇÒ À§Ä¡¸¦ ¾Ë·ÁÁÖ±â À§Çؼ­ »ç¿ëµÈ´Ù. ¶Ç´Ù¸¥ ¿¹¸¦ Çϳª µé¾î º¸°Ú´Ù.
#include <vector>
#include <set>
#include <algorithm>

int main()
{
    int A1[] = {1, 3, 5, 7, 9 ,11};
    int B1[] = {1, 2, 3, 4, 5, 6};

    vector<int> A;
    vector<int> B;
    set<int> Result;

    copy(&A1[0], &A1[6], back_inserter(A));
    copy(&B1[0], &B1[6], back_inserter(B));

    merge(A.begin(), A.end(), B.begin(), B.end(),
        inserter(Result, Result.begin()) );

    copy(Result.begin(), Result.end(), ostream_iterator<int>(cout, " "));

    cout << endl;
}
				
ÀÌ ¿¹Á¦´Â ¸¹Àº °ÍÀ» Æ÷ÇÔÇϰí ÀÖ´Ù. ¹è¿­ÀÌ ¾î¶»°Ô iterator ó·³ »ç¿ëµÉ¼ö ÀÖ´ÂÁö (ÀÌ¹Ì iterator ¸¦ Æ÷ÀÎÅÍó·³ »ç¿ëÇÒ¼ö ÀÖ´Ù°í ¾Õ¿¡¼­ ¾ð±ÞÇÑÀûÀÌ ÀÖ´Ù.), ±×¸®°í iterator ¸¦ ¾î¶»°Ô ¾Ë°í¸®Áò¿¡ Àû¿ë½Ãų¼ö ÀÖ´ÂÁö¸¦ º¸¿©ÁØ´Ù. À§ÀÇ ÇÁ·Î±×·¥Àº ¸ÕÀú ¹è¿­ A1, B1 À» °¢°¢ vector A, B ¿¡ ÀÔ·ÂÇÑ´Ù. ±×´ÙÀ½ merge ¸¦ ÀÌ¿ëÇØ¼­ A ¿Í B ÀÇ °ªÀ» set ÄÁÅ×À̳ÊÀÎ Result ¿¡ ÀÔ·ÂÇÑ´Ù. set Àº Á¤·Ä¿¬°ü ÄÁÅ×ÀÌ³Ê ÀÓÀ¸·Î A ¿Í B ÀÇ °ªÀº ¼­·Î Á¤·ÄµÇ¾î¼­ °áÇÕµÇ°Ô µÉ°ÍÀÌ´Ù. ±×·¯¹Ç·Î À§ÀÇ ÄÚµå ½ÇÇà °á°ú´Â "1 2 3 4 5 6 7 9 11" ÀÌ µÉ°ÍÀÌ´Ù.


1.3절. Input Iterator

ÀԷ¹ݺ¹ÀÚ¶ó°í ºÒ¸®¿ì¸ç, ÀбâÀü¿ëÀÇ ¹Ýº¹ÀÚÀÌ´Ù. Output Iterator °ú Á¤¹Ý´ëÀÇ Iterator ÀÌ´Ù. ¸¶Âù°¡Áö·Î ++ ¿¬»êÀ» ÅëÇØ¼­ ÇÑÂʹæÇâÀ¸·Î ¼øÈ¯ÀÌ °¡´ÉÇϵµ·Ï µÇ¾î ÀÖ´Ù.


1.3.1절. istream_iterator<T>

ÀԷ¹ݺ¹ÀÚÀÇ °¡Àå ´ëÇ¥ÀûÀÎ iterator class ÀÌ´Ù. ½ºÆ®¸³¿¡ ÀÔ·ÂµÈ °ªÀ» Àд ÀÏÀ»ÇÑ´Ù. À§¿¡ ostream_iterator À» ÀÌ¿ëÇØ¼­ È­¸é¿¡ Ãâ·Â½ÃÄ×´ø ÇÁ·Î±×·¥À» Űº¸µå·Î ºÎÅÍ ÀԷ¹޴ ÇÁ·Î±×·¥À¸·Î º¯°æÇغ¸ÀÚ.

#include <vector>
#include <string>

int main()
{
    vector<string> V;

    copy(istream_iterator<string>(cin), istream_iterator<string>(),
        back_inserter(V));

    vector<string>::iterator mi;
    mi = V.begin();

    while(mi != V.end())
    {
        cout << *mi << endl;
        *mi++;
    }
}
				
À§ÀÇ Äڵ带 ÄÄÆÄÀÏÈÄ ½ÇÇà½ÃÄÑ º¸¸é Űº¸µå ÀÔ·ÂÀ» ¹Þ¾Æ¼­ vector V ¿¡ Űº¸µå ÀÔ·ÂÀÌ ÀúÀåµÇ´Â°ÍÀ» º¼¼ö ÀÖÀ»°ÍÀÌ´Ù.

ÀÌÄڵ带 º¸¸é ¾Ë°ÚÁö¸¸ vector V ¿¡ ¿ø¼Ò¸¦ Áý¾î ³Ö´Â ¹®Á¦¸¦ ÇØ°áÇßÀ½À» ¾Ë¼ö ÀÖ´Ù. ¹Ù·Î back_inserter À̶ó´Â ÇÔ¼ö¸¦ »ç¿ëÇØ¼­ ÇØ°áÇߴµ¥, À̰ÍÀº iterator adaptor ÀÌ´Ù. Áï Output Iterator ¸¦ »ç¿ëÇÒ¼ö ÀÖµµ·Ï ÀÎÅÍÆäÀ̽º(°¡±³)¸¦ Á¦°øÇØÁÖ´Â ¿ªÈ°À» ÇÑ´Ù.


1.4절. Forward Iterator

¼ø¹æÇ⠹ݺ¹ÀÚÀ̸ç, ÇÑÂʹæÇâÀ¸·Î ÁøÇàÇϸç Àбâ/¾²±â°¡ ¸ðµÎ °¡´ÉÇÑ ÇüÅÂÀÇ Iterator ÀÌ´Ù. ´ÙÁß ÆÐ½º ¾Ë°í¸®ÁòÀ» Àû¿ëÇϱâ À§Çؼ­ »ç¿ëµÉ¼ö ÀÖ´Ù. forward Iterator ¸¦ »ç¿ëÇÏ´Â ´ëÇ¥ÀûÀÎ ¾Ë°í¸®ÁòÀ¸·Î replace ¶ó´Â ¾Ë°í¸®ÁòÀÌ ÀÖ´Ù.

  	
template <class ForwardIterator, class T>
void replace(ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value)
			
ÀÌ ¾Ë°í¸®ÁòÀº ÇÑÂʹæÇâÀ¸·Î ÁøÇàÇϸ鼭 ÄÁÅ×À̳ÊÀÇ ¿ø¼Ò¸¦ ÀÐ¾î µéÀÌ°í ¶ÇÇÑ ±× ÀÚ¸®¿¡¼­ ¾²±â ±îÁö °¡´ÉÇÏ´Ù. ´ÜÁö Àб⸸ °¡´ÉÇϰųª ¾²±â¸¸ °¡´ÉÇÑ Input/Output Iterator ¿Í ºñ±³ µÇ´Â ±â´ÉÀÌ´Ù.
#include <vector>
#include <algorithm>

int main()
{
    vector<int> V;
    V.push_back(1);
    V.push_back(1);
    V.push_back(2);
    V.push_back(3);
    V.push_back(1);
    V.push_back(4);

    replace(V.begin(), V.end(), 1, 5);

    for (int i = 0; i < V.size(); i++)
        cout << V[i] << endl;
}
			
½ÇÇà½ÃÄÑ º¸¸é ¸ðµç 1 ÀÌ 5·Î ġȯµÇ¾î ÀÖÀ½À» ¾Ë¼ö ÀÖ´Ù.


1.5절. Bidirectional Iterator

Áö±Ý±îÁöÀÇ Iterator ´Â ÇѹæÇâÀ¸·Î¸¸ ¼øÈ¯ÀÌ °¡´ÉÇß´Ù. Áï Iterator ¿¡ ´ëÇÑ ++ ¿¬»ê¸¸ °¡´ÉÇß´Ù ¹Ù¸é Bidirectional À̶õ À̸§¿¡¼­ ¾Ë¼ö ÀÖµíÀÌ ÀÌ Iterator ´Â ¾ç¹æÇâ ¸ðµÎ·ÎÀÇ ¼øÈ¯ÀÌ °¡´ÉÇÏ´Ù. ±âº»ÀûÀΠƯ¡Àº Forward Iterator °ú °°´Ù.

¾ç¹æÇ⠹ݺ¹ÀÚ¸¦ ÇÊ¿ä·Î ÇÏ´Â °¡Àå ´ëÇ¥ÀûÀÎ ¾Ë°í¸®ÁòÀ¸·Î reverse ¾Ë°í¸®ÁòÀÌ ÀÖ´Ù.

template <class BidirectionalIterator>
void reverse(BidirectionalIterator first, BidirectionalIterator last);
			
reverse ´Â ÄÁÅ×À̳ÊÀÇ ¿ø¼Ò¸¦ µÚÁý´Â ÀÏÀ»ÇÑ´Ù. ±×·¯¹Ç·Î ÀÌ ÀÏÀ» È¿À²ÀûÀ¸·Î ¼öÇàÇϱâ À§Çؼ­´Â ÄÁÅ×À̳ÊÀÇ ½ÃÀÛ°ú ³¡¿¡ µ¿½Ã¿¡ Á¢±ÙÇØ¼­ ¿ø¼Ò¸¦ ¼­·Î ¹Ù²ãÁÙ¼ö ÀÖµµ·Ï µÇ¾î¾ß ÇÑ´Ù. ±×·¯±â À§Çؼ­´Â Iterator ¿¡ ´ëÇÑ ++, -- ¿¬»êÀÌ °¡´ÉÇØ¾ß Çϸç, Àбâ/¾²±â°¡ °¡´ÉÇØ¾ß ÇÑ´Ù. Bidirectional ÀÌÅÍÆäÀÌÅÍ´Â ±×·¯ÇÑ ±â´ÉÀ» Á¦°øÇØÁØ´Ù.
#include <vector>
#include <algorithm>

int main()
{
    vector<int> V;
    V.push_back(1);
    V.push_back(2);
    V.push_back(3);
    V.push_back(4);

    reverse(V.begin(), V.end());

    for (int i = 0; i < V.size(); i++)
        cout << V[i] << endl;
}
			
À§ÀÇ Äڵ带 ½ÇÇà½ÃÄÑ º¸¸é vector ÀÇ ¿ä¼ÒµéÀÌ µÚÁý¾îÁ® ÀÖÀ½À» ¾Ë¼ö ÀÖÀ»°ÍÀÌ´Ù.


1.6절. Random Access Iterator

À̰ÍÀº Bidirectional Iterator ÀÇ Æ¯Â¡ÀÎ ¾ç¹æÇâ¼øÈ¯ÀÇ Æ¯Â¡¿Ü¿¡µµ ·£´ýÇÏ°Ô ¿ø¼Ò¿¡ Á¢±ÙÇÒ¼ö Àִ Ư¡À» Á¦°øÇÑ´Ù. ´Ù¸¥ Iterator µéÀÌ ÄÁÅ×À̳ʸ¦ ¼øÈ¸Çϱâ À§Çؼ­ °¢¿ø¼Ò¿¡ Â÷·Ê´ë·Î Á¢±ÙÇß´ø°Í°ú´Â ´Ù¸£´Ù.

¿¹¸¦µé¾î ¾î¶² ÄÁÅ×À̳ʿ¡ ´ëÇØ¼­ binary search ¸¦ ¼öÇàÇÑ´Ù°í °¡Á¤ÇØ º¸ÀÚ, binary serach ÀÇ Æ¯¼º»ó Iterator ´Â ÄÁÅ×À̳ÊÀÇ ÀÓÀÇ ÁöÁ¡¿¡ Á¢±ÙÀÌ °¡´ÉÇØ¾ß search °¡ È¿À²ÀûÀ¸·Î ÀÌ·ç¾îÁú¼ö ÀÖÀ»°ÍÀÌ´Ù.

#include <vector>
#include <algorithm>

int main()
{
    vector<int> V;
    V.push_back(1);
    V.push_back(2);
    V.push_back(3);
    V.push_back(5);
    V.push_back(7);
    V.push_back(10);
    V.push_back(4);

    cout << binary_search(V.begin(), V.end(), 10) << endl;
}
			

binary_search ´Â ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾî ÀÖ´Ù.

bool binary_search(ForwardIterator first, ForwardIterator last,
                   const LessThanComparable& value);
			


2절. °á·Ð

ÀÌ»ó Iterator ÀÇ Á¾·ù¿Í Ư¼º¿¡ ´ëÇØ¼­ °£´ÜÈ÷ ¾Ë¾Æº¸¾Ò´Ù. ²Ï È¥µ¿µÉ¼ö Àִµ¥ ±×³É »ó½ÄÀûÀ¸·Î »ý°¢ÇÏ¸é µÈ´Ù.

¿¹¸¦µé¾î vector, deque, list µîÀÇ Sequence container µéÀº ÀÓÀÇ Á¢±ÙÀÌ °¡´ÉÇϹǷΠ´ç¿¬È÷ Random Access Iterator ¸¦ »ç¿ëÇÒ¼ö ÀÖÀ»°ÍÀ̸ç, ¸¶Âù°¡Áö·Î ÀÌ·¯ÇÑ Iterator ¸¦ »ç¿ëÇÏ´Â ¾Ë°í¸®Áòµéµµ »ç¿ëÇÒ¼ö ÀÖÀ» °ÍÀÌ´Ù.

±×·¯³ª map, set µî°ú °°Àº association container ¿¡´Â »ç¿ëÇÒ¼ö ¾øÀ»°ÍÀÌ´Ù.

Iterator ¸¦ »ç¿ëÇÏ´Â ÀÌÀ¯´Â °¡Àå °£´ÜÇÏ°Ô ºÃÀ»¶§ ÄÁÅ×À̳ʿø¼Ò¿¡ Á¢±ÙÇϱâ À§ÇÑ ¿ëµµÀ̸ç, ƯÈ÷ ¾Ë°í¸®ÁòÀ» Àû¿ë½Ã۱â À§ÇÑ ¸ñÀûÀ¸·Î »ç¿ëÇÑ´Ù. ±×¸®°í ¾Ë°í¸®Áò¿¡ µû¶ó¼­ ¹Þ¾ÆµéÀϼö ÀÖ´Â Iterator ÀÇ Á¾·ù°¡ ´Ù¸¦¼ö ÀÖÀ½À¸·Î °¢ ÄÁÅ×À̳ʰ¡ ¾î¶°ÇÑ Iterator ¸¦ µÇµ¹·ÁÁÙ¼ö ÀÖ´ÂÁö ¾Ë°í ÀÖ¾î¾ß ÇÑ´Ù. ¸Ó ±×·¸´Ù°í °ÆÁ¤ÇÒ ÇÊ¿ä´Â ¾ø´Ù. ´©Â÷ ¸»ÇßµíÀÌ ±×³É »ó½ÄÀûÀ¸·Î »ý°¢ÇÏ¸é µÇ±â ¶§¹®ÀÌ´Ù.

EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.