38-2-³ª.ºÎÁ¤ÀÚ

ºÎÁ¤ÀÚ´Â boolÀ» ¸®ÅÏÇÏ´Â Á¶°ÇÀÚ ÇÔ¼ö °´Ã¼ÀÇ Æò°¡ °á°ú¸¦ ¹Ý´ë·Î µÚÁý´Â ¶Ç ´Ù¸¥ ÇÔ¼ö °´Ã¼ÀÌ´Ù. º¯ÇüÇÏ´Â ÇÔ¼ö °´Ã¼ÀÇ ÇüÅ¿¡ µû¶ó ´ÙÀ½ µÎ °³ÀÇ ºÎÁ¤ÀÚ°¡ Á¤ÀǵǾî ÀÖ´Ù.

 

ºÎÁ¤ÀÚ

Àû¿ë´ë»ó

not1

´ÜÇ× Á¶°ÇÀÚ ÇÔ¼ö °´Ã¼(UniPred)

not2

ÀÌÇ× Á¶°ÇÀÚ ÇÔ¼ö °´Ã¼(BinPred)

 

ºÎÁ¤ÀÚÀÇ »ç¿ë¿¹¸¦ º¸±â À§ÇØ ¸ÕÀú Á¶°ÇÀÚ¸¦ »ç¿ëÇÏ´Â °£´ÜÇÑ ¿¹Á¦ºÎÅÍ ¸¸µé¾î º¸ÀÚ. ´ÙÀ½ ¿¹Á¦´Â Á¤¼ö º¤ÅÍ¿¡¼­ 3ÀÇ ¹è¼öÀÎ ¿ä¼Ò¸¦ °Ë»öÇÏ¿© Ãâ·ÂÇÑ´Ù.

 

¿¹ Á¦ : Predicate

#include <iostream>

#include <vector>

#include <algorithm>

#include <functional>

using namespace std;

 

struct IsMulti3 : public unary_function<int,bool> {

     bool operator()(int a) const {

          return (a % 3 == 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(), IsMulti3());

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

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

     }

}

 

IsMulti3 ÇÔ¼ö °´Ã¼´Â a¶ó´Â Á¤¼öÇü Àμö Çϳª¸¦ ÃëÇϸç a¸¦ 3À¸·Î ³ª´« ³ª¸ÓÁö°¡ 0ÀÎÁö¸¦ Á¶»çÇÏ¿© ±× ÁøÀ§°ªÀ» ¸®ÅÏÇÑ´Ù. main¿¡¼­ 1~10±îÁöÀÇ Á¤¼ö¿¡ ´ëÇØ ÀÌ Á¶°ÇÀÚ¸¦ ¸¸Á·ÇÏ´Â Á¤¼ö°ªÀ» ã¾Æ Ãâ·ÂÇßÀ¸¹Ç·Î 3, 6, 9ÀÇ ¿ä¼ÒµéÀÌ °Ë»öµÉ °ÍÀÌ´Ù. ÇÔ¼ö °´Ã¼¸¦ ÀÌÇØÇÑ´Ù¸é ¾ÆÁÖ ½¬¿î ¿¹Á¦ÀÌ´Ù. ±×·¸´Ù¸é À̹ø¿¡´Â ¹Ý´ëÀÇ Á¶°Ç, Áï 3ÀÇ ¹è¼ö°¡ ¾Æ´Ñ °ªÀ» °Ë»öÇϵµ·Ï ¼öÁ¤ÇØ º¸ÀÚ. °¡Àå ¸ÕÀú ¶° ¿À¸£´Â ¹æ¹ýÀº ¿ªÁ¶°ÇÀ» ÃëÇÏ´Â ÇÔ¼ö °´Ã¼¸¦ »õ·Î ¸¸µå´Â °ÍÀÌ´Ù.

 

struct IsNotMulti3 : public unary_function<int,bool> {

     bool operator()(int a) const {

          return (a % 3 != 0);

     }

};

it=find_if(it, vi.end(), IsNotMulti3());

 

