38-2-¶ó.ÇÔ¼ö Æ÷ÀÎÅÍ ¾î´ðÅÍ

ÇÔ¼ö Æ÷ÀÎÅÍ ¾î´ðÅÍ´Â ÀÏ¹Ý ÇÔ¼öÀÇ ¹øÁöÀÎ ÇÔ¼ö Æ÷ÀÎÅ͸¦ ÇÔ¼ö °´Ã¼Ã³·³ Æ÷ÀåÇÑ´Ù. ÇÔ¼ö Æ÷ÀÎÅ͵µ ¾îÂ÷ÇÇ () ¿¬»êÀڷΠȣÃâÇÒ ¼ö ÀÖÀ¸¹Ç·Î ±»ÀÌ ÇÔ¼ö °´Ã¼·Î ¸¸µéÁö ¾Ê¾Æµµ ¾Ë°í¸®Áò ÇÔ¼ö¿Í ÇÔ²² »ç¿ëÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª ÇÔ¼ö Æ÷ÀÎÅÍ´Â °´Ã¼°¡ ¾Æ´Ï¹Ç·Î ¾î´ðÅÍ´Â Àû¿ëÇÒ ¼ö ¾ø´Ù.

ÇÔ¼ö Æ÷ÀÎÅÍ¿¡ ¾î´ðÅ͸¦ ¾²°í ½Í´Ù¸é ÀÌ Æ÷ÀÎÅ͸¦ ·¡ÇÎÇØ¾ß Çϸç À̶§ ÇÔ¼ö Æ÷ÀÎÅÍ ¾î´ðÅ͸¦ »ç¿ëÇÑ´Ù. ¾Õ ¿¹Á¦ÀÇ IsMulti ÇÔ¼ö °´Ã¼¸¦ ÀÏ¹Ý ÇÔ¼ö·Î ¸¸µç ÈÄ ÀÌ ÇÔ¼ö¸¦ ¹ÙÀδõ·Î ¹­¾î¼­ find_if¿¡ »ç¿ëÇØ º¸ÀÚ.

 

¿¹ Á¦ : ptr_fun

#include <iostream>

#include <vector>

#include <algorithm>

#include <functional>

using namespace std;

 

bool IsMultiFunc(int a,int b)

{

     return (a % b == 0);

}

 

void main()

{

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

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

 

     vector<int>::iterator it;

     for (it=vi.begin();;it++) {

          it=find_if(it, vi.end(), bind2nd(ptr_fun(IsMultiFunc),3));

          if (it==vi.end()) break;

          cout << *it << "ÀÌ(°¡) ÀÖ´Ù" << endl;

     }

}

 

bind2nd ¾î´ðÅͰ¡ ¿ä±¸ÇÏ´Â °ÍÀº ÇÔ¼ö °´Ã¼¿Í °íÁ¤µÈ 2¹øÂ° ÀμöÀε¥ ÇÔ¼ö Æ÷ÀÎÅ͸¦ °ð¹Ù·Î ¾µ ¼ö´Â ¾ø´Ù. ÇÔ¼ö Æ÷ÀÎÅÍ´Â ÇÔ¼öÀÇ ½ÃÀÛ ¹øÁö¸¦ °¡¸®Å°´Â ´Ü¼øÇÑ »ó¼öÀÏ »ÓÀ̹ǷΠÅÛÇø´ÀÇ Àμö°¡ µÉ ¼ö ¾ø±â ¶§¹®ÀÌ´Ù. ptr_fun ÇÔ¼ö Æ÷ÀÎÅÍ ¾î´ðÅͰ¡ ÀÌ ÇÔ¼ö Æ÷ÀÎÅ͸¦ ÇÔ¼ö °´Ã¼·Î Æ÷ÀåÇϸç ÀÌ·¸°Ô Æ÷ÀåµÇ¸é ¹ÙÀδõ, ºÎÁ¤ÀÚ µîÀÇ ¾î´ðÅ͸¦ Àû¿ëÇÒ ¼ö ÀÖ´Ù.

