38-2-´Ù.¹ÙÀδõ

IsMulti3 ÇÔ¼ö °´Ã¼´Â Á¤¼ö°ªÀÌ 3ÀÇ ¹è¼öÀÎÁö¸¦ Á¶»çÇϴµ¥ ÀÓÀÇ Á¤¼öÀÇ ¹è¼ö¸¦ Á¶»çÇÒ ¼ö ÀÖµµ·Ï Á» ´õ ÀϹÝÈ­ÇØ º¸ÀÚ.

 

¿¹ Á¦ : IsMulti

#include <iostream>

#include <vector>

#include <algorithm>

#include <functional>

using namespace std;

 

struct IsMulti : public binary_function<int,int, bool> {

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

          return (a % b == 0);

     }

};

 

void main()

{

     IsMulti IM;

     if (IM(6,3)) { cout << "6Àº 3ÀÇ ¹è¼öÀÌ´Ù." << endl; }

     if (IM(9,2)) { cout << "9´Â 2ÀÇ ¹è¼öÀÌ´Ù." << endl; }

}

 

IsMulti ÇÔ¼ö·Î µÎ °³ÀÇ Á¤¼ö a, b¸¦ Àμö·Î Àü´Þ¹Þ¾Æ a¸¦ b·Î ³ª´« ³ª¸ÓÁö°¡ 0ÀÎÁö¸¦ º¸¸é a°¡ bÀÇ ¹è¼öÀÎÁö¸¦ Á¶»çÇÒ ¼ö ÀÖ´Ù. main¿¡¼­ ÀÌ ÇÔ¼ö °´Ã¼¸¦ »ç¿ëÇÏ¿© 6ÀÌ 3ÀÇ ¹è¼öÀÎÁö, 9°¡ 2ÀÇ ¹è¼öÀÎÁö Á¶»çÇØ º¸¾Ò´Âµ¥ ù ¹ø° È£Ã⸸ ÂüÀÌ°í µÎ ¹ø°´Â °ÅÁþÀÌ´Ù. IsMulti(a,3)Àº IsMulti3(a)¿Í °°¾Æ 3ÀÇ ¹è¼ö ¿©ºÎµµ Á¶»çÇÒ ¼ö ÀÖÀ½Àº ¹°·ÐÀÌ°í µÎ ¹ø° Àμö¸¦ º¯°æÇÔ¿¡ µû¶ó ´Ù¸¥ ¼öÀÇ ¹è¼ö ¿©ºÎµµ Á¶»çÇÒ ¼ö ÀÖ´Ù.

µÎ °³ÀÇ Àμö¸¦ Àü´Þ¹ÞÀ½À¸·Î½á ÀϹݼºÀ» È®º¸ÇÑ °ÍÀº ÁÁÀºµ¥ ÀÌ·¸°Ô µÇ¸é ´ÜÇ× Á¶°ÇÀÚ¸¦ ¿ä±¸ÇÏ´Â find_if¿Í´Â ÇÔ²² »ç¿ëÇÒ ¼ö ¾ø´Ù. find_if´Â ÄÁÅ×À̳ʸ¦ ¼øȸÇϸ鼭 ¿ä¼Ò°ª Çϳª¸¸ Á¶°ÇÀÚÀÇ Àμö·Î Àü´ÞÇϹǷΠÀμö µÎ °³¸¦ ¹Þ´Â ÀÌÇ× Á¶°ÇÀڿʹ ŸÀÔÀÌ ¸ÂÁö ¾ÊÀº °ÍÀÌ´Ù. »ç¿ëÇÏ°íÀÚ ÇÏ´Â ÇÔ¼ö °´Ã¼ÀÇ Ç×ÀÌ ¿ä±¸µÇ´Â ÇÔ¼ö °´Ã¼¿Í ´Ù¸¦ ¶§ ¹ÙÀδõ ¾î´ðÅ͸¦ »ç¿ëÇÑ´Ù.