IsMulti3°¡ a % 3 == 0À» Á¡°ËÇϴµ¥ ºñÇØ IsNotMulti3´Â a % 3 != 0 Á¶°ÇÀ» Á¡°ËÇÑ´Ù. ÀÌ·¸°Ô ÇÔ¼ö °´Ã¼¸¦ »õ·Î ¸¸µé°í find_if·Î ÀÌ ÇÔ¼ö °´Ã¼¸¦ Àü´ÞÇϸé 3ÀÇ ¹è¼ö°¡ ¾Æ´Ñ 1, 2, 4, 5 µûÀ§µéÀÌ °Ë»öµÉ °ÍÀÌ´Ù. ÀÌ ¿¹¿¡¼­ ÇÔ¼ö °´Ã¼ÀÇ À̸§Àº ¾îµð±îÁö³ª ¼³¸íÀ» À§ÇÑ À̸§ÀÏ »ÓÀ̹ǷΠ±»ÀÌ IsNotMulti3·Î ¹Ù²ÙÁö ¾Ê¾Æµµ »ó°ü¾ø´Ù. ±×·¯³ª ÇÔ¼öÀÇ Àǹ̰¡ ¹Ù²î¾úÀ¸¹Ç·Î À̸§µµ ¹Ù²Ù´Â °ÍÀÌ ¹Ù¶÷Á÷ÇÏ´Ù.

¹®Á¦¸¦ Ç®±â´Â ÇßÁö¸¸ ºñ½ÁÇÑ ÀÏÀ» ÇÏ´Â ÇÔ¼ö °´Ã¼¸¦ µÑ ¾¿À̳ª ¸¸µé¾ú´Ù´Â °ÍÀÌ º°·Î ¸¶À½¿¡ µéÁö ¾Ê´Â´Ù. ÀÌ·± ½ÄÀ¸·Î Á¶°ÇÀÌ ÇÊ¿äÇÒ ¶§¸¶´Ù ÇÔ¼ö °´Ã¼¸¦ ¸Å¹ø ¸¸µé¾î¾ß ÇÑ´Ù¸é ±× ¼ö°¡ ¾öû³¯ °ÍÀÌ´Ù. ÀÌ·² ¶§ ºÎÁ¤ÀÚ¸¦ »ç¿ëÇϸé ÀÌ¹Ì ¸¸µé¾îÁ® ÀÖ´Â ÇÔ¼ö °´Ã¼¸¦ Á¶±Ý¸¸ º¯ÇüÇÏ¿© ¹Ý´ëÀÇ Æò°¡¸¦ Çϵµ·Ï ÇÒ ¼ö ÀÖ´Ù. À§ ¿¹Á¦ÀÇ IsMulti3´Â ´ÜÇ× Á¶°ÇÀÚÀ̹ǷΠnot1 ºÎÁ¤ÀÚ¸¦ »ç¿ëÇÏ¸é µÈ´Ù. ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇØ º¸ÀÚ.

 

it=find_if(it, vi.end(), not1(IsMulti3()));

 

»ç¿ëÇÏ´Â ¹æ¹ýÀº ¾ÆÁÖ °£´ÜÇÏ´Ù. ¹Ý´ë·Î ¸¸µé°í ½ÍÀº ÇÔ¼ö °´Ã¼¸¦ not1À¸·Î °¨½Î±â¸¸ ÇÏ¸é µÈ´Ù. IsMulti3´Â Àμö·Î ¹ÞÀº ¼ö°¡ 3ÀÇ ¹è¼öÀÎÁö¸¦ ÆÇ´ÜÇÏÁö¸¸ not1ÀÌ ±× °á°ú¸¦ ¹Ý´ë·Î ¸¸µé¾î ¸®ÅÏÇϹǷΠfind_if°¡ IsMulti3ÀÇ ¿ªÁ¶°ÇÀ» °Ë»öÇÏ°Ô µÈ´Ù. µÎ °³ÀÇ ÇÔ¼ö °´Ã¼¸¦ µû·Î ¸¸µé ÇÊ¿ä¾øÀÌ Çϳª¸¸ ¸¸µéµÇ ¹Ý´ë·Î µÚÁý´Â °ÍÀº ¾î´ðÅÍ·Î ½±°Ô ÇÒ ¼ö ÀÖ´Ù. ÀÌÇ× Á¶°ÇÀÚ¿¡ ´ëÇؼ­´Â not2¸¦ »ç¿ëÇÏ¸é µÈ´Ù.

not1 ºÐ¼®

