.1 ¹Ýº¹ÀÚ¿¡ ´ëÇÑ ¼Ò°³ [Image] ¹Ýº¹ÀÚ(iterator) ¹Ýº¹ÀÚ(iterator)¶õ °³³äÀº Ç¥ÁØ ¶óÀ̺귯¸®°¡ Á¦°øÇÏ´Â ÄÁÅ×ÀÌ³Ê Å¬·¡½º¿Í ¾Ë°í¸®µëµéÀ» »ç¿ëÇÒ ¶§ ¹Ýµå½Ã ¾Ë¾ÆµÎ¾î¾ß ÇÒ Áß¿äÇÑ °³³äÀÌ´Ù. Á» Ãß»óÀûÀ¸·Î ¸»ÇÏÀÚ¸é, ¹Ýº¹ÀÚ¶õ ÄÁÅ×À̳ʿ¡ ÀúÀåµÇ¾î ÀÖ´Â ¸ðµç ¿ø¼ÒµéÀ» ÀüüÀûÀ¸·Î ÈȾ°¥ ¶§ »ç¿ëÇÏ´Â, ÀÏÁ¾ÀÇ Æ÷ÀÎÅÍ¿Í ºñ½ÁÇÑ °´Ã¼¶ó°í ÇÒ ¼ö ÀÖ´Ù. ¾Ë°í¸®µë¸¶´Ù °¢±â ´Ù¸¥ ¹æ½ÄÀ¸·Î ÄÁÅ×À̳ʸ¦ ÈȾ±â ¶§¹®¿¡, ¹Ýº¹ÀÚ¿¡µµ ¿©·¯°¡Áö Á¾·ù°¡ ÀÖ°Ô µÈ´Ù. ÇÁ·Î±×·¡¸Ó´Â Ç¥ÁØ ¶óÀ̺귯¸®¿¡¼­ Á¦°øÇÏ´Â ÄÁÅ×À̳ʵ鿡 ¾Ë¸Â´Â ¹Ýº¹ÀÚ¸¦ »ý¼ºÇÒ ¼ö ÀÖ´Ù. ƯÁ¤ ¾Ë°í¸®µëÀÌ ¾î¶² ÄÁÅ×ÀÌ³Ê¿Í ÇÔ²² »ç¿ëÇÒ ¼ö Àִ°¡´Â ¾î¶² Á¾·ùÀÇ ¹Ýº¹ÀÚ¸¦ ÀÎÀÚ·Î ¿ä±¸ÇÏ´À³Ä¿¡ µû¶ó °áÁ¤µÈ´Ù. [Image] ±¸°£(range) Æ÷ÀÎÅÍ°¡ ±âÁ¸ ÇÁ·Î±×·¡¹Ö¿¡¼­ ´Ù¾çÇÑ ¹æ¹ýÀ¸·Î »ç¿ëµÇµíÀÌ, ¹Ýº¹ÀÚµµ ´Ù¾çÇÑ ¸ñÀûÀ¸·Î »ç¿ëµÉ ¼ö ÀÖ´Ù. Æ÷ÀÎÅÍ°¡ ƯÁ¤ ¸Þ¸ð¸® À§Ä¡¸¦ ÂüÁ¶Çϴµ¥ »ç¿ëµÉ ¼ö ÀÖµíÀÌ, ¹Ýº¹ÀÚµµ ƯÁ¤ °ªÀ» ÁöÁ¤Çϴµ¥ »ç¿ëµÉ ¼ö ÀÖ´Ù. ¶ÇÇÑ, ¿¬¼ÓÀûÀÎ ¸Þ¸ð¸® ¿µ¿ªÀ» µÎ°³ÀÇ Æ÷ÀÎÅÍ·Î ³ªÅ¸³»µíÀÌ, ÇѽÖÀÇ ¹Ýº¹ÀÚ´Â °ªµéÀÇ ±¸°£(range)À» ¼³Á¤Çϴµ¥ »ç¿ëµÉ ¼ö ÀÖ´Ù. ±×·¯³ª, ¹Ýº¹ÀÚÀÇ °æ¿ì¿¡´Â, ¼³Á¤µÇ´Â ¹üÀ§³»ÀÇ °ªµéÀÌ ¹Ýµå½Ã ¹°¸®ÀûÀ¸·Î ¿¬¼ÓÀûÀ̾î¾ß ÇÒ ÇÊ¿ä°¡ ¾ø´Ù. ´Ü, ¨ç ÀÌ µÎ°³ÀÇ ¹Ýº¹ÀÚ°¡ °°Àº ÄÁÅ×À̳ʷκÎÅÍ »ý¼ºµÈ °ÍÀ̾î¾ß Çϸç, ¨è µÎ¹ø° ¹Ýº¹Àڴ ù¹ø° ¹Ýº¹ÀÚ ÀÌÈÄ¿¡ ¿Í¾ßÇÑ´Ù. ±×¸®°í, ù¹ø° ¹Ýº¹ÀÚ¿¡¼­ µÎ¹ø° ¹Ýº¹ÀÚ±îÁö Â÷·Ê·Î ÄÁÅ×ÀÌ³Ê ³»ºÎÀÇ ¿ø¼ÒµéÀ» ó¸®ÇÏ°Ô µÇ¹Ç·Î, ³í¸®ÀûÀÎ ¿¬¼Ó¼ºÀ» Áö´Ñ´Ù°í ÇÒ ¼ö ÀÖ°Ú´Ù. ±âÁ¸ÀÇ Æ÷ÀÎÅÍ´Â »óȲ¿¡ µû¶ó, ³Î(Null)°ªÀ» °¡Áú ¼ö°¡ Àִµ¥, ÀÌ´Â ¾Æ¹«°Íµµ °¡¸®Å°Áö ¾Ê´Â´Ù´Â ÀǹÌÀÌ´Ù. ¹Ýº¹ÀÚµµ ¸¶Âù°¡ÁöÀÌ´Ù. ³Î Æ÷ÀÎÅ͸¦ ÂüÁ¶ÇÏ´Â °ÍÀÌ ³í¸®ÀûÀÎ ¿¡·¯¸¦ À¯¹ßÇÒ ¼ö ÀÖµíÀÌ, ¾î¶² °ªµµ °¡¸®Å°Áö ¾Ê´Â ¹Ýº¹ÀÚ¸¦ ÂüÁ¶ÇÏ´Â °ÍÀº ¿¡·¯¸¦ À¯¹ßÇÑ´Ù. C++ ÇÁ·Î±×·¥¿¡¼­ ¸Þ¸ð¸®ÀÇ ÇÑ ¿µ¿ªÀ» Ç¥½ÃÇϱâ À§ÇØ µÎ°³ÀÇ Æ÷ÀÎÅ͸¦ »ç¿ëÇÏ´Â °æ¿ì, ³¡À» ³ªÅ¸³»´Â Æ÷ÀÎÅÍ´Â ¿µ¿ªÀÇ ÀϺηΠ°£ÁÖµÇÁö ¾Ê´Â °ÍÀÌ º¸ÅëÀÌ´Ù. ¿¹¸¦ µé¾î¼­, Å©±â°¡ 10ÀÎ ¹è¿­ x¸¦ x¿¡¼­ x+10±îÁöÀÇ ¸Þ¸ð¸® ¿µ¿ª¿¡ °ÉÃÄÀÖ´Ù°í Ç¥ÇöÇÒ ¼ö Àִµ¥, x+10¿¡ À§Ä¡ÇÑ ¿ø¼Ò´Â ¹è¿­ÀÇ ÀϺΰ¡ ¾Æ´Ï´Ù. ´ë½Å, x+10À̶ó´Â Æ÷ÀÎÅÍ °ªÀº past-the-end¶ó°í ºÒ¸®¿î´Ù. ¹Ýº¹ÀÚµµ ±¸°£À» ¼³Á¤Çϴµ¥ ÀÖ¾î ÀÌ¿Í ºñ½ÁÇÑ ¹æ¹ýÀ» »ç¿ëÇÑ´Ù. µÎ¹ø° °ªÀº ±¸°£ÀÇ ÀϺηΠÀÎÁ¤µÇÁö ¾Ê´Â´Ù. ´ë½Å¿¡, µÎ¹ø° °ªÀº past-the-end ¿ø¼Ò¶ó°í Çϸç, ±¸°£ÀÇ ¸¶Áö¸· ¿ø¼Ò ´ÙÀ½¿¡ À§Ä¡ÇÑ ¿ø¼Ò¸¦ ÁöĪÇÑ´Ù. ¸Þ¸ð¸®¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍÀÇ °æ¿ìó·³, ÀÌ past-the-end ¿ø¼Ò°¡ ½ÇÁúÀûÀÎ °ªÀ» °¡Áú ¼öµµ ÀÖ°í, ¶Ç ¾î¶² ¶§´Â past-the-end¸¦ À§ÇØ µû·Î Á¤ÇصР°ªÀ» »ç¿ëÇϱ⵵ ÇÑ´Ù. ¾î·µç, ¹üÀ§ÀÇ ³¡À» ³ªÅ¸³»´Â ¹Ýº¹ÀÚ¸¦ ÂüÁ¶ÇÏ´Â °ÍÀº ÇÇÇØ¾ß ÇÑ´Ù. [Image] end()´Â ³¡ÀÌ ¾Æ´Ï´Ù? ±âÁ¸ÀÇ Æ÷ÀÎÅÍ¿Í °°ÀÌ, ¹Ýº¹ÀÚ¸¦ ¼öÁ¤ÇÏ´Â ±âº»ÀûÀÎ ¿¬»êÀº Áõ°¡ ¿¬»êÀÚ(++)ÀÌ´Ù. ¾î¶² ½ÃÄö½ºÀÇ ¸¶Áö¸· ¿ø¼Ò¸¦ ÁöĪÇÏ´Â ¹Ýº¹ÀÚ¿¡ Áõ°¡ ¿¬»êÀÚ¸¦ Àû¿ë½ÃÅ°¸é, ÀÌ ¹Ýº¹ÀÚ´Â past-the-end °ªÀ» °¡Áö°Ô µÈ´Ù. ¸¸¾à¿¡ ¹Ýº¹ÀÚ i¿¡ À¯ÇѹøÀÇ Áõ°¡ ¿¬»êÀÚ¸¦ Àû¿ëÇÏ¿©, ¹Ýº¹ÀÚ i°¡ j¿Í °°¾ÆÁú ¼ö ÀÖ´Ù¸é, ¹Ýº¹ÀÚ j´Â ¹Ýº¹ÀÚ i·ÎºÎÅÍ µµ´Þ°¡´É(reachable)ÇÏ´Ù°í ºÎ¸¥´Ù. [Image] ¹Ýº¹ÀÚ ±¸°£(iterator range) ±¸°£À» »ç¿ëÇÏ¿© ÄÁÅ×ÀÌ³Ê ¿ø¼Òµé Àüü¸¦ ÁöĪÇÒ ¼ö Àִµ¥, À̴ ù¹ø° ¿ø¼Ò¸¦ °¡¸®Å°´Â ¹Ýº¹ÀÚ¿Í ³¡À» °¡¸®Å°´Â ¹Ýº¹ÀÚ·Î ±¸¼ºÇÑ´Ù. ¶ÇÇÑ, ±¸°£À» »ç¿ëÇÏ¿© ÄÁÅ×À̳ʳ»ÀÇ ÀϺΠ½ÃÄö½º¸¦ ÁöĪÇÒ ¼öµµ ÀÖ´Ù. µÎ°³ÀÇ ¹Ýº¹ÀÚ¸¦ »ç¿ëÇÏ¿© ±¸°£À» ÁöÁ¤ÇÒ ¶§´Â, µÎ¹ø° ¹Ýº¹Àڴ ù¹ø° ¹Ýº¹ÀڷκÎÅÍ µµ´Þ°¡´É(reachable)ÇØ¾ß ÇÑ´Ù. ¾Ë°í¸®µë¿¡¼­´Â ÀÌ Á¶°ÇÀ» È®ÀÎÇÏÁö ¾Ê°í »ç¿ëÇϱ⠶§¹®¿¡, ÀÌ Á¶°ÇÀÌ ¸¸Á·µÇÁö ¾ÊÀ¸¸é, ¿¡·¯¸¦ À¯¹ßÇÏ°Ô µÈ´Ù. ÀÌÁ¦ºÎÅʹ ǥÁØ ¶óÀ̺귯¸®¿¡¼­ »ç¿ëµÇ´Â ¹Ýº¹ÀÚµéÀÇ Á¾·ù¿Í ¹Ýº¹ÀÚ °ü·Ã ÇÔ¼öµéÀ» ¼³¸íÇÑ´Ù. 2.2 ¹Ýº¹ÀÚÀÇ Á¾·ù Ç¥ÁØ ¶óÀ̺귯¸®¿¡¼­ »ç¿ëµÇ´Â ¹Ýº¹ÀÚµéÀº ±âº»ÀûÀ¸·Î ´ÙÀ½ 5°¡Áö Çüŵé·Î ³ª´­ ¼ö ÀÖ´Ù. ÀÔ·Â ¹Ýº¹ÀÚ(input iterator) Àб⸸ °¡´É, ¼ø¹æÇâ À̵¿ Ãâ·Â ¹Ýº¹ÀÚ(output iterator) ¾²±â¸¸ °¡´É, ¼ø¹æÇâ À̵¿ ¼ø¹æÇ⠹ݺ¹ÀÚ(forward iterator) Àбâ/¾²±â ¸ðµÎ °¡´É, ¼ø¹æÇâ À̵¿ ¾ç¹æÇ⠹ݺ¹ÀÚ(bidirectional iterator) Àбâ/¾²±â ¸ðµÎ °¡´É, ¼ø¹æÇâ/¿ª¹æÇâ À̵¿ ÀÓÀÇ Á¢±Ù ¹Ýº¹ÀÚ(random access Àбâ/¾²±â ¸ðµÎ °¡´É, ÀÓÀÇÁ¢±Ù iterator) ¹Ýº¹ÀÚ´Â °èÃþÀûÀ¸·Î ºÐ·ùµÈ´Ù. ¼ø¹æÇ⠹ݺ¹ÀÚ´Â ÀÔ·Â ¹Ýº¹ÀÚ¿Í Ãâ·Â ¹Ýº¹ÀÚ¸¦ ÇÊ¿ä·ÎÇÏ´Â °÷À̶ó¸é ¾ðÁ¦µçÁö »ç¿ëµÉ ¼ö ÀÖÀ¸¸ç, ¾ç¹æÇ⠹ݺ¹ÀÚ´Â ¼ø¹æÇ⠹ݺ¹ÀÚ°¡ ¿Ã ¼ö ÀÖ´Â ÀÚ¸®¿¡ ¿Ã ¼ö ÀÖÀ¸¸ç, ¾ç¹æÇ⠹ݺ¹ÀÚ¸¦ ÇÊ¿ä·ÎÇÏ´Â »óȲ¿¡¼­´Â ÀÓÀÇÁ¢±Ù ¹Ýº¹ÀÚ¸¦ »ç¿ëÇصµ µÈ´Ù. ¹Ýº¹ÀÚÀÇ µÎ¹ø° ¼ºÁúÀº ÀڽŰú ¿¬°áµÈ ÄÁÅ×À̳ÊÀÇ ¿ø¼ÒµéÀ» º¯°æÇÒ ¼ö ÀÖ´Â ´É·ÂÀ» °¡Áö°í ÀÖ´ÂÁöÀÇ ¿©ºÎÀÌ´Ù. »ó¼ö ¹Ýº¹ÀÚ´Â Àбâ¿ëÀ¸·Î¸¸ »ç¿ëµÉ ¼ö ÀÖ´Â ¹Ýº¹ÀÚÀ̸ç, °»½Å¿ëÀ¸·Î´Â »ç¿ëµÉ ¼ö ¾ø´Ù. µû¶ó¼­, ¾²±â¸¸ °¡´ÉÇÑ Ãâ·Â ¹Ýº¹ÀÚ´Â Àý´ë »ó¼ö°¡ µÉ ¼ö ¾øÀ¸¸ç, ¹Ý¸é¿¡ Àб⸸ °¡´ÉÇÑ ÀÔ·Â ¹Ýº¹ÀÚ´Â ¾ðÁ¦³ª »ó¼ö ¹Ýº¹ÀÚ°¡ µÇ´Â °ÍÀÌ´Ù. ´Ù¸¥ ¹Ýº¹ÀÚµéÀº ¾î¶² ½ÄÀ¸·Î »ý¼ºµÇ¾ú´Â°¡¿¡ µû¶ó »ó¼ö ¹Ýº¹ÀÚ°¡ µÉ ¼öµµ ÀÖ°í, ±×·¸Áö ¾ÊÀ» ¼öµµ ÀÖ´Ù. µ¿½Ã¿¡ »ó¼öÀ̸鼭 »ó¼ö°¡ ¾Æ´Ñ ¾ç¹æÇ⠹ݺ¹ÀÚ°¡ ÀÖÀ¸¸ç, µ¿½Ã¿¡ »ó¼öÀ̸鼭 »ó¼ö°¡ ¾Æ´Ñ ÀÓÀÇÁ¢±Ù ¹Ýº¹ÀÚ°¡ ÀÖ´Â µî ¿©·¯°¡Áö°¡ ÀÖ´Ù. ¾Æ·¡ Ç¥´Â °¢ ¹Ýº¹ÀÚµéÀÌ ÄÁÅ×À̳ʿ¡ ÀÇÇؼ­ »ý¼ºµÇ´Â ¹æ½ÄµéÀ» Á¤¸®ÇÑ °ÍÀÌ´Ù. ¹Ýº¹ÀÚ Á¾·ù »ý¼ºµÇ´Â ¹æ½Ä ÀÔ·Â ¹Ýº¹ÀÚ (input iterator) istream_iterator ostream_iterator Ãâ·Â ¹Ýº¹ÀÚ inserter (output iterator) front_inserter back_inserter ¾ç¹æÇ⠹ݺ¹ÀÚ list (bidirectional iterator) set°ú multiset map°ú multimap ÀÓÀÇÁ¢±Ù ¹Ýº¹ÀÚ ÀÏ¹Ý Æ÷ÀÎÅÍ (random access iterator) vector deque 2.2.1 ÀÔ·Â ¹Ýº¹ÀÚ(input iterator) ÀÔ·Â ¹Ýº¹ÀÚ(input iterator)´Â °¡Àå ´Ü¼øÇÑ ÇüÅÂÀÇ ¹Ýº¹ÀÚÀÌ´Ù. ÀÔ·Â ¹Ýº¹ÀÚÀÇ ¼ºÁúÀ» ÀÌÇØÇϱâ À§ÇØ, ¿¹Á¦ ÇÁ·Î±×·¥À» º¸ÀÚ. find()¶ó´Â generic ¾Ë°í¸®µëÀº ¼øÂ÷ °Ë»öÀ» ÇÏ¿© ÄÁÅ×À̳ʿ¡ Æ÷ÇÔµÈ Æ¯Á¤ °ªÀ» ã¾Æ³»´Â ÀÏÀ» ÇÑ´Ù. ÄÁÅ×À̳ÊÀÇ ³»¿ëÀº first¿Í lastÀÇ µÎ ¹Ýº¹ÀÚ·Î ÁöÁ¤µÈ´Ù. first°¡ last¿Í °°Áö ¾Ê´Â µ¿¾È¿¡´Â, first°¡ °¡¸®Å°´Â °ª°ú ã°íÀÚ ÇÏ´Â °ªÀ» ºñ±³ÇÑ´Ù. ¸¸¾à¿¡ °°´Ù¸é, ã¾Æ³½ ¿ø¼Ò¸¦ °¡¸®Å°´Â ¹Ýº¹ÀÚ¸¦ ¸®ÅÏÇÑ´Ù. °°Áö ¾ÊÀ¸¸é, first ¹Ýº¹ÀÚ¸¦ Áõ°¡½ÃÅ°°í, ·çÇÁ Áֱ⸦ Çѹø µ¹°Ô µÈ´Ù. range Àüü¸¦ ¸ðµÎ °Ë»çÇߴµ¥µµ ¿øÇÏ´Â °ªÀ» ãÁö ¸øÇϸé, find()´Â end-of-range ¹Ýº¹ÀÚ¸¦ ¹ÝȯÇÑ´Ù. template InputIterator find (InputIterator first, InputIterator last, const T& value) { while (first != last && *first != value) ++first; return first; } ÀÌ ¾Ë°í¸®µëÀº ÀÔ·Â ¹Ýº¹ÀÚ°¡ °®Ãç¾ß ÇÒ ¼¼°¡Áö ¿ä±¸»çÇ×À» ¼³¸íÇÏ°í ÀÖ´Ù. * ¹Ýº¹ÀÚ´Â ´Ù¸¥ ¹Ýº¹ÀÚ¿ÍÀÇ »óµî¿©ºÎ¸¦ ºñ±³ÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. °°Àº À§Ä¡¸¦ °¡¸®Å°¸é °°Àº °ÍÀÌ°í, ±×·¸Áö ¾Ê´Ù¸é ´Ù¸¥ °ÍÀÌ´Ù. * ¹Ýº¹ÀÚ´Â * ¿¬»êÀÚ¸¦ »ç¿ëÇÏ¿© ¹Ýº¹ÀÚ°¡ °¡¸®Å°´Â °ªÀ» ¾òÀ» ¼ö ÀÖ¾î¾ß ÇÑ´Ù. * ¹Ýº¹ÀÚ´Â ++ ¿¬»êÀÚ¸¦ »ç¿ëÇÏ¿© ´ÙÀ½ ¿ø¼Ò¸¦ °¡¸®Å³ ¼ö ÀÖµµ·Ï Áõ°¡µÉ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ÀÔ·Â ¹Ýº¹ÀÚ¿¡´Â ´ÙÀ½ ¼¼°¡Áö Á¾·ù°¡ ÀÖ´Ù. ÀÏ¹Ý Æ÷ÀÎÅÍ. ÀϹÝÀûÀ¸·Î »ç¿ëµÇ´Â ±×³É Æò¹üÇÑ Æ÷ÀÎÅ͵éÀº ÀÔ·Â ¹Ýº¹ÀÚ·Î »ç¿ëµÉ ¼ö°¡ ÀÖ´Ù. Æ÷ÀÎÅ͸¦ ÂüÁ¶ÇÏ°í Áõ°¡½Ãų ¼ö ÀÖÀ¸¹Ç·Î, ÀÓÀÇÀÇ °ªÀ» Á¢±ÙÇÒ ¼ö ÀÖÀ¸¸ç, µû¶ó¼­ Æ÷ÀÎÅ͵éÀº ÀÔ·Â ¹Ýº¹ÀÚ³ª Ãâ·Â ¹Ýº¹ÀÚ·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, ´ÙÀ½Àº Á¤¼ö ¹è¿­¾È¿¡¼­ 7À» ã´Â ÄÚµåÀÌ´Ù. [Image] ÀÏ¹Ý Æ÷ÀÎÅÍ¿Í ¹Ýº¹ÀÚ int data[100]; ... int *where = find(data, data + 100, 7); »ó¼ö Æ÷ÀÎÅÍ´Â ¼±¾ð½Ã¿¡ Å°¿öµå const¸¦ ºÙÀÌ¸é µÇ¸ç, »ó¼ö Æ÷ÀÎÅÍ¿¡ ÀÇÇØ ÂüÁ¶µÇ´Â ¹è¿­ÀÇ ¿ø¼Ò´Â ¼öÁ¤ÀÌ ºÒ°¡´ÉÇÏ´Ù. const int *first = data; const int *last = data + 100; // can't modify location returned by the following const int *where = find(first, last, 7); ÄÁÅ×ÀÌ³Ê ¹Ýº¹ÀÚ(container iterator). Ç¥ÁØ ¶óÀ̺귯¸®°¡ Á¦°øÇÏ´Â ´Ù¾çÇÑ ÄÁÅ×À̳ʷκÎÅÍ »ý¼ºµÈ ¹Ýº¹ÀÚµéÀº ¸ðµÎ ÀÔ·Â ¹Ýº¹ÀÚ°¡ °®Ãß¾î¾ß ÇÒ Á¶°ÇÀ» ¸¸Á·ÇÑ´Ù. ÄÝ·º¼ÇÀÇ Ã¹¹ø° ¿ø¼Ò´Â begin()À̶ó´Â ¸â¹ö ÇÔ¼ö¸¦ ÅëÇؼ­ ¾òÀ» ¼ö ÀÖÀ¸¸ç, past-the-end¸¦ °¡¸®Å°´Â ¹Ýº¹ÀÚ´Â end()¶ó´Â ¸â¹ö ÇÔ¼ö¸¦ ÅëÇؼ­ ¾òÀ» ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, ´ÙÀ½Àº Á¤¼ö ¸®½ºÆ®¾È¿¡¼­ 7À» ã´Â ÄÚµåÀÌ´Ù. list::iterator where = find(aList.begin(), aList.end(), 7); ¹Ýº¹ÀÚ¸¦ Áö¿øÇÏ´Â °¢°¢ÀÇ ÄÁÅ×À̳ʵéÀº Ŭ·¡½º ¼±¾ð¾È¿¡ ¹Ýº¹ÀÚ¶ó´Â À̸§À» °¡Áø ŸÀÔÀ» Á¦°øÇØ¾ß ÇÑ´Ù. ÀÌ°ÍÀ» »ç¿ëÇÔÀ¸·Î½á, ¹Ýº¹ÀÚ¸¦ ÀÏ°üµÈ ÇüÅ·Π¼±¾ðÇÒ ¼ö ÀÖ´Ù. ¸¸¾à¿¡ Á¢±ÙÇÏ°íÀÚ ÇÏ´Â ÄÁÅ×À̳ʰ¡ »ó¼öÀ̰ųª, const_iterator¸¦ »ç¿ëÇÏ¿© ¼±¾ðÇϸé, ±× ¹Ýº¹ÀÚ´Â »ó¼ö ¹Ýº¹ÀÚ°¡ µÈ´Ù. ÀÔ·Â ½ºÆ®¸² ¹Ýº¹ÀÚ(input stream iterator). Ç¥ÁØ ¶óÀ̺귯¸®´Â ÀÔ·Â ¹Ýº¹ÀÚ¸¦ »ç¿ëÇÏ¿© ÀÔ·Â ½ºÆ®¸²¿¡ ´ëÇØ ÀÛ¾÷À» ÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀ» Á¦°øÇÑ´Ù. ÀÌ´Â istream_iterator Ŭ·¡½º¸¦ ÅëÇØ Á¦°øµÇ´Âµ¥ 2.3.1Àý¿¡¼­ ´õ ÀÚ¼¼È÷ ´Ù·çµµ·Ï ÇÑ´Ù. 2.2.2 Ãâ·Â ¹Ýº¹ÀÚ(output iterator) Ãâ·Â ¹Ýº¹ÀÚ(output iterator)´Â ÀÔ·Â ¹Ýº¹ÀÚ¿Í´Â ¹Ý´ëµÇ´Â ±â´ÉÀ» °¡Áø´Ù. Ãâ·Â ¹Ýº¹ÀÚ´Â ½ÃÄö½º¿¡ °ªÀ» ´ëÀÔÇϴµ¥ »ç¿ëµÉ ¼ö ÀÖÁö¸¸, °ªÀ» Á¢±ÙÇϴµ¥´Â »ç¿ëµÉ ¼ö ¾ø´Ù. ¿¹¸¦ µé¾î, ÇÑ ½ÃÄö½º¿¡¼­ ´Ù¸¥ ½ÃÄö½º·Î °ªµéÀ» º¹»çÇÏ´Â generic ¾Ë°í¸®µë¿¡¼­ Ãâ·Â ¹Ýº¹ÀÚ¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. template OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result) { while (first != last) *result++ = *first++; return result; } [Image] º´·Ä ½ÃÄö½º ¿©±â¼­´Â µÎ°³ÀÇ range°¡ »ç¿ëµÇ¾ú´Âµ¥, Çϳª´Â ÇѽÖÀÇ ¹Ýº¹ÀڷΠǥÇöµÈ ¼Ò½º rangeÀÌ°í, Çϳª´Â ¸ñÀûÁö rangeÀÌ´Ù. ±×·¯³ª, ¸ñÀûÁö range´Â ÇÑ°³ÀÇ ¹Ýº¹Àڷθ¸ Ç¥ÇöÀÌ µÇ¾îÀÖ´Ù. ÀÌ´Â ¸ñÀûÁö°¡ ¼Ò½ºÂÊÀÇ ¸ðµç °ªµéÀ» ¼ö¿ëÇÒ ¼ö ÀÖÀ»¸¸Å­ ÃæºÐÈ÷ Å©´Ù°í °¡Á¤ÇÏ´Â °ÍÀÌ´Ù. µû¶ó¼­, ¸¸¾à¿¡ ¸ñÀûÁö°¡ ÃæºÐÇÑ °ø°£À» È®º¸ÇÏ°í ÀÖÁö ¾Ê´Ù¸é, ¿¡·¯°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù. ÀÌ ¾Ë°í¸®µëÀÌ ¼³¸íÇÏ°í ÀÖµíÀÌ, Ãâ·Â ¹Ýº¹ÀÚ´Â ÀÚ½ÅÀÌ °¡¸®Å°´Â ¿ø¼ÒµéÀ» ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù. Ãâ·Â ¹Ýº¹ÀÚ´Â * ¿¬»êÀÚ¸¦ »ç¿ëÇÒ ¶§, ´ëÀÔ¿¬»êÀÇ ´ë»óÀÌ µÇ´Â ¹æ½ÄÀ¸·Î¸¸ »ç¿ëµÉ ¼ö ÀÖÀ¸¸ç, ÀÚ½ÅÀÌ °¡¸®Å°´Â ¿ø¼ÒµéÀ» ¸®ÅÏÇϰųª Á¢±ÙÇϱâ À§ÇØ »ç¿ëµÉ ¼ö ¾ø´Ù. ¾Õ¿¡¼­ ¸»ÇßµíÀÌ, Ç¥ÁØ ¶óÀ̺귯¸®°¡ Á¦°øÇÏ´Â ÄÁÅ×À̳ʰ¡ »ý¼ºÇÑ ¹Ýº¹ÀÚ»Ó¸¸ ¾Æ´Ï¶ó, ÀϹÝÀûÀÎ Æ÷ÀÎÅ͵µ Ãâ·Â ¹Ýº¹ÀÚÀÇ ÇÑ ¿¹°¡ µÉ ¼ö ÀÖ´Ù.(ÀÏ¹Ý Æ÷ÀÎÅÍ´Â ÀÓÀÇÁ¢±Ù ¹Ýº¹ÀÚÀ̹ǷÎ, µ¿½Ã¿¡ Ãâ·Â ¹Ýº¹ÀÚ°¡ µÉ ¼ö ÀÖ´Ù.) ±×·¯¹Ç·Î, ¿¹¸¦ µé¾î, ´ÙÀ½ ÄÚµå´Â Æò¹üÇÑ C ÇüÅÂÀÇ ¹è¿­¿¡¼­ Ç¥ÁØ ¶óÀ̺귯¸® vector·Î ¿ø¼ÒµéÀ» º¹»çÇÑ´Ù. int data[100]; vector newdata(100); ... copy (data, data+100, newdata.begin()); istream_iterator°¡ ÀÔ·Â ¹Ýº¹ÀÚ ¹æ½ÄÀ» »ç¿ëÇÏ¿© ÀÔ·Â ½ºÆ®¸²À» ´Ù·ç´Â ¹æ¹ýÀ» Á¦°øÇÏ´Â °Í°ú ¸¶Âù°¡Áö·Î, Ç¥ÁØ ¶óÀ̺귯¸®´Â ostream_iterator ŸÀÔÀ» Á¦°øÇÑ´Ù. ÀÌ´Â ¹Ýº¹ÀÚ ¹æ½ÄÀ¸·Î Ãâ·Â ½ºÆ®¸²¿¡ °ªµéÀ» ¾²µµ·Ï ÇØÁØ´Ù. ÀÌ¿¡ °üÇؼ­´Â 2.3.2Àý¿¡¼­ ´õ ÀÚ¼¼È÷ ´Ù·çµµ·Ï ÇÑ´Ù. Ãâ·Â ¹Ýº¹ÀÚÀÇ ¶Ç ´Ù¸¥ ÇüÅ´ '»ðÀÔ ¹Ýº¹ÀÚ'ÀÌ´Ù. »ðÀÔ ¹Ýº¹ÀÚ´Â Ãâ·Â ¹Ýº¹ÀÚÀÇ ÂüÁ¶/´ëÀÔÇÏ°í Áõ°¡½ÃÅ°´Â ¿¬»êÀ» ÄÁÅ×À̳ʿ¡ ´ëÇÑ »ðÀÔ¿¬»êÀ¸·Î ¹Ù²Û´Ù. ÀÌ·¸°Ô ÇÔÀ¸·Î½á copy()¿Í °°Àº ¿¬»êµéÀ» list¿Í set°ú °°Àº °¡º¯±æÀÌ ÄÁÅ×À̳ʵé°ú ÇÔ²² »ç¿ëÇÒ ¼ö ÀÖ°Ô µÈ´Ù. »ðÀÔ ¹Ýº¹ÀÚ¿¡ °üÇؼ­´Â 2.4Àý¿¡¼­ º¸´Ù ÀÚ¼¼È÷ ´Ù·é´Ù. 2.2.3 ¼ø¹æÇ⠹ݺ¹ÀÚ(forward iterator) ¼ø¹æÇ⠹ݺ¹ÀÚ(forward iterator)´Â ÀÔ·Â ¹Ýº¹ÀÚ¿Í Ãâ·Â ¹Ýº¹ÀÚÀÇ Æ¯Â¡À» °áÇÕÇÑ °ÍÀÌ´Ù. °ªÀ» Á¢±ÙÇÏ°í °»½ÅÇÏ´Â °ÍÀÌ °¡´ÉÇÏ°Ô µÈ °ÍÀÌ´Ù. ¼ø¹æÇ⠹ݺ¹ÀÚ¸¦ »ç¿ëÇÏ´Â ÇÔ¼ö·Î replace() generic ¾Ë°í¸®µëÀÌ Àִµ¥, ÀÌ´Â ¿øÇÏ´Â °ªÀ» ã¾Æ ´Ù¸¥ °ªÀ¸·Î ´ëÄ¡ÇÏ´Â ÀÛ¾÷À» ÇÑ´Ù. ÀÌ ¾Ë°í¸®µëÀº ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºµÉ ¼ö ÀÖ´Ù. template void replace (ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value) { while (first != last) { if (*first == old_value) *first = new_value; ++first; } } ÀϹÝÀûÀÎ Æ÷ÀÎÅ͵µ ¼ø¹æÇ⠹ݺ¹ÀÚ·Î »ç¿ëµÉ ¼ö ÀÖ´Ù. ´ÙÀ½ ¿¹´Â Á¤¼ö vector¿¡¼­ ³ªÅ¸³ª´Â ¸ðµç 7À» 11·Î ¹Ù²Û´Ù. replace(aVec.begin(), aVec.end(), 7, 11); 2.2.4 ¾ç¹æÇ⠹ݺ¹ÀÚ(bidirectional iterator) ¾ç¹æÇ⠹ݺ¹ÀÚ(bidirectional iterator)´Â ¼ø¹æÇ⠹ݺ¹ÀÚ¿Í »ó´çÈ÷ ºñ½ÁÇÏ´Ù. ´Ù¸¸, ¾ç¹æÇ⠹ݺ¹ÀÚ´Â °¨¼Ò ¿¬»êÀÚ(--)¸¦ Áö¿øÇϹǷÎ, ÄÁÅ×À̳ʳ»ÀÇ ¿ø¼ÒµéÀ» ¼ø¹æÇâÀ̳ª ¿ª¹æÇâÀ¸·Î À̵¿ÇÏ´Â °ÍÀÌ Çã¿ëµÈ´Ù´Â Á¡¿¡¼­ Â÷ÀÌ°¡ ³­´Ù. ¿¹¸¦ µé¾î, ÄÁÅ×ÀÌ³Ê ³»ÀÇ °ªµéÀÇ ¼ø¼­¸¦ µÚÁý¾î »õ·Î¿î ÄÁÅ×À̳ʷΠ¿Å±â´Â ÇÔ¼ö¿¡¼­´Â ¾ç¹æÇ⠹ݺ¹ÀÚ¸¦ »ç¿ëÇÑ´Ù. template OutputIterator reverse_copy (BidirectionalIterator first, BidirectionalIterator last, OutputIterator result) { while (first != last) *result++ = *--last; return result; } last ÀÎÀÚ°¡ óÀ½ °¡¸®Å°´Â °ªÀº ÄÝ·º¼ÇÀÇ ÀϺΰ¡ ¾Æ´Ï¹Ç·Î, ¸ÕÀú °¨¼Ò½ÃŲÈÄ (--last) °ªÀ» ÂüÁ¶(*)ÇØ¾ß ÇÑ´Ù. ´ÙÀ½ reverse_copy() ÇÔ¼ö´Â ¿¬°á ¸®½ºÆ®ÀÇ °ªµéÀ» µÚÁý¾î, ±× °á°ú¸¦ vector·Î ¿Å±ä´Ù. list aList; .... vector aVec(aList.size()); reverse_copy(aList.begin(), aList.end(), aVec.begin()); 2.2.5 ÀÓÀÇÁ¢±Ù ¹Ýº¹ÀÚ(random access iterator) ¾î¶² ¾Ë°í¸®µëµéÀº ¾ÕµÚ ¹æÇâÀ¸·Î °ªµéÀ» Á¢±ÙÇÏ´Â ´É·Â ÀÌ»óÀÇ ±â´ÉÀ» ÇÊ¿ä·ÎÇÑ´Ù. ÀÓÀÇÁ¢±Ù ¹Ýº¹ÀÚ(random access iterator)µéÀº ÷ÀÚ¿¡ ÀÇÇÑ Á¢±ÙÀÌ °¡´ÉÇÏ°í, ´Ù¸¥ ¹Ýº¹ÀÚ¿ÍÀÇ Â÷(ÀÌ °æ¿ì¿¡´Â µÎ ¹Ýº¹ÀÚ »çÀÌ¿¡ Á¸ÀçÇÏ´Â ¿ø¼ÒÀÇ ¼ö¸¦ ¾òÀ» ¼ö ÀÖ´Ù.)¸¦ ±¸ÇÒ ¼ö ÀÖ°í, »ê¼ú¿¬»êÀ» ÅëÇØ °ªÀ» ¼öÁ¤ÇÒ ¼ö ÀÖ´Â µî, ±âÁ¸ÀÇ ÀÏ¹Ý Æ÷ÀÎÅÍ°¡ Çß´ø ¸ðµç °ÍÀ» ÇÒ ¼ö ÀÖ´Ù. ÀÏ¹Ý Æ÷ÀÎÅ͸¦ »ç¿ëÇÒ ¶§, »ê¼ú ¿¬»êÀº ¸Þ¸ð¸®¿Í °ü·ÃµÈ´Ù. Áï, x+10Àº xºÎÅÍ 10°³ ¿ø¼Ò ÀÌÈÄÀÇ ¸Þ¸ð¸®À§Ä¡¸¦ ³ªÅ¸³½´Ù. ¹Ýº¹ÀÚÀÇ °æ¿ì¿¡µµ ³í¸®ÀûÀÎ Àǹ̴ ±×´ë·Î À¯ÁöµÈ´Ù. ±×·¯³ª, ¹°¸®Àû ÁÖ¼Ò´Â ´Þ¶óÁö°Ô µÈ´Ù. ÀÓÀÇÁ¢±Ù ¹Ýº¹ÀÚ¸¦ »ç¿ëÇÏ´Â ¾Ë°í¸®µë¿¡´Â Á¤·Ä°ú ÀÌÁø°Ë»ö°ú °°Àº ¿¬»êµîÀ» Æ÷ÇÔÇÑ´Ù. ¿¹¸¦ µé¾î, ´ÙÀ½ ¾Ë°í¸®µëÀº ÄÁÅ×À̳ÊÀÇ ¿ø¼ÒµéÀ» ÀÓÀÇ·Î ¼¯´Â´Ù. ÀÌ ¾Ë°í¸®µëÀº Ç¥ÁØ ¶óÀ̺귯¸®°¡ Á¦°øÇÏ´Â random_shuffle()º¸´Ù Á» ´Ü¼øÇϱä ÇÏÁö¸¸, random_shuffle()°ú ºñ½ÁÇÏ´Ù. template void mixup(RandomAccessIterator first, RandomAccessIterator last) { while (first < last) { iter_swap(first, first + randomInteger(last - first)); ++first; } } [Image] randomInteger() The program will cycle as long as first is denoting a position that occurs earlier in the sequence than the one denoted by last. Only random access iterators can be compared using relational operators; all other iterators can be compared only for equality or inequality. On each cycle through the loop, the expression last - first yields the number of elements between the two limits. The function randomInteger() is assumed to generate a random number between 0 and the argument. Using the standard random number generator, this function could be written as follows: // return random integer greater than or equal to 0 and less than n unsigned int randomInteger(unsigned int n) { return rand() % n; } This random value is added to the iterator first, resulting in an iterator to a randomly selected value in the container. This value is then swapped with the element denoted by the iterator first. 2.2.6 ¿ª ¹Ýº¹ÀÚ(reverse iterator) ¹Ýº¹ÀÚ´Â ÀڽŰú ¿¬°áµÈ ÄÁÅ×À̳ʻ󿡼­ÀÇ ¼ø¼­¸¦ Áö´Ï°í ÀÖ´Ù. vector¿Í map¿¡¼­´Â ÷ÀÚ¸¦ Áõ°¡½ÃÅ°¸é¼­ ¼ø¼­°¡ Á¤ÇØÁö°í, set¿¡¼­´Â Å©±â°¡ Áõ°¡ÇÏ´Â ¹æÇâÀ¸·Î ¼ø¼­°¡ Á¤ÇØÁö°í, list¿¡¼­´Â °ªµéÀÌ Ã·°¡µÇ´Â ¹æ½Ä¿¡ µû¶ó ¼ø¼­°¡ Á¤ÇØÁø´Ù. ¿ª ¹Ýº¹ÀÚ(reverse iterator)´Â Ç¥ÁØ ¹Ýº¹ÀÚ°¡ ºÎ¿©¹ÞÀº ¼ø¼­¿Í´Â ¹Ý´ëµÇ´Â ¼ø¼­·Î °ªµéÀ» Á¢±ÙÇÑ´Ù. Áï, vector³ª list¿¡¼­ ¿ª ¹Ýº¹ÀÚ´Â ¸¶Áö¸· ¿ø¼Ò¸¦ ¸Ç ¸ÕÀú Á¢±ÙÇÏ°í, ù¹ø° ¿ø¼Ò¸¦ ¸Ç ¸¶Áö¸·¿¡ Á¢±ÙÇÑ´Ù. set¿¡¼­´Â °¡Àå Å« ¿ø¼Ò°¡ ¸Ç ¸ÕÀú ¾ò¾îÁö°í, °¡Àå ÀÛÀº ¿ø¼Ò°¡ ¸¶Áö¸·¿¡ Á¢±ÙµÈ´Ù. ¾ö°ÝÈ÷ ¸»Çؼ­, ¿ª ¹Ýº¹ÀÚ´Â »õ·Î¿î Á¾·ùÀÇ ¹Ýº¹ÀÚ°¡ ¾Æ´Ï´Ù. µû¶ó¼­, ¿ª ¾ç¹æÇ⠹ݺ¹ÀÚ³ª, ¿ª ÀÓÀÇÁ¢±Ù ¹Ýº¹ÀÚµîµîÀÌ ÀÖÀ» ¼ö ÀÖ´Ù. list, set, map ŸÀÔÀº ¿ª ¾ç¹æÇ⠹ݺ¹ÀÚ¸¦ »ý¼ºÇÏ´Â ¸â¹ö ÇÔ¼ö¸¦ ÇÑ½Ö °¡Áö°í Á¦°øÇÏ°í ÀÖ´Ù. rbegin()°ú rend() ÇÔ¼ö´Â ÇØ´ç ÄÁÅ×À̳ʸ¦ ¿ª¼øÀ¸·Î ÈÈ´Â ¹Ýº¹ÀÚ¸¦ »ý¼ºÇÑ´Ù. ¿ª ¹Ýº¹ÀÚ¿¡ ´ëÇÑ Áõ°¡¿¬»êÀº ÈÄÅ𸦠ÀǹÌÇÏ°í, °¨¼Ò¿¬»êÀº ÀüÁøÀ» ÀǹÌÇÑ´Ù. À¯»çÇÏ°Ô, vector¿Í deque ŸÀÔ¿¡¼­´Â ¿ª ÀÓÀÇÁ¢±Ù ¹Ýº¹ÀÚ¸¦ »ý¼ºÇÏ´Â ¸â¹ö ÇÔ¼ö¸¦ °¡Áö°í ÀÖ´Ù.(À̸§Àº ¶È°°ÀÌ rbegin()°ú rend()ÀÌ´Ù.) Áõ°¡¿¬»ê »Ó¸¸¾Æ´Ï¶ó, ÷ÀÚ¿Í µ¡¼À ¿¬»ê ¿ª½Ã ÈÄÅ𸦠ÀǹÌÇÑ´Ù. 2.3 ½ºÆ®¸² ¹Ýº¹ÀÚ(stream iterator) ½ºÆ®¸² ¹Ýº¹ÀÚ´Â ¹Ýº¹ÀÚ ¿¬»êÀ» ÀÌ¿ëÇÏ¿© ÀÔ·Â ¶Ç´Â Ãâ·Â ½ºÆ®¸²À» Á¢±ÙÇϴµ¥ »ç¿ëµÈ´Ù. 2.3.1 ÀÔ·Â ½ºÆ®¸² ¹Ýº¹ÀÚ(input stream iterator) [Image] Stream Iterators ÀÔ·Â ¹Ýº¹ÀÚ¸¦ ¼³¸íÇÒ ¶§ ¾ð±ÞÇßµíÀÌ, Ç¥ÁØ ¶óÀ̺귯¸®´Â ÀÔ·Â ½ºÆ®¸²À» ÀÔ·Â ¹Ýº¹ÀÚ·Î º¯È¯ÇÏ´Â ¹æ½ÄÀ» Á¦°øÇÑ´Ù. ÀÌ´Â istream_iterator¿¡ ÀÇÇØ Á¦°øµÈ´Ù. ¼±¾ðÇÒ ¶§, 4°³ÀÇ ÅÛÇø´ ÀÎÀÚ°¡ ÇÊ¿äÇѵ¥, ¿ø¼ÒÀÇ Å¸ÀÔ, ½ºÆ®¸² ¹®ÀÚÀÇ Å¸ÀÔ, ¹®ÀÚ trait ŸÀÔ, ±×¸®°í ¿ø¼Ò°£ÀÇ °Å¸®¸¦ ÃøÁ¤Çϴ ŸÀÔÀÌ ÇÊ¿äÇÏ´Ù. ¸¶Áö¸· 2°³´Â µðÆúÆ®·Î char_traits¿Í ptrdiff_t¸¦ °¡Áø´Ù. ÀÌ µðÆúÆ® ÀÎÀÚ´Â ´ëºÎºÐÀÇ °æ¿ì¿¡ Á¦´ë·Î ÀÛµ¿ÇÑ´Ù. istream_iteratorÀÇ »ý¼ºÀÚ·Î µé¾î°¡´Â ÀÎÀÚ´Â ´Ü ÇϳªÀε¥, ÀÌ´Â Á¢±ÙÇÒ ½ºÆ®¸²À» ³ªÅ¸³½´Ù. ÀÔ·Â ½ºÆ®¸² ¹Ýº¹ÀÚ¿¡ ´ëÇØ Áõ°¡ ¿¬»êÀÚ(++)°¡ Àû¿ëµÉ ¶§¸¶´Ù ½ºÆ®¸²À¸·ÎºÎÅÍ »õ·Î¿î °ªÀ» Àоî(>> ¿¬»êÀÚ »ç¿ë) ÀúÀåÇÑ´Ù. ÀÌ °ªÀº ÂüÁ¶ ¿¬»êÀÚ(*)¸¦ »ç¿ëÇÏ¿© ¾òÀ» ¼ö ÀÖ´Ù. »ý¼ºÀÚ¿¡ ¾Æ¹«·± ÀÎÀÚµµ ³ÖÁö ¾Ê°í istream_iterator¿¡ ÀÇÇØ »ý¼ºµÈ °ªÀº ÀÔ·ÂÀÇ ³¡À» ³ªÅ¸³»´Â ¹Ýº¹ÀÚ °ªÀ¸·Î »ç¿ëµÈ´Ù. ´ÙÀ½Àº Á¤¼öµéÀ» Áö´Ñ È­ÀϷκÎÅÍ °¡Àå ¸ÕÀú ³ªÅ¸³ª´Â 7À» ã´Â ÄÚµåÀÌ´Ù. istream_iterator intstream(cin), eof; istream_iterator::iterator where = find(intstream, eof, 7); ÀÔ·Â ½ºÆ®¸²À» À§ÇÑ ¹Ýº¹ÀÚ°¡ °¡¸®Å°´Â ¿ø¼Ò´Â ½ºÆ®¸²¿¡¼­ÀÇ ´ÙÀ½ ¿ø¼Ò°¡ ¿äûµÉ ¶§±îÁö¸¸ À¯È¿ÇÏ´Ù. ¶ÇÇÑ, ÀÔ·Â ½ºÆ®¸² ¹Ýº¹ÀÚ´Â ÀÔ·Â ¹Ýº¹ÀÚÀ̱⠶§¹®¿¡, ¿ø¼Òµé¿¡ ´ëÇÑ Á¢±Ù¸¸ÀÌ °¡´ÉÇϸç, ´ëÀÔ¿¡ ÀÇÇÑ °»½ÅÀº ºÒ°¡´ÉÇÏ´Ù. ¸¶Áö¸·À¸·Î, ¿ø¼ÒµéÀº ¿ÀÁ÷ Çѹø ¼ø¹æÇâÀ¸·Î¸¸ Á¢±ÙÀÌ °¡´ÉÇÏ´Ù. ½ºÆ®¸²ÀÇ ³»¿ëÀ» Çѹø ÀÌ»ó ÀÐ°í ½Í´Ù¸é, °¢ pass¸¶´Ù º°µµÀÇ ¹Ýº¹ÀÚ¸¦ »ý¼ºÇØ¾ß ÇÑ´Ù. 2.3.2 Ãâ·Â ½ºÆ®¸² ¹Ýº¹ÀÚ(output stream iterator) Ãâ·Â ½ºÆ®¸² ¹Ýº¹ÀÚ(output stream iterator) ¹æ½ÄÀº ÀÔ·Â ½ºÆ®¸² ¹Ýº¹ÀÚ¿Í ºñ½ÁÇÏ´Ù. °ªµéÀÌ ¹Ýº¹ÀÚ·Î ´ëÀ﵃ ¶§¸¶´Ù, ±× °ªÀº >> ¿¬»êÀÚ¸¦ »ç¿ëÇÏ¿© ÇØ´ç Ãâ·Â ½ºÆ®¸²À¸·Î Ãâ·ÂµÈ´Ù. Ãâ·Â ½ºÆ®¸² ¹Ýº¹ÀÚ¸¦ »ý¼ºÇϱâ À§Çؼ­´Â »ý¼ºÀÚÀÇ ÀÎÀÚ·Î Ãâ·Â ½ºÆ®¸²À» ÁöÁ¤ÇØ¾ß ÇÑ´Ù. Ãâ·Â ½ºÆ®¸²À¸·Î ¾²¿©Áö´Â °ªµéÀº >> ¿¬»êÀÚ¸¦ ÀνÄÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. Áï, ÇØ´ç °ª¿¡ ´ëÇØ >> ¿¬»êÀÚ°¡ Á¤ÀǵǾî ÀÖ¾î¾ß ÇÑ´Ù. »ý¼ºÀÚÀÇ »ý·« °¡´ÉÇÑ µÎ¹ø° ÀÎÀÚ´Â Ãâ·ÂµÇ´Â °ªµé »çÀÌÀÇ ºÐ¸®ÀÚ·Î »ç¿ëµÉ ¹®ÀÚ¿­À» ³ªÅ¸³½´Ù. ´ÙÀ½ ¿¹´Â vectorÀÇ ¿ø¼Ò°ªµéÀ» Ç¥ÁØ Ãâ·ÂÀ¸·Î º¹»çÇÏ´Â ¿¹ÀÌ´Ù. Ãâ·ÂµÇ´Â °ªµéÀ» °ø¹é¹®ÀÚ·Î ±¸ºÐÇÏ°í ÀÖ´Ù. copy(newdata.begin(), newdata.end(), ostream_iterator(cout, " ")); ÀÔÃâ·Â ½ºÆ®¸² ¹Ýº¹ÀÚ¿Í Ç¥ÁØ ¶óÀ̺귯¸®°¡ Á¦°øÇÏ´Â ´Ù¾çÇÑ ¾Ë°í¸®µëÀ» È¥ÇÕÇÏ¿© °£´ÜÇÑ È­ÀÏ º¯È¯ ¾Ë°í¸®µëÀ» ¸¸µé¾îº¼ ¼ö ÀÖ´Ù. ´ÙÀ½Àº Ç¥ÁØÀÔ·ÂÀ¸·ÎºÎÅÍ Á¤¼öµéÀÌ ´ã±ä È­ÀÏÀ» Àоîµé¿©, ÀÌ È­ÀÏ¿¡ µé¾îÀÖ´Â 7À̶õ °ªÀ» Á¦°ÅÇÏ°í, ³ª¸ÓÁö´Â Ç¥ÁØ Ãâ·ÂÀ¸·Î Ãâ·ÂÇÏ°í, Ãâ·ÂµÇ´Â °ªµé »çÀÌ¿¡ °³Ç๮ÀÚ¸¦ Ãâ·ÂÇÏ´Â °£´ÜÇÑ ÇÁ·Î±×·¥ÀÌ´Ù. void main() { istream_iterator input(cin), eof; ostream_iterator output(cout, "\n"); remove_copy(input, eof, output, 7); } 2.4 »ðÀÔ ¹Ýº¹ÀÚ(insert iterator) Ãâ·Â ¹Ýº¹ÀÚ¿¡ ÀÇÇØ ÂüÁ¶µÇ´Â °ª¿¡ ´ëÀÔÀ» Çϸé, ±× À§Ä¡ÀÇ ³»¿ëÀ» µ¤¾î¾²°Ô µÈ´Ù. ¿¹¸¦ µé¾î, ´ÙÀ½°ú °°ÀÌ copy() ÇÔ¼ö¸¦ È£ÃâÇϸé, ¼±¾ð¹®¿¡¼­ µÎ¹ø° vector¿¡ ´ëÇÑ ¸Þ¸ð¸® °ø°£ÀÌ ÀÌ¹Ì È®º¸ÇÏ¿´´Âµ¥, ÀÌÂÊ vector¿¡¼­ ´Ù¸¥ÂÊ vector·Î °ªµéÀ» ¿Å±â°Ô µÈ´Ù. vector a(10); vector b(10); ... copy(a.begin(), a.end(), b.begin()); list¿Í °°Àº µ¥ÀÌÅͱ¸Á¶¿¡¼­µµ ÀÌ¿Í °°Àº ¹æ½ÄÀ¸·Î µ¤¾î¾²°Ô µÈ´Ù. ¾Æ·¡ c¶ó°í À̸§ºÙÀº list´Â Àû¾îµµ 10°³ÀÇ ¿ø¼Ò´Â °¡Áö°í ÀÖ´Ù°í °¡Á¤ÇÒ ¶§, ¸®½ºÆ®ÀÇ Ã³À½ 10°³ÀÇ ¿ø¼ÒµéÀº vector aÀÇ ³»¿ëÀ¸·Î ¹Ù²î°Ô µÈ´Ù. list c; ... copy(a.begin(), a.end(), c.begin()); list¿Í set°ú °°Àº ±¸Á¶¿¡¼­´Â ¿ø¼Ò°¡ »õ·Î Ãß°¡µÇ¸é, µ¿ÀûÀ¸·Î Å©±â°¡ Ä¿Áö°Ô µÇ´Âµ¥, ±âÁ¸ÀÇ À§Ä¡¿¡ µ¤¾î¾²´Â °Íº¸´Ù´Â »ðÀÔÇÏ´Â °ÍÀÌ ´õ ÀûÀýÇÒ ¶§°¡ ¸¹´Ù. »ðÀÔ ¹Ýº¹ÀÚ¶ó°í ºÒ¸®´Â ÀÏÁ¾ÀÇ ¾î´ðÅ͸¦ »ç¿ëÇÏ¿© copy()¿Í °°Àº ¾Ë°í¸®µëÀ» »ç¿ëÇÒ ¶§ ¿ø¼ÒµéÀ» µ¤¾î¾²Áö ¾Ê°í, ÇØ´ç ÄÁÅ×À̳ʷΠ»ðÀÔÇÏ°Ô µÈ´Ù. ¹Ýº¹ÀÚÀÇ Ãâ·Â ¿¬»êÀº ÇØ´ç ÄÁÅ×À̳ʷÎÀÇ »ðÀÔ ¿¬»êÀ¸·Î ¹Ù²î°Ô µÈ´Ù. ´ÙÀ½ ¿¹´Â vectorÀÇ ¿ø¼ÒµéÀ» °ø¹é list¿¡ »ðÀÔÇÏ´Â ÄÚµåÀÌ´Ù. list d; copy(a.begin(), a.end(), front_inserter(d)); »ðÀÔ ¹Ýº¹ÀÚ¿¡´Â 3°¡Áö ÇüÅ°¡ Àִµ¥, ÀÌµé ¸ðµÎ º¹»ç ¿¬»êÀ» »ðÀÔ ¿¬»êÀ¸·Î ¹Ù²Ù´Âµ¥ »ç¿ëµÈ´Ù. À§¿¡¼­Ã³·³, front_inserter() »ç¿ëÇÏ¿© ¾ò¾îÁø ¹Ýº¹ÀÚ´Â ÇØ´ç ÄÁÅ×À̳ÊÀÇ ¾ÕÂÊ¿¡ °ªµéÀ» »ðÀÔÇÑ´Ù. back_inserter()¸¦ ÅëÇØ ¾òÀº ¹Ýº¹ÀÚ´Â ÇØ´ç ÄÁÅ×À̳ÊÀÇ µÚÂÊ¿¡ °ªµéÀ» »ðÀÔÇÑ´Ù. µÎ°¡Áö ÇüÅ ¸ðµÎ list¿Í deque¿Í ÇÔ²² »ç¿ëµÉ ¼ö ÀÖÀ¸³ª, set°ú vector¿¡´Â »ç¿ëµÉ ¼ö ¾ø´Ù. ¼¼¹ø° ÇüÅ´ °¡Àå ÀϹÝÀûÀÎ ÇüÅ·Πinserter°¡ ÀÖ´Ù. inserter´Â µÎ°³ÀÇ ÀÎÀÚ¸¦ ÃëÇϴµ¥, ÄÁÅ×ÀÌ³Ê¿Í ÄÁÅ×À̳ʳ»ÀÇ ¹Ýº¹ÀÚ°¡ ±×°ÍÀÌ´Ù. ÀÌ ÇüÅ´ ¿ø¼ÒµéÀ» ÄÁÅ×À̳ÊÀÇ Æ¯Á¤ À§Ä¡·Î º¹»çÇÑ´Ù. (listÀÇ °æ¿ì¿¡´Â ¿ø¼ÒµéÀÌ ÁöÁ¤µÈ À§Ä¡ÀÇ ¹Ù·Î ¾ÕÂÊ¿¡ º¹»çµÈ´Ù). ÀÌ ÇüÅ´ set°ú map»Ó¸¸ ¾Æ´Ï¶ó ¾Õ¿¡¼­ ¾ð±ÞÇÑ µÎ ÇüÅÂ¿Í °°ÀÌ »ç¿ëµÉ ¼ö ÀÖ´Â ¸ðµç ±¸Á¶µé°ú °°ÀÌ »ç¿ëµÉ ¼ö ÀÖ´Ù. ´ÙÀ½Àº »ðÀÔ ¹Ýº¹ÀÚÀÇ ¼¼°¡Áö ÇüÅÂÀÇ »ç¿ëÀ» ¸ðµÎ ¼³¸íÇÏ°í ÀÖ´Ù. óÀ½¿¡´Â, 3,2,1À» ºó listÀÇ ¸Ç ¾Õ¿¡ »ðÀÔÇÑ´Ù. °á°úÀûÀ¸·Î, 1,2,3À¸·Î ±¸¼ºµÈ list°¡ ¾ò¾îÁø´Ù. ´ÙÀ½¿¡´Â 7,8,9¸¦ listÀÇ ³¡¿¡ »ðÀÔÇÑ´Ù. ¸¶Áö¸·À¸·Î find() ¿¬»êÀ» »ç¿ëÇÏ¿© 7ÀÇ À§Ä¡¸¦ °¡¸®Å°´Â ¹Ýº¹ÀÚ¸¦ ã¾Æ, ±× ¾Õ¿¡ 4,5,6À» »ðÀÔÇÑ´Ù. °á°ú´Â 1ºÎÅÍ 9±îÁöÀÇ ¼ýÀÚµéÀ» ¼ø¼­´ë·Î °¡Áö´Â list°¡ µÈ´Ù. void main() { int threeToOne[] = {3, 2, 1}; int fourToSix[] = {4, 5, 6}; int sevenToNine[] = {7, 8, 9}; list aList; // first insert into the front // note that each value becomes new front copy(threeToOne, threeToOne+3, front_inserter(aList)); // then insert into the back copy(sevenToNine, sevenToNine+3, back_inserter(aList)); // find the seven, and insert into middle list::iterator seven = find(aList.begin(), aList.end(), 7); copy(fourToSix, fourToSix+3, inserter(aList, seven)); // copy result to output copy(aList.begin(), aList.end(), ostream_iterator(cout, " ")); cout << endl; } ¿©±â¼­, inserter(aList, aList.begin())°ú front_inserter(aList)¿¡ ÀÇÇØ »ý¼ºµÈ ¹Ýº¹Àڵ鰣¿¡ Áß¿äÇÏ°íµµ ¹Ì¹¦ÇÑ Â÷ÀÌ°¡ ÀÖÀ½À» ÁÖ¸ñÇØ¾ß ÇÑ´Ù. inserter(aList, aList.begin()) È£ÃâÇÏ°Ô µÇ¸é °ªµéÀ» listÀÇ ¾Õ¿¡ ¼ø¼­¸¦ ±×´ë·Î À¯ÁöÇÏ¿© »ðÀÔÇÏ´Â ¹Ý¸é¿¡, front_inserter(aList)´Â »ðÀԵǴ °¢°¢ÀÇ °ªµéÀÌ list¿¡ °¡¼­´Â ¸Ç¾Õ¿¡ »ðÀԵȴٴ Á¡ÀÌ´Ù. °á°úÀûÀ¸·Î front_inserter(aList)´Â ¿ø·¡ °ªµéÀÌ À¯ÁöÇß´ø ¼ø¼­°¡ µÚÁýÈ÷°Ô µÇ¸ç, inserter(aList, aList.begin())´Â ¿ø·¡ ¼ø¼­¸¦ ±×´ë·Î À¯ÁöÇÑ´Ù. 2.5 ¹Ýº¹ÀÚ ¿¬»ê(iterator operation) Ç¥ÁØ ¶óÀ̺귯¸®´Â ¹Ýº¹ÀÚ¸¦ ´Ù·ç´Âµ¥ »ç¿ëµÇ´Â µÎ°³ÀÇ ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù. advance() ÇÔ¼ö´Â ÇϳªÀÇ ¹Ýº¹ÀÚ¿Í ÇϳªÀÇ ¼ýÀÚ°ªÀ» ÀÎÀÚ·Î ¹Þ¾Æ¼­, ¹Ýº¹ÀÚ¸¦ ÁÖ¾îÁø °ª¸¸Å­ À̵¿½ÃŲ´Ù. void advance(InputIterator& iter, Distance& n); ÀÓÀÇÁ¢±Ù ¹Ýº¹ÀÚÀÇ °æ¿ì¿¡, À§ ÇÔ¼ö´Â iter + n; °ú °°Àº È¿°ú¸¦ °¡Áø´Ù. ±×·¯³ª, À§ ÇÔ¼ö´Â ¸ðµç ÇüÅÂÀÇ ¹Ýº¹ÀÚ¿¡ ´ëÇØ Àû¿ëµÉ ¼ö ÀÖ´Ù. À̵¿°Å¸®´Â ¼ø¹æÇ⠹ݺ¹ÀÚÀÇ °æ¿ì¿¡´Â ¹Ýµå½Ã ¾ç¼öÀ̾î¾ß ÇÏ°í, ¾ç¹æÇ⠹ݺ¹ÀÚ³ª ÀÓÀÇÁ¢±Ù ¹Ýº¹ÀÚÀÇ °æ¿ì¿¡´Â ¾ç¼ö³ª À½¼öÀÌ¸é µÈ´Ù. À§ ¿¬»êÀº ÀÓÀÇÁ¢±Ù ¹Ýº¹ÀÚ¿¡ ´ëÇؼ­¸¸ È¿À²Àû(constant time)ÀÌ´Ù. ´Ù¸¥ °æ¿ì¿¡´Â ¹Ýº¹ÀÚ¿¡ ´ëÇØ Áõ°¡ ¿¬»êÀÚ(++)³ª °¨¼Ò ¿¬»êÀÚ(--)¸¦ È£ÃâÇÏ´Â ·çÇÁ·Î advance()¸¦ ±¸ÇöÇÑ´Ù. advance() ÇÔ¼ö´Â ÇØ´ç ¹Ýº¹ÀÚ¿¡ ´ëÇØ ¿¬»êÀÌ À¯È¿ÇÑÁö¿¡ ´ëÇؼ­´Â µû·Î °Ë»çÇÏÁö ¾Ê´Â´Ù. µÎ¹ø° ÇÔ¼öÀÎ distance()´Â µÎ ¹Ýº¹ÀÚ°£ÀÇ °Å¸®¸¦ ¹ÝȯÇÑ´Ù. void distance(InputIterator first, InputIterator last, Distance& n); °á°ú°ªÀº ·¹ÆÛ·±½º·Î ³Ñ¾î°£ ¼¼¹ø° ÀÎÀÚ·Î ¹ÝȯµÇ¸ç, first¸¦ last·Î ¿Å±æ ¶§, ++¿¬»êÀÚ°¡ ¼öÇàµÇ´Â Ƚ¼ö¸¸Å­ Áõ°¡ÇÑ´Ù. µû¶ó¼­, ÀÌ ÇÔ¼ö¸¦ È£ÃâÇϱâ Àü¿¡ ¼¼¹ø° ÀÎÀÚ¸¦ ÅëÇØ ³Ñ°ÜÁö´Â º¯¼ö°¡ Á¦´ë·Î ÃʱâÈ­°¡ µÇ¾ú´ÂÁö¸¦ Ç×»ó È®ÀÎÇØ¾ß ÇÑ´Ù.