¹ÙÀδõ´Â ÀÌÇ× ÇÔ¼ö °´Ã¼ÀÇ ³ª¸ÓÁö ÇÑ Àμö¸¦ ƯÁ¤ÇÑ °ªÀ¸·Î °íÁ¤ÇÏ¿© ´ÜÇ× ÇÔ¼ö °´Ã¼·Î º¯È¯ÇÑ´Ù. find_ifó·³ ´ÜÇ× Á¶°ÇÀÚ °´Ã¼¸¦ ¿ä±¸ÇÏ´Â ÇÔ¼ö¿¡°Ô ÀÌ¹Ì ¸¸µé¾î ³õÀº ÀÌÇ× ÇÔ¼ö °´Ã¼¸¦ Àü´ÞÇÏ·Á¸é ´ÜÇ×À¸·Î º¯È¯ÇØ¾ß Çϴµ¥ À̶§ ¹ÙÀδõ°¡ ÇÊ¿äÇÏ´Ù. ¹ÙÀδõ´Â ´ÙÀ½ µÎ °¡Áö Çü½ÄÀ¸·Î »ç¿ëÇÑ´Ù.

 

bind1st(ÀÌÇ× °´Ã¼, °íÁ¤°ª)

bind2nd(ÀÌÇ× °´Ã¼, °íÁ¤°ª)

 

bind1st´Â ù ¹ø° Àμö¸¦ °íÁ¤Çϸç bind2nd´Â µÎ ¹ø° Àμö¸¦ °íÁ¤ÇÑ´Ù. IsMultiÀÌÇ× Á¶°ÇÀÚ¿Í bind2nd ¾î´ðÅ͸¦ »ç¿ëÇÏ¿© find_if¸¦ È£ÃâÇØ º¸ÀÚ.

 

¿¹ Á¦ : bind2nd

#include <iostream>

#include <vector>

#include <algorithm>

#include <functional>

using namespace std;

 

struct IsMulti : public binary_function<int,int, bool> {

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

          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(IsMulti(),3));

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

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

     }

}

 

bind2nd(IsMulti(),3)Àº ÀÌÇ× Á¶°ÇÀÚ IsMultiÀÇ µÎ ¹ø° Àμö¸¦ 3À¸·Î °íÁ¤ÇÏ¿© ´ÜÇ× Á¶°ÇÀÚ·Î º¯È¯ÇÏ¸ç ±×·¡¼­ ÀÌ Á¶°ÇÀÚ¸¦ find_if¿Í ÇÔ²² »ç¿ëÇÒ ¼ö ÀÖ´Ù. IsMulti´Â binary_functionÀ¸·ÎºÎÅÍ »ó¼Ó¹Þ¾ÒÀ¸¹Ç·Î ¾î´ðÅͺí ÇÔ¼ö °´Ã¼ÀÌ´Ù. »ç¿ëÀÚ°¡ Á÷Á¢ ¸¸µç ÇÔ¼ö °´Ã¼ ¿Ü¿¡ ¹Ì¸® Á¦°øµÇ´Â ÇÔ¼ö °´Ã¼¿¡µµ ¾î´ðÅ͸¦ Àû¿ëÇÒ ¼ö ÀÖ´Ù. ¿¹Á¦ÀÇ °Ë»ö½ÄÀ» ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇØ º¸ÀÚ.

 

it=find_if(it, vi.end(), bind2nd(greater<int>(),5));

it=find_if(it, vi.end(), bind2nd(less_equal<int>(),5));

 

greater´Â µÎ °ªÀ» ºñ±³ÇÏ¿© ¾ÕÀÇ °ªÀÌ µÚÀÇ °ªº¸´Ù ´õ Å«Áö¸¦ Á¶»çÇÏ´Â ÀÌÇ× Á¶°ÇÀÚÀε¥ bind2nd·Î µÚÀÇ Àμö¸¦ 5·Î °íÁ¤ÇßÀ¸¹Ç·Î Àü´ÞµÈ Àμö°¡ 5º¸´Ù Å«Áö¸¦ Á¶»çÇÏ´Â ´ÜÇ× Á¶°ÇÀÚ°¡ µÈ´Ù. ÀÌ·¸°Ô ¸¸µé¾îÁø Á¶°ÇÀÚ¸¦ find_if·Î Àü´ÞÇϸé ÄÁÅ×À̳ÊÀÇ ¿ä¼ÒÁß 5º¸´Ù Å« °ªÀÌ Á¶»çµÉ °ÍÀÌ´Ù. less_equalÀº ÀÌÇÏÀÇ Á¶°ÇÀ» Á¡°ËÇÏ´Â ´ÜÇ× Á¶°ÇÀÚÀÌ¸ç ¿©±â¿¡ bind2nd ¾î´ðÅ͸¦ Àû¿ëÇϸé 5 ÀÌÇÏÀÇ ¿ä¼ÒµéÀÌ °Ë»öµÈ´Ù.