»ç¿ë¸¸À» ¸ñÀûÀ¸·Î ÇÑ´Ù¸é ºÎÁ¤ÀÚÀÇ µ¿ÀÛ°ú »ç¿ë¹ý¸¸ ÀÍÇô µÎ¸é ÃæºÐÇÏ´Ù. ¹Ý´ë·Î ¸¸µé°í ½ÍÀº Á¶°ÇÀÚ¸¦ not1()·Î °¨½Î±â¸¸ ÇÏ¸é µÇ¹Ç·Î »ç¿ë¹ýÀº Áö±ØÈ÷ ½¬¿î ÆíÀÌ´Ù. ±×·¯³ª not1ÀÌ ¾î¶»°Ô ÇÔ¼ö °´Ã¼ÀÇ Æò°¡ °á°ú¸¦ ¹Ý´ë·Î ¸¸µå´ÂÁö ÁöÀû È£±â½ÉÀÌ »ý±â°í ¿ø¸®±îÁö ¾Ë°í ½Í´Ù¸é Çì´õ ÆÄÀÏ ³»ºÎ¸¦ µé¿©´Ù º¸Áö ¾ÊÀ» ¼ö ¾ø´Ù. ³»ºÎ¸¦ ºÐ¼®ÇØ º¸Áö ¾ÊÀ¸¸é µµ´ëü not1ÀÌ ÇÔ¼öÀÎÁö, °´Ã¼ÀÎÁö, ¸ÅÅ©·ÎÀÎÁöÁ¶Â÷µµ ÆľÇÇϱâ Èûµé°í STLÀÌ ¹º°¡ ¸¶¼ú°°Àº »ç±â¸¦ Ä¡´Â °Í °°¾Æ ±âºÐÀÌ ±×´ÙÁö »óÄèÇÏÁö ¸øÇÏ´Ù. not1Àº functional Çì´õ ÆÄÀÏ¿¡ ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾî ÀÖ´Â ÇÔ¼ö ÅÛÇø´ÀÌ´Ù.

 

template<class F>

unary_negate<F> not1(const F& func)

{

     return (unary_negate<F>(func));

}

 

F ŸÀÔÀÇ ÇÔ¼ö °´Ã¼ func¸¦ Àμö·Î Àü´Þ¹Þ¾Æ unary_negate<F> Ŭ·¡½ºÀÇ °´Ã¼¸¦ »ý¼ºÇ쵂 »ý¼ºÀÚÀÇ Àμö·Î func°¡ Àü´ÞµÈ´Ù. unary_negate´Â ´ÙÀ½°ú °°ÀÌ Á¤ÀÇµÈ Å¬·¡½º ÅÛÇø´À̸ç Àμö·Î ÇÔ¼ö °´Ã¼ÀÇ Å¸ÀÔ F¸¦ Àü´Þ¹Þ´Â´Ù.

 

template<class F>

class unary_negate : public unary_function<typename F::argument_type, bool>

{

protected:

     F functor;

public:

     explicit unary_negate(const F& func) : functor(func) { }

     bool operator()(const typename F::argument_type& left) const {

          return (!functor(left));

     }

};

 

F ŸÀÔÀÇ ¸â¹ö º¯¼ö functor°¡ ¼±¾ðµÇ¾î ÀÖ°í »ý¼ºÀÚ¿¡¼­ Àμö·Î Àü´ÞµÈ func·Î ÀÌ ¸â¹ö¸¦ ÃʱâÈ­ÇÑ´Ù. functor°¡ ÇÔ¼ö °´Ã¼ ŸÀÔÀÇ ¸â¹ö º¯¼öÀ̹ǷΠ°á±¹ unary_negate´Â ÇÔ¼ö °´Ã¼ Çϳª¸¦ ĸ½¶È­ÇÑ´Ù°í ÇÒ ¼ö ÀÖ´Ù. () ¿¬»êÀÚ ÇÔ¼ö´Â functor ÇÔ¼ö¸¦ È£ÃâÇ쵂 ! ¿¬»êÀÚ¸¦ Àû¿ëÇÏ¿© Æò°¡ °á°ú¸¦ ¹Ý´ë·Î ¸¸µé¾î ¸®ÅÏÇÑ´Ù. ±×·¡¼­ func°¡ 3ÀÇ ¹è¼ö¸¦ °Ë»öÇÑ´Ù¸é unary_negate´Â !func Áï 3ÀÇ ¹è¼ö°¡ ¾Æ´Ñ ¼ö¸¦ °Ë»öÇÏ´Â °ÍÀÌ´Ù.

