38-1-¶ó.ÇÔ¼ö °´Ã¼ÀÇ Á¾·ù

ÇÔ¼ö °´Ã¼°¡ ÇÏ´Â ÀÏÀº ºñ±³, ´ëÀÔ, ÇÕ»ê µî ¾Ë°í¸®Áò ±¸ÇöÁß¿¡ ÇÊ¿äÇÑ ¿¬»êÀ» ó¸®ÇÏ´Â °ÍÀ̶ó°í ÇÒ ¼ö ÀÖ´Ù. ÃëÇÏ´Â ÇÇ¿¬»êÀÚ °³¼ö·Î ¿¬»êÀÚ¸¦ ºÐ·ùÇϵíÀÌ ÇÔ¼ö °´Ã¼µµ ÇÊ¿äÇÑ ÀμöÀÇ °³¼ö·Î ºÐ·ùÇÒ ¼ö ÀÖÀ¸¸ç ¸®ÅÏ°ªÀÇ Å¸ÀÔµµ Áß¿äÇÑ ºÐ·ù ±âÁØÀÌ´Ù. STLÀº Àμö¿Í ¸®ÅÏ°ª, Áï ¿øÇü¿¡ µû¶ó ÇÔ¼ö °´Ã¼¸¦ ´ÙÀ½°ú °°ÀÌ ºÐ·ùÇÏ°í °íÀ¯ÀÇ À̸§À» ºÎ¿©ÇÑ´Ù.

 

ÀμöÀÇ °³¼ö

boolÀÌ ¾Æ´Ñ ¸®ÅÏ°ª

bool ¸®ÅÏ

¾øÀ½

Gen

 

´ÜÇ×

UniOp

UniPred

ÀÌÇ×

BinOp

BinPred

 

UniOp´Â Àμö Çϳª¸¦ ÃëÇÏ´Â ´ÜÇ× ÇÔ¼ö °´Ã¼À̸ç BinPred´Â Àμö µÑÀ» ÃëÇØ boolÇüÀ» ¸®ÅÏÇÏ´Â Á¶°ÇÀÚ ÇÔ¼ö °´Ã¼ÀÌ´Ù. ÇÇ¿¬»êÀÚ¸¦ Çϳªµµ ÃëÇÏÁö ¾Ê´Â ÇÔ¼ö °´Ã¼¸¦ »ý¼º±â(Generator)¶ó°í Çϴµ¥ ÀԷ¾øÀÌ È¥ÀÚ ¹«¾ùÀΰ¡¸¦ ¸¸µé¾î ³»´Â ¿ªÇÒ¸¸ ÇÑ´Ù. ´ëÇ¥ÀûÀ¸·Î ³­¼ö¸¦ »ý¼ºÇÏ´Â ÇÔ¼ö °´Ã¼°¡ »ý¼º±âÀÌ´Ù. ÇÔ¼ö °´Ã¼¸¦ ĪÇÏ´Â ÀÌ Ç¥±â¸¸ º¸¸é ÇÊ¿äÇÑ ÇÔ¼öÀÇ ¿øÇüÀ» ½±°Ô À¯ÃßÇÒ ¼ö ÀÖ´Ù.

¾Ë°í¸®Áò ÇÔ¼öµéÀº ¿¹¿Ü¾øÀÌ ÅÛÇø´ ÇÔ¼ö·Î ±¸ÇöµÇ¾î Àִµ¥ ÇÔ¼ö °´Ã¼¿¡ ÇØ´çÇÏ´Â ÅÛÇø´ ÀμöÀÇ À̸§¿¡ ¾î¶² Á¾·ùÀÇ ÇÔ¼ö °´Ã¼°¡ ¿ä±¸µÇ´ÂÁö Ç¥±âµÈ´Ù. ¸¶Ä¡ ÇÔ¼öÀÇ Çü½Ä Àμö À̸§¿¡ ÀǹÌÀÖ´Â À̸§À» ºÙ¿© À¯¿ëÇÑ Á¤º¸¸¦ Ç¥±âÇÏ´Â °Í°ú °°´Ù. ¾Õ¿¡¼­ ¹è¿î ¸î °³ÀÇ ¾Ë°í¸®Áò ÇÔ¼ö ¿øÇüÀ» »ìÆ캸¸é ¸¶Áö¸· ÀμöÀÎ ÇÔ¼ö °´Ã¼¿¡ ÀÌ·¯ÇÑ Á¤º¸°¡ Æ÷ÇԵǾî ÀÖ´Ù.

 