ptr_funÀÇ µ¿ÀÛÀ» ÀÌÇØÇÏ·Á¸é Çì´õ ÆÄÀÏÀ» ºÐ¼®ÇØ º¸´Â °ÍÀÌ °¡Àå ºü¸£°í È®½ÇÇÏ´Ù. ´ÜÇ× ÇÔ¼ö¿Í ÀÌÇ× ÇÔ¼ö¿¡ ´ëÇØ ¿À¹ö·ÎµùµÇ¾î Àִµ¥ ¿ø¸®´Â ºñ½ÁÇϹǷΠ´ÜÇ× ÇÔ¼ö ¹öÀü¸¸ ºÐ¼®ÇØ º¸ÀÚ.

 

template<class Arg, class Result>

pointer_to_unary_function<Arg, Result> ptr_fun(Result (*pfunc)(Arg))

{

     return (pointer_to_unary_function<Arg, Result>(pfunc));

}

 

pointer_to_unary_functionÀ̶ó´Â Ŭ·¡½ºÀÇ °´Ã¼¸¦ ¸¸µé¾î ¸®ÅÏÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù. ÀÌ Å¬·¡½º(³Ê¹« ±æ¾î¼­ À̸§À» ¾²±â ½ÈÀ½)´Â À̸§ÀÌ ÀǹÌÇÏ´Â ¹Ù´ë·Î ´ÜÇ× ÇÔ¼ö Æ÷ÀÎÅ͸¦ ´ÜÇ× ÇÔ¼ö °´Ã¼·Î ¸¸µç´Ù. Çì´õ ÆÄÀÏ¿¡ ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾî Àִµ¥ ÀÌÇØÇϱ⠱׸® ¾î·ÆÁö ¾ÊÀº Ŭ·¡½ºÀÌ´Ù.

 

template<class Arg,class Result>

class pointer_to_unary_function : public unary_function<Arg, Result>

{

public:

     explicit pointer_to_unary_function(Result (*pfunc)(Arg)) : pFun(pfunc) { }

     Result operator()(Arg left) const { return (pFun(left)); }

protected:

     Result (pFun*)(Arg);

};

 

Arg ŸÀÔÀ» Àμö·Î ÃëÇϰí Result ŸÀÔÀ» ¸®ÅÏÇÏ´Â ÇÔ¼ö Æ÷ÀÎÅÍ pFunÀ» ¸â¹ö º¯¼ö·Î °¡Áö¸ç »ý¼ºÀÚ·Î Àü´ÞµÈ ÇÔ¼ö Æ÷ÀÎÅ͸¦ ÀÌ ¸â¹ö¿¡ ÀúÀåÇØ ³õ´Â´Ù. ±×¸®°í () ¿¬»êÀÚ ÇÔ¼ö´Â Àü´ÞµÈ Àμö left·Î pFun ÇÔ¼ö¸¦ È£ÃâÇϵµ·Ï µÇ¾î ÀÖ´Ù. °á±¹ ÀÌ Å¬·¡½º´Â ÇÔ¼ö Æ÷ÀÎÅ͸¦ ·¡ÇÎÇϰí ÀÖÀ¸¸ç () ¿¬»êÀÚ°¡ ÇÔ¼ö Æ÷ÀÎÅ͸¦ ´ë½Å È£ÃâÇÑ´Ù. ·¡Çκ¸´Ù ´õ Áß¿äÇÑ ¿ªÇÒÀº ÀÌ ÇÔ¼ö Æ÷ÀÎÅÍÀÇ Àμö¿Í ¸®ÅÏ Å¸ÀÔÀ» Á¤ÀÇÇϱâ À§ÇØ unary_functionÀ¸·ÎºÎÅÍ »ó¼ÓÀ» ¹Þ´Â´Ù´Â Á¡ÀÌ¸ç µû¶ó¼­ ÀÌ Å¬·¡½ºÀÇ °´Ã¼´Â ¾î´ðÅͺíÇÏ´Ù.