unary_negate°¡ Àμö·Î Àü´ÞµÈ ÇÔ¼ö °´Ã¼¸¦ ĸ½¶È­ÇÏ°í ÀÖ´Ù°¡ È£Ãâ½Ã ĸ½¶È­ÇÑ ÇÔ¼ö °´Ã¼ÀÇ ¹Ý´ë °á°ú¸¦ ¸®ÅÏÇϹǷΠÇÔ¼ö °´Ã¼ÀÇ ¿ø·¡ Àǹ̸¦ ºÎÁ¤ÇÏ´Â ºÎÁ¤ÀÚ°¡ µÈ´Ù. find_if·Î IsMulti3¸¦ ĸ½¶È­ÇÑ unary_negate °´Ã¼ Çϳª¸¦ ¸¸µé¾î¼­ ´øÁ® ÁÖ¸é ¿øÇÏ´Â ¸ñÀûÀ» ´Þ¼ºÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

 

it=find_if(it, vi.end(), unary_negate<IsMulti3>(IsMulti3()));

 

ÇÑ ÁÙ·Î °£´ÜÇÏ°Ô Ç¥±âÇߴµ¥ ¿ø·¡´ë·Î Á¦´ë·Î ¾²¸é ´ÙÀ½ ¼¼ ÁÙ·Î ½á¾ß ÇÑ´Ù.

 

IsMulti3 I;

unary_negate<IsMulti3> N(I);

it=find_if(it, vi.end(), N);

 

3ÀÇ ¹è¼ö¸¦ ÆǺ°ÇÏ´Â ÇÔ¼ö °´Ã¼ I¸¦ ¼±¾ðÇÏ°í I¸¦ ĸ½¶È­ÇÏ´Â ºÎÁ¤ÀÚ N °´Ã¼¸¦ ¼±¾ðÇÏ°í find_if¿¡°Ô N °´Ã¼¸¦ Àü´ÞÇÏ´Â °ÍÀÌ´Ù. ÀÌ °úÁ¤À» ´Ü¼øÈ­ÇØ ³õÀº °ÍÀÌ ¹Ù·Î not1ÀÌ¸ç °ýÈ£¾È¿¡ ºÎÁ¤ÇÏ°íÀÚ ÇÏ´Â ÇÔ¼ö °´Ã¼¸¸ Àü´ÞÇÏ¸é µÈ´Ù. not1Àº Àü´ÞµÈ ÇÔ¼ö °´Ã¼·ÎºÎÅÍ unary_negate Àӽà °´Ã¼¸¦ »ý¼ºÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù.

find_if´Â ÁöÁ¤ÇÑ ±¸°£À» ¼øȸÇϸ鼭 Àü´ÞµÈ ÇÔ¼ö °´Ã¼ÀÇ () ¿¬»êÀÚ¸¦ È£ÃâÇϵµ·Ï ÀÛ¼ºµÇ¾î ÀÖÀ¸¸ç () ¿¬»êÀÚ°¡ true¸¦ ¸®ÅÏÇÏ¸é ±× ¶§ÀÇ ¹Ýº¹ÀÚ¸¦ ¸®ÅÏÇÑ´Ù. °Ë»ö Á¶°ÇÀ» ÆÇ´ÜÇØÁÙ ´ë»óÀÌ ÇÔ¼ö Æ÷ÀÎÅÍÀÎÁö ¶Ç´Â () ¿¬»êÀÚ¸¦ ÀçÁ¤ÀÇÇÑ ÇÔ¼ö °´Ã¼ÀÎÁö ¶Ç´Â ÇÔ¼ö °´Ã¼¸¦ ĸ½¶È­ÇÑ ºÎÁ¤ÀÚÀÎÁö µûÀ§´Â »ó°üÇÏÁö ¾Ê´Â´Ù. ¾î·µç () ±¸¹®À¸·Î È£Ãâ °¡´ÉÇÏ°í bool°ªÀ» ¸®ÅÏÇϱ⸸ ÇÏ¸é µÇ´Â °ÍÀÌ´Ù.