InIt find_if(InIt first, InIt last, UniPred F);

void sort(RanIt first, RanIt last, BinPred F);

T accumulate(InIt first, InIt last, T val, BinOp op);

 

find_ifÀÇ ¼¼ ¹ø° Àμö´Â UniPred·Î µÇ¾î ÀÖÀ¸¹Ç·Î Àμö Çϳª¸¦ ÃëÇÏ°í boolÇüÀ» ¸®ÅÏÇÏ´Â ´ÜÇ× Á¶°ÇÀÚÀÓÀ» ½±°Ô ¾Ë ¼ö ÀÖ´Ù. find_if¿Í ÇÔ²² »ç¿ëÇÒ ¼ö ÀÖ´Â ÇÔ¼ö ¶Ç´Â ÇÔ¼ö °´Ã¼ÀÇ () ¿¬»êÀÚ ¿øÇüÀº ´ÙÀ½°ú °°À» °ÍÀÌ´Ù.

 

bool Pred(T &val) { }

 

¿©±â¼­ T´Â ¹°·Ð °Ë»ö ´ë»ó ÄÁÅ×À̳ÊÀÇ ¿ä¼Ò ŸÀÔÀ̸ç ÇÔ¼ö È£Ãâ¹®ÀÇ ½ÇÀμö ŸÀÔÀ¸·Î ±¸Ã¼È­µÈ´Ù. °Ë»ö ´ë»óÀÎ val Àμö´Â °ªÀ¸·Î ¹Þµç ·¹ÆÛ·±½º·Î ¹Þµç ÇÔ¼ö º»Ã¼¿¡¼­ valÀ» ÂüÁ¶ÇÏ´Â ±¸¹®¿¡´Â ¿µÇâÀ» ÁÖÁö ¾ÊÀ¸¹Ç·Î ¾Æ¹«·¡µµ »ó°ü¾ø´Ù. sort ÇÔ¼ö´Â µÎ °³ÀÇ Àμö¸¦ Àü´Þ¹Þ¾Æ µÎ Àμö¸¦ ºñ±³ÇÑ ÈÄ boolÇüÀ» ¸®ÅÏÇÏ´Â ÇÔ¼ö °´Ã¼¸¦ ¿ä±¸Çϸç accumulateÀÇ ÇÔ¼ö °´Ã¼´Â µÎ Àμö¸¦ Àü´Þ¹Þ¾Æ ¸ðÁ¾ÀÇ ¿¬»êÀ» ÇÑ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù.

¸¸¾à ¾Ë°í¸®Áò ÇÔ¼ö°¡ ¿ä±¸ÇÏ´Â ¿øÇü°ú ´Ù¸¥ ÇÔ¼ö °´Ã¼¸¦ Àμö·Î Àü´ÞÇÏ¸é ¾î¶»°Ô µÉ±î? for_each ÇÔ¼ö¸¦ Å×½ºÆ®ÇÏ´Â functor ¿¹Á¦ÀÇ print ÇÔ¼ö °´Ã¼¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇØ º¸ÀÚ. for_each´Â ´ÜÇ× ÇÔ¼ö °´Ã¼(UniOp)¸¦ ¿ä±¸Çϴµ¥ ¿¡·¯¸¦ À¯¹ß½ÃÅ°±â À§ÇØ ÀϺη¯ µÎ °³ÀÇ Àμö¸¦ ¹Þµµ·Ï Çß´Ù.

 

struct print {

     void operator()(int a, int b) const {

          printf("%d\n",a);

     }

};

 