¾î´ðÅÍ°¡ ¸¸µé¾î ³»´Â °Íµµ ÀÏÁ¾ÀÇ ÇÔ¼ö °´Ã¼À̹ǷΠµÎ °³ ÀÌ»óÀ» ÁßøÇؼ­ »ç¿ëÇÒ ¼öµµ ÀÖ´Ù. ´ÙÀ½ ¿¹´Â ºÎÁ¤ÀÚ¿Í ¹ÙÀδõ¸¦ µ¿½Ã¿¡ Àû¿ëÇÏ¿© 3ÀÇ ¹è¼ö°¡ ¾Æ´Ñ ¿ä¼ÒµéÀ» °Ë»öÇÑ´Ù. IsMulti´Â µÎ Á¤¼öÀÇ ¹è¼ö °ü°è¸¦ Á¶»çÇϴµ¥ bind2nd¿¡ ÀÇÇØ ³ª´©´Â ¼ö°¡ 3À¸·Î °íÁ¤µÇ°í not1¿¡ ÀÇÇØ °á°ú¸¦ ¹Ý´ë·Î µÚÁýÀ¸¹Ç·Î °á±¹ 3À¸·Î ³ª´©¾îÁöÁö ¾Ê´Â °ªÀ» ã°Ô µÇ´Â °ÍÀÌ´Ù.

 

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

 

bind1st´Â ÀÌÇ× Á¶°ÇÀÚÀÇ Ã¹ ¹ø° Àμö¸¦ °íÁ¤Çϴµ¥ bind2nd¸¸Å­ ÀÚÁÖ »ç¿ëµÇÁö´Â ¾Ê´Â´Ù. À§ ¿¹Á¦¿¡¼­ bind2nd¸¦ bind1st·Î ¼öÁ¤ÇÏ¸é ³ª´©¾îÁö´Â ¼ö°¡ °íÁ¤µÇ°í ³ª´©´Â ¼ö¿¡ ÄÁÅ×À̳ÊÀÇ ¿ä¼ÒµéÀÌ Àü´ÞµÇ¹Ç·Î °íÁ¤µÈ ÀμöÀÇ ¾à¼öµéÀÌ Á¶»çµÉ °ÍÀÌ´Ù. ¿¹Á¦ÀÇ °Ë»ö¹®À» ¼öÁ¤ÇØ º¸ÀÚ.

 

it=find_if(it, vi.end(), bind1st(IsMulti(),6));

 

ù ¹ø° Àμö¸¦ 6À¸·Î °íÁ¤ÇØ µÎ¸é 6À¸·Î ³ª´« ³ª¸ÓÁö°¡ 0ÀÎ ¿ä¼ÒµéÀÌ Á¶»çµÈ´Ù. ÀÌ ¸»Àº °ð 6ÀÇ ¾à¼ö¸¦ ã´Â´Ù´Â ¶æÀ̸ç 1, 2, 3, 6ÀÌ Ãâ·ÂµÉ °ÍÀÌ´Ù.

¹ÙÀδõ´Â °ú¿¬ ¾î¶»°Ô ±¸ÇöµÇ¾î ÀÖÀ»±î ºÐ¼®ÇØ º¸ÀÚ. ¹°·Ð »ç¿ë¸¸À» ¸ñÀûÀ¸·Î ÇÑ´Ù¸é ±»ÀÌ ºÐ¼®±îÁö ÇØ º¼ ÇÊ¿ä´Â ¾ø´Ù. µ¿ÀÛÀ» ÀÌÇØÇß´Ù¸é ºÐ¼®ÇØ º¸Áö ¾Ê¾Æµµ ³»ºÎ´Â ´ëÃæ ÁüÀÛÇÒ ¼ö ÀÖÀ» °ÍÀ̸ç C++¿¡ ÀÚ½ÅÀÖ´Â »ç¶÷Àº Á÷Á¢ ºñ½ÁÇÑ Å¬·¡½º¸¦ ¸¸µé ¼öµµ ÀÖÀ» °ÍÀÌ´Ù. µÎ ¹ÙÀδõ´Â ´ëü·Î ºñ½ÁÇÏ°Ô ±¸ÇöµÇ¾î ÀÖÀ¸¹Ç·Î bind2nd¸¸ ºÐ¼®ÇØ º¸ÀÚ.

 