C++ Ŭ·¡½º´Â Ç¥Çö·ÂÀÌ ÈǸ¢Çؼ­ ¼¼»óÀÇ ¸ðµç »ç¹°, ½ÉÁö¾î °ü³äÀûÀÎ °Í±îÁö ĸ½¶È­ÇÒ ¼ö ÀÖ´Ù. ÇÔ¼ö °´Ã¼´Â ÇÔ¼ö¶ó´Â ÄÚµå µ¢¾î¸®¸¦ ĸ½¶È­ÇÏ°í ÇÔ¼ö °´Ã¼ ¾î´ðÅÍ´Â ÀÌ·¸°Ô ĸ½¶È­µÈ ÇÔ¼ö °´Ã¼¸¦ ´Ù½Ã ÇÑ ¹ø ´õ ĸ½¶È­ÇÏµÇ È£ÃâÇÒ ¶§³ª ¸®ÅÏÇÑ ÈÄ¿¡ Àǹ̸¦ Á¶ÀÛÇÏ¿© ¿ø·¡ÀÇ ÇÔ¼ö °´Ã¼¸¦ º¯ÇüÇÑ´Ù. ÀÌ º¯Çü¿¡ ÀÇÇØ STL ¾Ë°í¸®ÁòµéÀÌ ±ô¹Ú ¼Ó¾Æ ³Ñ¾î°¡´Âµ¥ ¿ø¸®¸¦ ¾Ë°í³ª¸é ÂüÀ¸·Î Àý¹¦ÇÏ´Ù.

¾î´ðÅͺí ÇÔ¼ö °´Ã¼

¾î´ðÅ͸¦ Àû¿ëÇÒ ¼ö ÀÖÀ¸·Á¸é ÇÔ¼ö °´Ã¼´Â ¾î´ðÅÍ°¡ ¿ä±¸Çϴ ŸÀÔ Á¤º¸¸¦ Á¦°øÇØ¾ß ÇÑ´Ù. ŸÀÔ Á¤º¸¸¦ Á¦°øÇÏÁö ¾Ê´Â ÇÔ¼ö °´Ã¼´Â ´Üµ¶À¸·Î´Â »ç¿ëµÉ ¼ö ÀÖÁö¸¸ ¾î´ðÅÍ¿Í ÇÔ²²´Â »ç¿ëÇÒ ¼ö ¾ø´Ù. ¾î´ðÅÍ Àû¿ëÀ» À§ÇØ Å¸ÀÔÀ» °ø°³ÇÏ´Â ÇÔ¼ö °´Ã¼¸¦ ¾î´ðÅͺí ÇÔ¼ö °´Ã¼¶ó°í ÇÑ´Ù.

unary_negate Ŭ·¡½ºÀÇ () ¿¬»êÀÚ Á¤Àǹ®À» º¸¸é È£Ãâ¿øÀ¸·ÎºÎÅÍ Àü´ÞµÇ´Â left¸¦ Àμö·Î ¹Þ¾Æ functor¿¡°Ô Áß°èÇÏ°í ÀÖ´Ù. ÀÌ ÇÔ¼ö Á¤Àǹ®ÀÌ ÀÛ¼ºµÇ·Á¸é leftÀÇ Å¸ÀÔÀÌ ¹«¾ùÀÎÁö¸¦ ¾Ë¾Æ¾ß Çϴµ¥ ÀÌ left´Â ±¸Ã¼ÀûÀ¸·Î find_if°¡ ¼øȸÁßÀÇ ¹Ýº¹ÀÚ¿¡ * ¿¬»êÀÚ¸¦ Àû¿ëÇÏ¿© Àо´Â ¿ä¼ÒÀÇ Å¸ÀÔ°ú °°°í ÀÌ Å¸ÀÔÀº °ð ÇÔ¼ö °´Ã¼°¡ ¹Þ¾ÆµéÀÌ´Â ÀμöÀÇ Å¸ÀÔÀÌ µÈ´Ù. ±×·¡¼­ unary_negateÀÇ () ¿¬»êÀÚ°¡ Á¤ÀǵǷÁ¸é ÇÔ¼ö °´Ã¼ÀÇ Àμö ŸÀÔÀÎ argument_typeÀ» Á¤È®ÇÏ°Ô ¾Ë°í ÀÖ¾î¾ß Çϸç ÀÌ Å¸ÀÔÀ» Á¤ÀÇÇÏ´Â ¿ªÇÒÀ» unary_function ±â¹Ý Ŭ·¡½º°¡ ´ë½ÅÇÏ´Â °ÍÀÌ´Ù.