¹®¹ý»óÀÇ ¹®Á¦´Â ¾øÀ¸¹Ç·Î ÀÌ °´Ã¼ Á¤Àǹ® ÀÚü´Â ¿¡·¯°¡ ¾Æ´Ï´Ù. ±×·¯³ª ÀÌ °´Ã¼¸¦ »ç¿ëÇÏ´Â °÷¿¡¼­ ¹®Á¦°¡ ¹ß»ýÇϴµ¥ for_eachÀÇ º»Ã¼¿¡¼­, Áï algorithm Çì´õ ÆÄÀÏ¿¡¼­ ¿¡·¯°¡ ¹ß»ýÇÑ´Ù. for_each´Â ¾Æ¸¶µµ ´ÙÀ½°ú °°ÀÌ ±¸ÇöµÇ¾î ÀÖÀ» °ÍÀÌ´Ù.

 

UniOp for_each(InIt first, InIt last, UniOp op)

{

     for (;first != last; ++first)

          op(*first);                    // ¿©±â¼­ ¿¡·¯ ¹ß»ý

     return (op);

}

 

for_each´Â ±¸°£À» ¼øȸÇϸ鼭 ¸Å ¿ä¼Ò¸¶´Ù op ÇÔ¼ö °´Ã¼¸¦ È£ÃâÇϴµ¥ Àμö´Â ÇöÀç ¼øȸÁßÀÎ ¹Ýº¹ÀÚÀÇ °ª *first Çϳª¹Û¿¡ ¾ø´Ù. ÇÏÁö¸¸ ÀÌ °ªÀ» Àü´Þ¹Þ´Â °´Ã¼ÀÇ () ¿¬»êÀÚ ÇÔ¼ö¿Í´Â ¿øÇüÀÌ ¸ÂÁö ¾ÊÀ¸¹Ç·Î È£ÃâÇÒ ¼ö ¾ø´Ù´Â ÄÄÆÄÀÏ ¿¡·¯°¡ ¹ß»ýÇÏ´Â °ÍÀÌ´Ù. Á¤È®ÇÏ°Ô´Â ÅÛÇø´ ÇÔ¼ö°¡ ±¸Ã¼È­µÇ´Â °úÁ¤ÀÇ ÅÛÇø´ º»Ã¼¿¡¼­ ±¸¹® ¿¡·¯°¡ ¹ß»ýÇÑ´Ù.

·±Å¸ÀÓ Áß¿¡ ¹ß»ýÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ÄÄÆÄÀÏÁß¿¡ ¹º°¡ À߸øµÇ¾ú´Ù´Â °ÍÀ» Áï½Ã ¾Ë ¼ö ÀÖÀ¸¹Ç·Î À§ÇèÇÏÁö´Â ¾Ê´Ù. ÀÌ·± Ư¼ºÀ» ŸÀÔ¿¡ ´ëÇÑ ¾ÈÁ¤¼ºÀ̶ó°í Çϴµ¥ ¿Àµ¿ÀÛÇÒ ¼ÒÁö°¡ ÀÖ´Â Äڵ带 ÄÄÆÄÀÏÁß¿¡ ¸í¹éÇÑ ¿¡·¯·Î ó¸®ÇÏ¿© ½Ç»ý½ÃÀÇ ¹ö±×¸¦ ÃÖ¼ÒÈ­ÇÑ´Ù. À̹ø¿¡´Â ´ÙÀ½°ú °°ÀÌ ¸®ÅÏ°ªÀÇ Å¸ÀÔ¸¸ ´Ù¸£°Ô ¼öÁ¤ÇØ º¸ÀÚ.

 

struct print {

     int operator()(int a) const {

          return printf("%d\n",a);

     }

};

 

