39-2-¶ó.ÀÓÀÇ Á¢±Ù ¹Ýº¹ÀÚ

ÀÓÀÇ Á¢±Ù ¹Ýº¹ÀÚ(Random Iterator)´Â ÃÖ»óÀ§ ·¹º§ÀÇ ¹Ýº¹ÀÚÀ̸ç Á¦°øÇÏ´Â ±â´ÉÀÌ °¡Àå ¸¹´Ù. ¾ç¹æÇ⠹ݺ¹ÀÚÀÇ ¸ðµç ±â´ÉÀ» Æ÷ÇÔÇϹǷΠ* ¿¬»êÀÚ·Î Àбâ, ¾²±â¿Í ++, -- ¿¬»êÀÚ·Î ¾Õ µÚ·Î À̵¿Çϱâ, °°Àº À§Ä¡¸¦ ¿©·¯ ¹ø ¾×¼¼½º Çϱ⠱â´ÉÀ» Á¦°øÇÑ´Ù. ¿©±â¿¡ ÀÓÀÇ À§Ä¡·Î À̵¿ÇÒ ¼ö ÀÖ´Â ±â´ÉÀÌ Ãß°¡·Î Á¦°øµÇ´Âµ¥ °Å¸®¿¡ »ó°ü¾øÀÌ Ç×»ó »ó¼ö ½Ã°£³»¿¡ À̵¿ °¡´ÉÇÏ´Ù.

¾ç¹æÇ⠹ݺ¹ÀÚ´Â ++, -- °¡ °¡´ÉÇÏÁö¸¸ Ç×»ó ÇÑÄ­¾¿¸¸ ¾Õ µÚ·Î À̵¿ÇÒ ¼ö ÀÖ´Â °Í°ú ºñ±³µÈ´Ù. ÀÓÀÇ À§Ä¡·Î °ðÀå À̵¿ÇÒ ¼ö ÀÖ´Ù´Â °ÍÀº ¹Ýº¹ÀÚ¿¡ ÀÓÀÇÀÇ Á¤¼ö¸¦ ´õÇÏ´Â +n ¿¬»êÀ» Á¦°øÇÑ´Ù´Â ¶æÀÌ´Ù. Æ÷ÀÎÅÍ¿¡ +n ¿¬»êÀ» Àû¿ëÇϸé n*sizeof(ŸÀÔ) ¸¸Å­ Áï½Ã À̵¿Çϴµ¥ ÀÓÀÇ Á¢±Ù ¿¬»êÀÚ°¡ ¹Ù·Î ÀÌ ±â´ÉÀ» Á¦°øÇϸç +n¿¡ ÀÇÇØ ÇöÀç À§Ä¡¿¡¼­ n¸¸Å­ ¶³¾îÁø ¿ä¼Ò·Î °ðÀå À̵¿ÇÒ ¼ö ÀÖ´Ù.

+n ¿¬»êÀÌ °¡´ÉÇϸé Ãß°¡·Î °¡´ÉÇØÁö´Â ¿¬»êÀÌ ¿©·¯ °³ »ý±ä´Ù. -nÀº À½¼ö¸¦ ´õÇÏ´Â °Í°ú °°À¸¹Ç·Î ´ç¿¬È÷ °¡´ÉÇϸç [ ] ¿¬»êÀÚ´Â *¿Í +n¿¬»êÀÇ Á¶ÇÕÀÎ *(it+n) ¿¬»êÀ̹ǷΠ¿ª½Ã Áö¿øµÈ´Ù. [ ] ¿¬»êÀÚ¸¦ »ç¿ëÇϸé ÁöÁ¤ÇÑ ÀÓÀÇÀÇ À§Ä¡°ªÀ» ¹Ù·Î ÀÐ°í ¾µ ¼öµµ ÀÖ´Ù. ¶ÇÇÑ º¹ÇÕ ´ëÀÔ ¿¬»êÀÚ +=, -=µµ Áö¿øµÇ´Âµ¥ ¸ðµÎ +nÀ¸·ÎºÎÅÍ ÆÄ»ýµÇ´Â ¿¬»êµéÀÌ´Ù.

ÀÓÀÇ Á¢±Ù ¹Ýº¹ÀÚ°¡ +nÀ» Áö¿øÇÒ ¼ö ÀÖ´Â ÀÌÀ¯´Â ÄÁÅ×À̳ÊÀÇ ¿ä¼ÒµéÀÌ ¹è¿­Ã³·³ ÀÎÁ¢ÇÏ°Ô ¹èÄ¡µÇ¾î Àֱ⠶§¹®ÀÌ´Ù. ¿ä¼ÒÀÇ Å©±â°¡ ÀÏÁ¤ÇÏ°í ¼­·Î ÀÌ¿ôÇØ ÀÖÀ¸¹Ç·Î À̵¿ÇÏ°í ½ÍÀº °Å¸®¿¡ ¿ä¼Ò Å©±â¸¦ °öÇѸ¸Å­ ´õÇϱ⸸ Çϸé Áï½Ã À̵¿ °¡´ÉÇÏ´Ù. ¹è¿­À» °¡¸®Å°´Â Æ÷ÀÎÅ͸¦ »ý°¢ÇØ º¸¸é ½±°Ô ÀÌÇØÇÒ ¼ö ÀÖ´Ù.