ÀÚµ¿Â÷´Â ¾ÕÀ¸·Î ÀüÁøÇÏ´Â °ÍÀÌ º»·¡ÀÇ ±â´ÉÀÌÁö¸¸ °¡´Â Â÷¸¦ ¸ØÃß´Â ºê·¹ÀÌÅ©µµ ÇÊ¿äÇÏ´Ù. ¿Ö ºê·¹ÀÌÅ©°¡ ²À ÇÊ¿äÇÑÁö´Â ºê·¹ÀÌÅ©¸¦ »©°í Â÷¸¦ ¸¸µé¾î º¸¸é ½±°Ô ¾Ë ¼ö ÀÖ´Ù.  °°Àº ¿ø¸®·Î IsMulti3 Ŭ·¡½º¿¡ unary_function »ó¼Ó¹®À» »©°í ÄÄÆÄÀÏÇÏ¸é ¿¡·¯ ¸Þ½ÃÁö°¡ Ãâ·ÂµÇ´Âµ¥ ÀÌ ¿¡·¯ ¸Þ½ÃÁöÀÇ Àǹ̸¦ ºÐ¼®ÇØ º¸¸é ¿Ö unary_functionÀÌ ÇÊ¿äÇÑ°¡¸¦ ÄÄÆÄÀÏ·¯°¡ ¾Ë·ÁÁÙ °ÍÀÌ´Ù. argument_typeÀÌ µµ´ëü ¹¹³Ä´Â ¿¡·¯ ¸Þ½ÃÁö°¡ Ãâ·ÂµÇ´Âµ¥ unary_negate´Â ÀÚ½ÅÀÌ Ä¸½¶È­ÇÏ´Â ÇÔ¼ö °´Ã¼ F¿¡ ÀÌ Å¸ÀÔÀÌ Á¤ÀǵǾî ÀÖ´Ù´Â °¡Á¤ÇÏ¿¡ ¸¸µé¾îÁ³±â ¶§¹®ÀÌ´Ù. ¹°·Ð unary_functionÀ¸·ÎºÎÅÍ »ó¼Ó¹ÞÁö ¾Ê°í ´ÙÀ½°ú °°ÀÌ IsMulti3¸¦ ¼±¾ðÇصµ È¿°ú´Â °°´Ù.

 

struct IsMulti3 {

     typedef int argument_type;

     bool operator()(int a) const {

          return (a % 3 == 0);

     }

};

 

³»°¡ »ç¿ëÇÏ´Â Àμö´Â intÇüÀ̶ó´Â °ÍÀ» argument_typeÀ̶ó´Â ¾à¼ÓµÈ À̸§À¸·Î Á¤ÀÇÇÏ´Â °ÍÀÌ´Ù. ¾î·µç unary_negate´Â ÀÌ Å¸ÀÔ¸¸ Á¤ÀǵǾî ÀÖÀ¸¸é Àß µ¹¾Æ°£´Ù. ÀÌ ÁþÀ» Á÷Á¢ Çϱ⠽ÈÀ¸´Ï±î ¾î´ðÅ͸¦ Àû¿ëÇϱâ À§ÇÑ ÇÔ¼ö °´Ã¼´Â unary_functionÀ¸·ÎºÎÅÍ »ó¼ÓÀ» ¹Þ´Â °ÍÀÌ´Ù.