for_each´Â ÇÔ¼ö °´Ã¼¸¦ È£ÃâÇϱ⸸ ÇÒ »Ó ¸®ÅÏ°ªÀ» ¿ä±¸ÇÏÁö´Â ¾Ê´Â´Ù. ÇÏÁö¸¸ ÀÌ·¸°Ô ¼öÁ¤Çصµ º° ¹®Á¦´Â ¾ø´Ù. ¸®ÅÏ°ªÀ» ³Ñ±â´õ¶óµµ for_each¿¡¼­ ÀÌ °ªÀ» ¹«½ÃÇÒ ¼ö ÀÖ°í for_each ÅÛÇø´ÀÇ º»Ã¼¿Í Ãæµ¹ÇÏ´Â ºÎºÐÀÌ ¾ø±â ¶§¹®ÀÌ´Ù. ¸¸¾à ÅÛÇø´ º»Ã¼¿¡¼­ ¸®ÅÏ°ªÀ» ¸í½ÃÀûÀ¸·Î ¿ä±¸ÇÒ ¶§´Â ¸®ÅÏ°ª ŸÀÔµµ Ç×»ó Á¤È®ÇØ¾ß ÇÑ´Ù. sortfunctor ¿¹Á¦ÀÇ compare ÇÔ¼ö °´Ã¼¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇØ º¸ÀÚ.

 

struct compare {

     void operator()(string a,string b) const {

          stricmp(a.c_str(),b.c_str()) < 0;

     }

};

 

ÀÌ ÇÔ¼ö °´Ã¼´Â µÎ °³ÀÇ Á¤·Ä ´ë»óÀ» Àü´Þ¹Þ¾Æ ¾Õ µÚ¸¦ °¡·Á ÁÖ´Â ¿ªÇÒÀ» ÇϹǷΠºñ±³ °á°ú¸¦ ¹Ýµå½Ã ¸®ÅÏÇØ¾ß Çϴµ¥ voidÇüÀ¸·Î À߸ø ÀÛ¼ºÇß´Ù. ÀÌ·¸°Ô µÇ¸é sort ÅÛÇø´ º»Ã¼¿¡¼­ ºñ±³ °á°ú¸¦ »ç¿ëÇÏ´Â ºÎºÐ¿¡¼­ ¿¡·¯°¡ ¹ß»ýÇÑ´Ù. sortÀÇ ³»ºÎ¿¡´Â ¾Æ¸¶ ´ÙÀ½°ú °°Àº Äڵ尡 ÀÛ¼ºµÇ¾î ÀÖÀ» °ÍÀÌ´Ù. ¹°·Ð ½ÇÁ¦ ÄÚµå´Â ÄÄÆÄÀÏ·¯¸¶´Ù ´Ù¸£´Ù.

 

