ºÎÁ¤ÀÚ´Â 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ÀÌ ÇÔ¼öÀÎÁö, °´Ã¼ÀÎÁö, ¸ÅÅ©·ÎÀÎÁöÁ¶Â÷µµ ÆÄ¾ÇÇϱâ Èûµé°í 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 ºÎÁ¤ÀÚ´Â ÀÌÇ× Á¶°ÇÀÚÀÇ Æò°¡ °á°ú¸¦ ¹Ý´ë·Î µÚÁý´Â´Ù. 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 ºÎÁ¤ÀÚ¸¦ Àû¿ëÇÏ¸é ½±°Ô ±¸ÇöÇÒ ¼ö ÀÖ´Ù.