ÇÔ¼ö °´Ã¼ÀÇ const ¿©ºÎ´Â ¾î´ðÅÍ°¡ Á¤ÀÇÇÏ´Â () ¿¬»êÀÚÀÇ const ¿©ºÎ¿Í °°¾Æ¾ß ÇÑ´Ù. unary_negateÀÇ () ¿¬»êÀÚ ÇÔ¼ö°¡ const·Î ¼±¾ðµÇ¾î ÀÖÀ¸¹Ç·Î not1 ¾î´ðÅÍ¿Í ÇÔ²² »ç¿ëµÉ ÇÔ¼ö °´Ã¼µµ ¹Ýµå½Ã const¿©¾ß ÇÑ´Ù. À§ ¿¹Á¦ÀÇ IsMulti3¿¡¼­ const¸¦ »© ¹ö¸®¸é ¿¡·¯·Î 󸮵Ǵµ¥ const ÇÔ¼ö°¡ ºñ const ÇÔ¼ö¸¦ È£ÃâÇÒ ¼ö ¾ø±â ¶§¹®ÀÌ´Ù. Á¶°ÇÀÚ ÇÔ¼ö °´Ã¼´Â ÄÁÅ×À̳ÊÀÇ ¿ä¼Ò°¡ Á¶°ÇÀ» ¸¸Á·ÇÏ´ÂÁö Á¡°ËÇÏ´Â °Í¸¸ÀÌ º»¿¬ÀÇ ÀÓ¹«À̹ǷΠ°ªÀ» Àб⸸ ÇÏ¸é µÇ°í ÇÔ¼ö °´Ã¼ ÀÚü¸¦ º¯°æÇÏÁö ¾ÊÀ¸¹Ç·Î(»ç½Ç º¯°æÇÒ ¸â¹öµµ ¾ø´Ù) const°¡ µÇ´Â °ÍÀÌ »ó½ÄÀûÀ¸·Î ÇÕ´çÇÏ´Ù.

¾î´ðÅͺí ÇÔ¼ö °´Ã¼´Â Àμö¸¦ ·¹ÆÛ·±½º·Î Àü´Þ¹Þ¾Æµµ ¾ÈµÇ¸ç ¹Ýµå½Ã °ªÀ¸·Î Àü´Þ¹Þ¾Æ¾ß ÇÑ´Ù. ¿Ö³ÄÇϸé unary_negate ÇÔ¼öÀÇ () ¿¬»êÀÚ°¡ ·¹ÆÛ·±½º·Î °ªÀ» Áß°èÇÏ°í Àֱ⠶§¹®ÀÌ´Ù. ÇÔ¼ö °´Ã¼°¡ ·¹ÆÛ·±½º¸¦ ¹Þ¾Æ µéÀÌ¸é °á±¹ ·¹ÆÛ·±½ºÀÇ ·¹ÆÛ·±½º¸¦ ³Ñ±â´Â ²ÃÀÌ µÇ´Âµ¥ C++Àº ÀÌÁß Æ÷ÀÎÅÍ´Â Çã¿ëÇصµ ÀÌÁß ·¹ÆÛ·±½º¶ó´Â °ÍÀº Çã¿ëÇÏÁö ¾Ê´Â´Ù. À§ ¿¹Á¦¿¡¼­ IsMulti3ÀÇ () ÇÔ¼ö°¡ int &a¸¦ ¹Þµµ·Ï ¼öÁ¤ÇÑ ÈÄ ÄÄÆÄÀÏÇØ º¸¸é ·¹ÆÛ·±½º¸¦ ¹Þ´Â °ÍÀÌ ¿Ö ºÒ°¡´ÉÇÑÁö ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÇÔ¼ö °´Ã¼´Â ¾îÂ÷ÇÇ ÀζóÀÎÀ̹ǷΠȿÀ²À» À§ÇØ ·¹ÆÛ·±½º¸¦ ³Ñ±æ ÇÊ¿ä°¡ ¾ø´Ù.

not2

not2 ºÎÁ¤ÀÚ´Â ÀÌÇ× Á¶°ÇÀÚÀÇ Æò°¡ °á°ú¸¦ ¹Ý´ë·Î µÚÁý´Â´Ù. sortfunctor ¿¹Á¦ÀÇ compare ÇÔ¼ö °´Ã¼´Â ´ë¼Ò ±¸ºÐ¾øÀÌ ¹®ÀÚ¿­À» ºñ±³ÇÏ¿© ¿À¸§Â÷¼øÀ¸·Î Á¤·ÄÇϵµ·Ï ÇÑ´Ù. ´ë¼Ò±¸ºÐ¾øÀÌ ³»¸²Â÷¼øÀ¸·Î Á¤·ÄÇÏ·Á¸é ´ÙÀ½ ÇÔ¼ö °´Ã¼¸¦ ¸¸µé¾î¾ß ÇÒ °ÍÀÌ´Ù.

 

struct comparedesc {

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

          return stricmp(a.c_str(),b.c_str()) > 0;

     }

};

 