°°Àº ¹è¿­³»ÀÇ ÀÓÀÇ Á¢±Ù ¹Ýº¹ÀÚ³¢¸®´Â »¬¼Àµµ °¡´ÉÇÏ´Ù. µÎ ¹Ýº¹ÀÚ »çÀÌ¿¡ ÀÖ´Â ¿ä¼ÒµéÀÌ °°Àº Å©±â·Î ¸ð¿© ÀÖÀ¸¹Ç·Î »¬¼À °á°ú´Â ±¸°£³»ÀÇ ¿ä¼Ò °³¼ö¸¦ ³ªÅ¸³»´Â Á¤¼ö°ªÀÌ´Ù. ¶ÇÇÑ ¿ä¼ÒµéÀÌ ¼±ÇüÀûÀ¸·Î ¹èÄ¡µÇ¾î ÀÖÀ¸¹Ç·Î ¹Ýº¹ÀÚ³¢¸® ´ë¼Ò ºñ±³µµ °¡´ÉÇÏ´Ù. ¹øÁö°ªÀÌ Å« ¹Ýº¹ÀÚ°¡ Ç×»ó ´õ µÚÂÊ¿¡ ÀÖÀ¸¹Ç·Î ´ë¼Ò ºñ±³¿¡ ÀÇÇØ ¹Ýº¹ÀÚÀÇ ÀüÈĸ¦ ¸íÈ®ÇÏ°Ô ¾Ë ¼ö ÀÖ´Ù.

¸µÅ©¿¡ ÀÇÇØ ¿¬°áµÇ¾î ÀÖ´Â list ÄÁÅ×À̳ʴ ÀÓÀÇ Á¢±ÙÀÌ ºÒ°¡´ÉÇϹǷΠ¾ç¹æÇ⠹ݺ¹ÀÚ¸¦ Á¦°øÇÑ´Ù. ¿¬°á ¸®½ºÆ®ÀÇ ³ëµåµéÀÌ ÀÎÁ¢ÇØ ÀÖÁö ¾Ê°í ¸Þ¸ð¸® ¿©±â Àú±â¿¡ Èð¾îÁ® ÀÖÀ¸¹Ç·Î +n ¿¬»êÀÌ ºÒ°¡´ÉÇÏ¸ç ¸µÅ©¸¦ µû¶ó ÇÑÄ­¾¿ Á¡ÁøÀûÀ¸·Î À̵¿ÇÒ ¼ö¹Û¿¡ ¾ø´Ù. ¶ÇÇÑ ¹Ýº¹ÀÚÀÇ ¹øÁö¸¸À¸·Î ÀüÈĸ¦ ÆÇº°ÇÒ ¼ö ¾øÀ¸¹Ç·Î ´ë¼Ò ºñ±³µµ ºÒ°¡´ÉÇÏ¸ç ¹Ýº¹ÀÚ³¢¸® »¬¼ÀÀ» ÅëÇØ ±¸°£ÀÇ ¿ä¼Ò °³¼ö¸¦ ±¸ÇÒ ¼öµµ ¾ø´Ù. ÀÓÀÇ Á¢±ÙÀÌ ¾Æ´Ñ ¹Ýº¹ÀÚ·Î +n ¿¬»êÀ» Çϰųª µÎ ¹Ýº¹ÀÚÀÇ °Å¸®¸¦ ±¸ÇÏ°í ½Í´Ù¸é ´ÙÀ½ µÎ ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.

 

void advance(InIt &first, int off);

int distance(InIt first, InIt last);

 

advance´Â ¹Ýº¹ÀÚ¸¦ off¸¸Å­ µÚÂÊÀ¸·Î À̵¿½Ã۴µ¥ off°¡ À½¼öÀÏ ¼öµµ ÀÖÀ¸¹Ç·Î ¾ÕÂÊÀ¸·Îµµ À̵¿ÇÒ ¼ö ÀÖ´Ù. ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇϸé ÀÔ·Â ¹Ýº¹ÀÚ(µû¶ó¼­ ¼ø¹æÇâ, ¾ç¹æÇâµµ)¿¡ +n ¿¬»êÀÌ °¡´ÉÇØÁø´Ù. distance´Â µÎ ¹Ýº¹ÀÚ »çÀÌÀÇ °Å¸®¸¦ ±¸ÇÏ¿© Á¤¼ö°ªÀ» ¸®ÅÏÇÑ´Ù. ¿¹Á¦¸¦ ÅëÇØ µÎ ÇÔ¼ö¸¦ °£´ÜÈ÷ Å×½ºÆ®ÇØ º¸ÀÚ. ¼Ò½º¿¡¼­ ÁÖ¼® 󸮵Ǿî ÀÖ´Â ÁÙÀº ¿¡·¯°¡ ¹ß»ýÇÏ´Â ºÎºÐÀÌ´Ù.

 