template<class F, class T>

binder2nd<F> bind2nd(const F& func, const T& right)

{

     typename F::second_argument_type val(right);

     return (binder2nd<F>(func, val));

}

 

not1°ú ¸¶Âù°¡Áö·Î Á÷Á¢ ÇÔ¼ö °´Ã¼¸¦ È£ÃâÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ÇÔ¼ö °´Ã¼¸¦ ·¡ÇÎÇÏ´Â binder2nd Ŭ·¡½ºÀÇ °´Ã¼¸¦ »ý¼ºÇÏ¿© ¸®ÅÏÇÑ´Ù. binder2nd Ŭ·¡½º´Â ´Ù¼Ò º¹ÀâÇÏ°Ô ¼±¾ðµÇ¾î ÀÖ´Ù.

 

template<class F> class binder2nd

     : public unary_function<typename F::first_argument_type, typename F::result_type>

{

public:

     typedef unary_function<typename F::first_argument_type, typename F::result_type> base;

     typedef typename base::argument_type argument_type;

     typedef typename base::result_type result_type;

 

     binder2nd(const F& func, const typename F::second_argument_type& right)

          : op(func), value(right) { }

     result_type operator()(const argument_type& left) const { return (op(left, value)); }

     result_type operator()(argument_type& left) const { return (op(left, value)); }

protected:

     F op;

     typename F::second_argument_type value;

};

 

binder2nd Ŭ·¡½º´Â unary_functionÀ¸·ÎºÎÅÍ »ó¼Ó¹ÞÀ¸¹Ç·Î °á±¹ ´ÜÇ× ÇÔ¼ö °´Ã¼ÀÌ´Ù. ³»ºÎ¿¡ ÀÌÇ× ÇÔ¼ö °´Ã¼ op¿Í °íÁ¤µÈ µÎ ¹ø° ÀμöÀÇ °ª value¸¦ ¸â¹ö·Î °¡Áö¸ç »ý¼ºÀÚ¿¡¼­ ÀÌ µÑÀ» Àμö·Î Àü´Þ¹Þ¾Æ ÃʱâÈ­ÇÑ´Ù. ·¡ÇÎÇÑ ÀÌÇ× ÇÔ¼ö °´Ã¼¸¦ È£ÃâÇÒ ¼ö ÀÖ´Â ¸¸¹ÝÀÇ Áغñ¸¦ ÇØ ³õ´Â °ÍÀÌ´Ù.

() ¿¬»êÀÚ ÇÔ¼ö´Â op ÇÔ¼ö °´Ã¼¸¦ È£ÃâÇÏµÇ Ã¹ ¹ø° Àμö left´Â ÀÚ½ÅÀÌ Àü´Þ¹ÞÀº Àμö¸¦ ±×´ë·Î ³Ñ±â°í µÎ ¹ø° Àμö´Â »ý¼ºÀÚ¿¡¼­ ¹Ì¸® ¹Þ¾Æ ³õÀº value¸¦ ³Ñ±ä´Ù. ±×·¡¼­ ÀÌ ÇÔ¼ö´Â ´ÜÇ×À̸ç È£ÃâÇÒ ¶§ left Àμö Çϳª¸¸ Àü´ÞÇÏ¸é µÈ´Ù. () ¿¬»êÀڴ ù ¹ø° Àμö¿¡ ´ëÇØ »ó¼ö, ºñ»ó¼ö ¹öÀüÀÌ ¿À¹ö·ÎµùµÇ¾î ÀÖ´Ù. bind1stµµ ºñ½ÁÇÏ°Ô ºÐ¼®µÇ´Âµ¥ binder1st °´Ã¼¸¦ »ý¼ºÇϸç binder1st´Â ù ¹ø° Àμö¸¦ ¹Ì¸® ¹Þ¾Æ ³õ¾Ò´Ù°¡ È£ÃâÇÒ ¶§ °íÁ¤µÈ Àμö¸¦ Àü´ÞÇÒ °ÍÀÌ´Ù.