ÇÔ¼ö °´Ã¼ÀÇ À̸§°ú ºÎµîÈ£ ¹æÇ⸸ ¹Ù²î¾ú´Âµ¥ À̸§Àº ¹°·Ð ±»ÀÌ º¯°æÇÏÁö ¾Ê¾Æµµ »ó°ü¾ø´Ù. ºñ½ÁÇÑ ¿¬»êÀ» ÇÏ´Â ÇÔ¼ö °´Ã¼¸¦ º°µµ·Î ¸¸µé ÇÊ¿ä¾øÀÌ ÀÌÇ× ºÎÁ¤ÀÚÀÎ not2¸¦ »ç¿ëÇÏ¸é µÈ´Ù. compare ÇÔ¼ö °´Ã¼°¡ ÀÌÇ× Á¶°ÇÀÚÀ̹ǷΠnot1À» »ç¿ëÇؼ­´Â ¾ÈµÇ¸ç not2¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù.

 

¿¹ Á¦ : not2

#include <iostream>

#include <string>

#include <vector>

#include <algorithm>

#include <functional>

using namespace std;

 

struct compare : public binary_function<string,string,bool> {

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

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

     }

};

 

void main()

{

     string names[]={"STL","MFC","owl","html","pascal","Ada",

          "Delphi","C/C++","Python","basic"};

     vector<string> vs(&names[0],&names[10]);

 

     sort(vs.begin(),vs.end(),not2(compare()));

     vector<string>::iterator it;

     for (it=vs.begin();it!=vs.end();it++) {

          cout << *it << endl;

     }

}

 

½ÇÇà °á°ú´Â ´ÙÀ½°ú °°´Ù. ´ë¼Ò±¸ºÐ¾øÀÌ ³»¸²Â÷¼øÀ¸·Î Á¤·ÄµÈ´Ù.

 

STL

Python

pascal

owl

MFC

html

Delphi

C/C++

basic

Ada

 

»õ·Î¿î ÇÔ¼ö °´Ã¼¸¦ ¸¸µå´Â ´ë½Å compare¸¦ binary_functionÀ¸·ÎºÎÅÍ »ó¼Ó¹Þ¾Æ ÀμöÀÇ Å¸ÀÔ°ú ¸®ÅÏ Å¸ÀÔÀ» Á¤ÀÇÇϵµ·Ï ÇßÀ¸¸ç not2 ºÎÁ¤ÀÚ¸¦ Àû¿ëÇß´Ù. ÀÌ ¿¹Á¦°¡ ¾î¶»°Ô ½ÇÇàµÇ´ÂÁö¸¦ ºÐ¼®ÇØ º¸°í ½Í´Ù¸é ¾Õ¿¡¼­ Çß´ø ½Ç½À°ú ºñ½ÁÇÏ°Ô Çì´õ ÆÄÀÏÀ» ¿­¾î not2°¡ ¾î¶»°Ô Á¤ÀǵǾî ÀÖ´ÂÁö »ìÆ캸¸é µÈ´Ù. not2´Â binary_negate Àӽà °´Ã¼¸¦ »ý¼ºÇϸç binary_negate Ŭ·¡½º´Â ÀÌÇ× Á¶°ÇÀÚ¸¦ ĸ½¶È­ÇÏ¿© È£ÃâÇÏ°í ±× °á°ú¸¦ ¹Ý´ë·Î µÚÁý¾î ¸®ÅÏÇÑ´Ù.

 

 notKim

¾Õ¿¡¼­ ¸¸µé¾ú´ø find_if ¿¹Á¦¸¦ ¼öÁ¤ÇÏ¿© ±è°¡°¡ ¾Æ´Ñ »ç¶÷ÀÇ ¸ñ·Ï ÀüºÎ¸¦ Á¶»çÇϵµ·Ï ¼öÁ¤Ç϶ó. ±è°¡ÀÎÁö Á¶»çÇÏ´Â IsKim ÇÔ¼ö °´Ã¼°¡ ÀÛ¼ºµÇ¾î ÀÖÀ¸¹Ç·Î not1 ºÎÁ¤ÀÚ¸¦ Àû¿ëÇÏ¸é ½±°Ô ±¸ÇöÇÒ ¼ö ÀÖ´Ù.