¿¹ Á¦ : advance

#include <iostream>

#include <list>

using namespace std;

 

void main()

{

     int ari[]={1,2,3,4,5,6,7};

     list<int> li(&ari[0],&ari[7]);

 

     list<int>::iterator it=li.begin();

     printf("%d\n",*it);                      // ÀÐÀ» ¼ö ÀÖ´Ù.

     printf("%d\n",*(++it));                 // ÇÑÄ­ ÀüÁø °¡´É

//  printf("%d\n",it[3]);               // ¿¡·¯:ÀÓÀÇ À§Ä¡¸¦ ÀÐÁö´Â ¸øÇÔ

//  it+=3;                                    // ¿¡·¯:ÀÓÀÇ À§Ä¡·Î À̵¿ÇÏÁö ¸øÇÔ

     advance(it,3);                            // advance·Î À̵¿ °¡´É

     printf("%d\n",*it);                     

//  printf("°Å¸®=%d\n",li.end()-li.begin());                 // ¿¡·¯:¹Ýº¹ÀÚ³¢¸® »¬¼ÀÀº ¾ÈµÊ

     printf("°Å¸®=%d\n",distance(li.begin(),li.end()));   // distance·Î °Å¸®¸¦ ±¸ÇÏ´Â °ÍÀº °¡´É

}

 

¸®½ºÆ® ÄÁÅ×À̳ʰ¡ Á¦°øÇÏ´Â ¾ç¹æÇ⠹ݺ¹ÀÚ´Â +nÀ» Áö¿øÇÏÁö ¾ÊÀ¸¹Ç·Î [ ] ¿¬»êÀÚ·Î ÀÓÀÇ À§Ä¡¸¦ Àаųª +=nÀ¸·Î ÀÓÀÇ À§Ä¡·Î À̵¿ÇÒ ¼ö ¾øÀ¸¸ç ¹Ýº¹ÀÚ³¢¸® »¬¼ÀÀ» ÇÒ ¼öµµ ¾ø´Ù. ±×·¯³ª advance¿Í distance ÇÔ¼ö¸¦ »ç¿ëÇÏ¸é °¡´ÉÇϱâ´Â ÇÏ´Ù. ½ÇÇà °á°ú´Â ´ÙÀ½°ú °°´Ù.

 

1

2

5

°Å¸®=7

 

ÀÌ °á°ú¸¦ º¸¸é ¾ç¹æÇ⠹ݺ¹ÀÚµµ ÀÓÀÇ Á¢±ÙÀÌ °¡´ÉÇÑ °Íó·³ º¸ÀÌ¸ç ½ÇÁ¦·Î °¡´ÉÇϱ⵵ ÇÏ´Ù. ±×·¯³ª ¼ÓÀ» µé¿©´Ù º¸¸é ¾öû³­ ²Ç¼ö°¡ ¼û¾î ÀÖÀ½À» ¹ß°ßÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½Àº advance ÇÔ¼öÀÇ ±¸Çö ÄÚµåÀε¥ ¾î¶»°Ô +n ¿¬»êÀ» ¼öÇàÇÏ´ÂÁö º¸ÀÚ.

 

void advance(InIt &first, int off)

{

     for (;off > 0;--off) { ++first; }

     for (;off < 0;++off) { --first; }

}

 

offÀÇ ºÎÈ£¿¡ µû¶ó µÎ ·çÇÁ Áß Çϳª¸¦ ½ÇÇàÇϴµ¥ ¾ç¼öÀÎ °æ¿ì¸¸ º¸¸é off¸¦ °è¼Ó °¨¼Ò½ÃŰ¸é¼­ first ¹Ýº¹ÀÚ¸¦ °è¼Ó Áõ°¡½ÃŲ´Ù. °á±¹ ++first¸¦ off¸¸Å­ ¹Ýº¹ÇÔÀ¸·Î½á first¸¦ off¸¸Å­ µÚÂÊÀ¸·Î À̵¿½ÃŰ´Â °ÍÀÌ´Ù. ¸®½ºÆ®ÀÇ ¹Ýº¹ÀÚ¿¡ ÀÌ ÇÔ¼ö¸¦ Àû¿ëÇÏ¸é ¸µÅ©¸¦ µû¶ó ´ÙÀ½ ³ëµå·Î À̵¿Çϱ⸦ off¸¸Å­ ¹Ýº¹ÇÏ´Â ´Ü¼ø ¹«½ÄÇÑ ÁþÀ» ÇÏ°Ô µÈ´Ù.