if (op(*first, *(first-1))

 

op ÇÔ¼ö °´Ã¼·Î µÎ ¿ä¼Ò¸¦ ³Ñ°Ü ºñ±³Çϵµ·Ï ÇÏ°í ±× °á°ú¿¡ µû¶ó ¿ä¼Ò¸¦ Àç¹èÄ¡ÇØ¾ß Çϴµ¥ opÀÇ °á°ú°¡ ¾øÀ¸¹Ç·Î if¹®¿¡ »ç¿ëÇÒ ¼ö ¾ø´Â °ÍÀÌ´Ù. compare °´Ã¼ÀÇ () ¿¬»êÀÚ°¡ int¸¦ ¸®ÅÏÇϵµ·Ï ¼öÁ¤ÇÏ´Â °ÍÀº °¡´ÉÇÏ´Ù. int´Â boolÇü°ú ȣȯ ŸÀÔÀÌ°í if¹®ÀÇ Á¶°ÇÀý·Î »ç¿ëµÉ ¼ö Àֱ⠶§¹®ÀÌ´Ù.

¾î¶² °Ç µÇ°í ¾î¶² °Ç ¾ÈµÇ°í ÇÔ¼ö °´Ã¼ÀÇ ¿Ã¹Ù¸¥ ÇüŸ¦ °áÁ¤ÇÏ´Â °ÍÀÌ ±²ÀåÈ÷ ¾î·Á¿î ±ÔÄ¢ÀÎ °Í °°Áö¸¸ ¿øÄ¢Àº Áö±ØÈ÷ °£´ÜÇÏ´Ù. ÅÛÇø´ÀÇ Å¸ÀÔÀº º»Ã¼ÀÇ ¸ðµç Á¶°ÇÀ» ¸¸Á·ÇØ¾ß ÇÑ´Ù´Â µ¿ÀÏÇÑ ¾Ë°í¸®Áò Á¶°ÇÀ̶ó´Â °ÍÀÌ Àִµ¥ ¹Ù·Î ÀÌ ¿øÄ¢¿¡¸¸ ¸Â°Ô ÀÛ¼ºÇÏ¸é µÈ´Ù. for_eachÀÇ º»Ã¼¿¡ ¸Â´Â ÇÔ¼ö °´Ã¼À̱⸸ ÇÏ¸é µÇ°í sort°¡ ±¸ÇöÇÏ´Â Äڵ带 Á¦´ë·Î ½ÇÇàÇÒ ¼ö ÀÖÀ¸¸é µÇ´Â °ÍÀÌ´Ù. ¾Ë°í¸®ÁòÀÇ ¸ñÀû°ú µ¿ÀÛ °úÁ¤À» Àß »ý°¢ÇØ º¸¸é ¾ÆÁÖ »ó½ÄÀûÀÌ´Ù. ºñ±³ ÇÔ¼ö´Â boolÀ» ¸®ÅÏÇÏ´Â°Ô ´ç¿¬ÇÏ°í for_eachÀÇ Àμö´Â ÇϳªÀÏ ¼ö¹Û¿¡ ¾ø´Ù.

¸¸¾à ÀÌ ³»¿ëµéÀÌ Çò°¥¸°´Ù¸é C++ ÅÛÇø´ÀÇ Á¤ÀÇ¿Í Æ¯Â¡, ±×¸®°í ÄÄÆÄÀÏ ½Ã¿¡ ÀÓÀÇÀÇ Å¸ÀÔ¿¡ ´ëÇØ ±¸Ã¼È­µÈ´Ù´Â °ÍÀ» ÀÌÇØÇÏÁö ¸øÇؼ­ÀÏ È®·üÀÌ ³ô´Ù. ´ÙÀ½ ¿¹Á¦ÀÇ for_each´Â °ú¿¬ ¾î¶² ŸÀÔÀÇ ÇÔ¼ö °´Ã¼¸¦ ¹Þ¾ÆµéÀÌ´ÂÁö »ý°¢ÇØ º¸ÀÚ. ÀÌ ¹®Á¦¸¦ È®½ÇÈ÷ ÀÌÇØÇϸé ÅÛÇø´ÀÇ º»ÁúÀ» ÀÌÇØÇß´Ù°í º¼ ¼ö ÀÖÀ¸¸ç ¾ÕÀ¸·Î STLÀ» È°¿ëÇϴµ¥ º° ¹®Á¦°¡ ¾øÀ» °ÍÀÌ´Ù.

 

¿¹ Á¦ : dualinstance

#include <iostream>

#include <list>

#include <vector>

#include <algorithm>

using namespace std;

 

void functor1(int a)

{

     printf("%d ",a);

};

 

struct functor2 {

     void operator()(double a) const {

          printf("%f\n",a);

     }

};

 

void main()

{

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

     vector<int> vi(&ari[0],&ari[5]);

     double ard[]={1.2,3.4,5.6,7.8,9,9};

     list<double> ld(&ard[0],&ard[5]);

 

     for_each(vi.begin(),vi.end(),functor1);

     cout << endl;

     for_each(ld.begin(),ld.end(),functor2());

}

 

main¿¡¼­ º¤ÅÍ¿Í ¸®½ºÆ® µÎ °³ÀÇ ÄÁÅ×À̳ʸ¦ Á¤ÀÇÇÏ°í for_each¸¦ µÎ ¹ø È£ÃâÇÏ¿© µÎ ÄÁÅ×À̳ÊÀÇ ³»¿ëÀ» Ãâ·ÂÇß´Ù. À̶§ °¢°¢ ´Ù¸¥ ÇÔ¼ö °´Ã¼¸¦ »ç¿ëÇߴµ¥ ù ¹ø° for_each´Â ÇÔ¼ö Æ÷ÀÎÅ͸¦, µÎ ¹ø° for_each´Â ÇÔ¼ö °´Ã¼¸¦ »ç¿ëÇß´Ù. ÀÌ µÑÀº ¿øÇüµµ ´Ù¸£°í °ªÀ» Ãâ·ÂÇÏ´Â ¹æ½Äµµ ´Ù¸£´Ù. ½ÇÇà °á°ú´Â ´ÙÀ½°ú °°´Ù.

 

1 2 3 4 5

1.200000

3.400000

5.600000

7.800000

9.000000

 

±×·¸´Ù¸é for_each ÇÔ¼öÀÇ ¼¼ ¹ø° Àμö´Â µµ´ëü ¾î¶² ŸÀÔÀ̶ó°í ¼³¸íÇÒ ¼ö ÀÖÀ»±î? ¿¹Á¦°¡ Àß µ¿ÀÛÇÏ´Â °É º¸¸é void (*)(int) ŸÀÔÀÇ ÇÔ¼ö¸¦ ¹Þ±âµµ ÇÏ°í void(*)(double) ŸÀÔÀÇ () ¿¬»êÀÚ°¡ Á¤ÀÇµÈ °´Ã¼¸¦ ¹Þ±âµµ ÇÑ´Ù. °¡º¯ Àμöµµ ¾Æ´Ñ ÇÔ¼ö°¡ µÎ °³ÀÇ ´Ù¸¥ ŸÀÔÀ» ¾î¶»°Ô ¹Þ¾ÆµéÀÏ ¼ö Àִ°¡ ¸»ÀÌ´Ù.

ÀÌ ¹®Á¦ÀÇ ÇØ´äÀº °£´ÜÇÏ´Ù. for_each´Â ÇÔ¼ö°¡ ¾Æ´Ï¶ó ÇÔ¼ö¸¦ ¸¸µé ¼ö ÀÖ´Â ÅÛÇø´ÀÏ »ÓÀ̸ç È£ÃâºÎ¿¡¼­ Àü´ÞµÇ´Â ŸÀÔ¿¡ ¸Â°Ô ¸Å¹ø ±¸Ã¼È­µÈ´Ù. ¾î¶² ŸÀÔÀ» Á¤ÇØ ³õ°í ¹Þ´Â°Ô ¾Æ´Ï¶ó µé¾î¿À´Â´ë·Î ¹Þ¾Æµé¿© ±¸Ã¼È­µÇ´Â °ÍÀÌ´Ù. ¹°·Ð Àü´ÞµÈ ŸÀÔÀº ÅÛÇø´ º»Ã¼ÀÇ Äڵ带 100% Áö¿øÇϴ ŸÀÔÀ̾î¾ß ÇÑ´Ù. À§ ¿¹¿¡¼­ for_each ÇÔ¼öÀÇ ½Çü´Â µÎ °³ Á¸ÀçÇÏ¸ç °¢ ¹öÀüÀÌ ¹Þ¾ÆµéÀ̴ ŸÀÔÀÌ ´Ù¸£´Ù.

STLÀº ¾Ë°í¸®ÁòÀÌ ¾î¶² ÇÔ¼ö¸¦ È£ÃâÇÒ °ÍÀÎÁö¿¡ ´ëÇÑ ¸ðµç °áÁ¤À» ÄÄÆÄÀϽÿ¡ ¼öÇàÇÑ´Ù. Á¶°Ç¸¸ ¸Â´Ù¸é ±×°Ô ÇÔ¼ö°Ç °´Ã¼°Ç °¡¸®Áö ¾ÊÀ¸¸ç ±×·¡¼­ ÀϹÝÀûÀ̶ó°í ÇÏ´Â °ÍÀÌ´Ù. ÄÄÆÄÀÏ Å¸ÀÓ¿¡ ¸ðµç Á¡°Ë°ú °áÁ¤ÀÌ ÀÌ·ç¾îÁö¹Ç·Î ÄÄÆÄÀÏ ½Ã°£Àº Á¶±Ý ´õ °É¸®°ÚÁö¸¸ ½ÇÇà½ÃÀÇ È¿À²Àº ÁÁÀ» ¼ö¹Û¿¡ ¾ø´Ù.