¿¹Á¦¿¡¼­´Â IsMultiFunc ÇÔ¼ö¸¦ ptr_funÀ¸·Î ¾î´ðÅͺí ÇÔ¼ö °´Ã¼·Î ¸¸µç ÈÄ bind2nd ¾î´ðÅÍ·Î µÎ ¹øÂ° Àμö¸¦ 3À¸·Î °íÁ¤Çß´Ù. ´ÙÀ½ ±¸¹®Àº ¿©±â¿¡ not1 ¾î´ðÅͱîÁö »ç¿ëÇØ¼­ 3ÀÇ ¹è¼ö°¡ ¾Æ´Ñ °ÍÀ» ã´Âµ¥ ¼¼ °¡Áö ¾î´ðÅ͸¦ µ¿½Ã¿¡ »ç¿ëÇØ ºÃ´Ù.

 

it=find_if(it, vi.end(), not1(bind2nd(ptr_fun(IsMultiFunc),3)));

 

ÀÌ ÇÔ¼ö °´Ã¼°¡ ±¸ÇöµÇ´Â °úÁ¤Àº ±²ÀåÈ÷ º¹ÀâÇÏ´Ù. ÇÔ¼ö Æ÷ÀÎÅ͸¦ ·¡ÇÎÇÏ¿© ¾î´ðÅͺí ÇÔ¼ö °´Ã¼¸¦ ¸¸µé°í ÀÌ ÇÔ¼ö °´Ã¼¸¦ ·¡ÇÎÇÏ¿© 2¹øÂ° ÇÇ¿¬»êÀÚ°¡ °íÁ¤µÈ ¶Ç ´Ù¸¥ ÇÔ¼ö °´Ã¼¸¦ ¸¸µé°í ÀÌ °´Ã¼¸¦ ´Ù½Ã ·¡ÇÎÇÏ¿© Æò°¡ °á°ú¸¦ ¹Ý´ë·Î ¸¸µå´Â °´Ã¼°¡ ¶Ç »ý¼ºµÈ´Ù. find_if´Â ¼øÈ¸Áß¿¡ ÀÌ °´Ã¼ÀÇ () ÇÔ¼ö¸¦ È£ÃâÇÏ°í ·¡ÆÛµéÀÌ °¨½Î°í ÀÖ´Â °´Ã¼¿Í ÇÔ¼öµéÀÌ ¿¬¼ÓÀûÀ¸·Î ÂüÁ¶µÇ¾î 3ÀÇ ¹è¼ö°¡ ¾Æ´Ñ °ªÀ» °ñ¶ó³½´Ù.

Áß°£¿¡¼­ À̸§µµ ¾ø´Â Àӽà °´Ã¼µéÀÌ Àá½Ã »ý¼ºµÇ°í ÇÔ¼ö°¡ ÇÔ¼ö¸¦ È£ÃâÇÏ´Â °úÁ¤ÀÌ ¿¬¼ÓµÇÁö¸¸ ¼Óµµ³ª ¿ë·®¿¡ º°·Î ºÒ¸®ÇÑ Á¡Àº ¾ø´Ù. ¿Ö³ÄÇϸé ÀÌ °´Ã¼µéÀº ¸â¹ö º¯¼ö¸¦ °¡ÁöÁö ¾ÊÀ¸¸ç ÇÔ¼ö È£ÃâÀº ¸ðµÎ ÀζóÀÎÈ­µÇ±â ¶§¹®ÀÌ´Ù. ½ÇÇà °úÁ¤ÀÌ ´ëÃæ »ó»óÀº °¡Áö¸¸ º¹ÀâÇϱâ´Â °ú¿¬ º¹ÀâÇÏ´Ù. Àͼ÷ÇØÁö¸é ÀÌ·± ³»ºÎ µ¿ÀÛ¿¡ ´ëÇØ ÀǽɾøÀÌ ±×·¯·Á´Ï ÇÏ°í ¾²°Ô µÉ °ÍÀÌ´Ù.