ÁøÂ¥ ÀÓÀÇ Á¢±ÙÀÌ °¡´ÉÇÑ ¹Ýº¹ÀÚ´Â +nÀ» ÇÑ ¹ø¿¡ ¼öÇàÇÒ ¼ö Àִµ¥ ºñÇØ ¾ç¹æÇ⠹ݺ¹ÀÚ´Â off¸¸Å­ ¹Ýº¹ÇØ¾ß ÇϹǷΠ¼öÇà ¼Óµµ´Â °¨È÷ ºñ±³°¡ µÇÁö ¾Ê´Â´Ù. ÀÓÀÇ Á¢±Ù ¹Ýº¹ÀÚ´Â it[30000]À» ÇÑ ¹ø¿¡ ¹Ù·Î ã¾Æ °¡Áö¸¸ ¾ç¹æÇ⠹ݺ¹ÀÚ´Â ´ÙÀ½ ¸µÅ© ã¾Æ 3¸¸¸®¸¦ °¡¾ß ÇϹǷΠÁøÁ¤ÇÑ ÀǹÌÀÇ +n ¿¬»êÀ» Áö¿øÇÑ´Ù°í º¼ ¼ö ¾ø´Ù. advance¿Í distance´Â ²À ÇÊ¿äÇÒ °æ¿ì¿¡ »ç¿ëÇÒ ¼ö´Â ÀÖÁö¸¸ nÀÌ Ä¿Áö¸é È¿À²ÀÌ ¶³¾îÁø´Ù´Â Á¡À» ¾Ë¾Æ¾ß ÇÑ´Ù.

ÀÌ·± Àǹ̿¡¼­ º¼ ¶§ ÀÓÀÇ Á¢±Ù ¹Ýº¹ÀÚ´Â ´Ü¼øÈ÷ ÀÓÀÇ Á¢±ÙÀÌ °¡´ÉÇÏ´Ù´Â Á¤µµ·Î Á¤ÀÇÇÏ´Â °Íº¸´Ù »ó¼ö ½Ã°£³»¿¡ ¿øÇÏ´Â °÷À¸·Î Áï½Ã À̵¿ÇÒ ¼ö ÀÖ´Â ¹Ýº¹ÀÚ·Î Á¤ÀÇÇÏ´Â °ÍÀÌ ¿Ç´Ù. ¿ä¼ÒµéÀÌ ÀÎÁ¢ÇØ ÀÖ´Â º¤ÅÍ´Â ÀÓÀÇ Á¢±Ù ¹Ýº¹ÀÚ¸¦ Á¦°øÇϸç Á¤Àû ¹è¿­ÀÇ À§Ä¡¸¦ °¡Áö´Â Æ÷ÀÎÅ͵µ ¿Ïº®ÇÑ ÀÓÀÇ Á¢±Ù ¹Ýº¹ÀÚÀÌ´Ù.

ÀÓÀÇ Á¢±Ù ¹Ýº¹ÀÚ´Â °¡Àå ±â´ÉÀÌ ¸¹Àº ÃÖ»óÀ§ÀÇ ¹Ýº¹ÀÚÀÌ¸ç ¸ðµç ¹Ýº¹ÀÚÀÇ ±â´ÉÀ» ´Ù Æ÷ÇÔÇÑ´Ù. ±×·¡¼­ STLÀÇ ¸ðµç ¾Ë°í¸®Áò°ú ÇÔ²² »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¹Ý¸é ÀÓÀÇ Á¢±Ù ¹Ýº¹ÀÚ¸¦ ¿ä±¸ÇÏ´Â ¾Ë°í¸®ÁòÀº ÀÓÀÇ Á¢±Ù ¹Ýº¹ÀÚ¸¸ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ´ëÇ¥ÀûÀ¸·Î sort°¡ Àִµ¥ È¿À²ÀûÀÎ Á¤·ÄÀ» À§Çؼ­´Â ¿ä¼Ò³¢¸® ºñ±³, ±³È¯À» ¸¹ÀÌ ÇØ¾ß Çϸç À̶§ ºü¸¥ ¼Óµµ·Î ¿ä¼Ò »çÀ̸¦ À̵¿ÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ¶ÇÇÑ À̺Р°Ë»öÀ» ÇÏ´Â binary_search¾Ë°í¸®Áòµµ ÀÓÀÇ Á¢±Ù ¹Ýº¹ÀÚ¸¦ ¿ä±¸ÇÑ´Ù.