38-1-´Ù.¹Ì¸® Á¤ÀÇµÈ ÇÔ¼ö °´Ã¼

ÇÔ¼ö °´Ã¼´Â Åë»ó () ¿¬»êÀÚ Çϳª¸¸ Á¤ÀÇÇÏ°í ±×³ª¸¶µµ µ¿ÀÛÀÌ °£´ÜÇØ ±æÀÌ°¡ ¾ÆÁÖ Âª´Ù. ÀÌ·± ªÀº Ŭ·¡½ºµµ Á÷Á¢ ¼±¾ðÇؼ­ ¾²ÀÚ¸é ¹ø°Å·Î¿îµ¥ ±×·¡¼­ STLÀº ÀÚÁÖ »ç¿ëÇÒ¸¸ÇÑ ¿¬»ê¿¡ ´ëÇØ ¹Ì¸® ÇÔ¼ö °´Ã¼¸¦ Á¤ÀÇÇÏ°í ÀÖ´Ù. ÀÌ·± °´Ã¼µéÀº º°´Ù¸¥ Á¤ÀǾøÀÌ ±×³É »ç¿ëÇϱ⸸ ÇÏ¸é µÈ´Ù. ´ëÇ¥ÀûÀ¸·Î °¡Àå °£´ÜÇÑ ÇÔ¼ö °´Ã¼ÀÎ plus¸¦ º¸ÀÚ. ´õÇÒ ÇÇ¿¬»êÀÚÀÇ Å¸ÀÔ T¸¦ Àμö·Î ¹Þ¾ÆµéÀ̴ Ŭ·¡½º ÅÛÇø´ÀÌ´Ù.

 

struct plus : public binary_function<T, T, T> {

     T operator()(const T& x, const T& y) const { return (x+y); }

};

 

ÀÌ ¼±¾ð¹®¿¡¼­ : public ÀÌÇÏÀÇ ³»¿ëÀº ´ÙÀ½ Ç×ÀÇ ÁÖÁ¦ÀÌ¸ç ²À ¾ø¾îµµ »ó°ü¾øÀ¸¹Ç·Î Àá½Ã ¹«½ÃÇϵµ·Ï ÇÏÀÚ. º»Ã¼ ³»¿ëµµ ¾ÆÁÖ ½¬¿îµ¥ TÇüÀÇ x, y¸¦ Àü´Þ¹Þ¾Æ x+y¸¦ ¸®ÅÏÇÑ´Ù. T°¡ ¾ÆÁÖ ¶×¶×ÇÑ Å¬·¡½ºÀÏ ¼öµµ ÀÖÀ¸¹Ç·Î °ªÀÌ ¾Æ´Ñ ·¹ÆÛ·±½º·Î Àü´Þ¹Þ°í ÇÇ¿¬»êÀÚ¸¦ »ó¼ö·Î Ãë±ÞÇÑ´Ù´Â Á¤µµ ¿Ü¿¡´Â Ưº°ÇÒ °Íµµ ¾ø´Ù. T °¡ int¶ó¸é °á±¹ a, b¸¦ ¹Þ¾Æ a+b¸¦ ¸®ÅÏÇÏ´Â µ¿ÀÛÀ» ÇÏ´Â ÇÔ¼ö °´Ã¼ÀÌ´Ù. °£´ÜÇÑ »ç¿ë¿¹¸¦ º¸ÀÚ.

 

¿¹ Á¦ : plus

#include <iostream>

#include <functional>

using namespace std;

 

void main()

{

     int a=1,b=2;

     int c=plus<int>()(a,b);

     cout << c << endl;

}

 

ÇÔ¼ö °´Ã¼¿Í ±× Áö¿ø ¸ÅÅ©·Î, ŸÀÔ µîÀº ¸ðµÎ functional Çì´õ ÆÄÀÏ¿¡ Á¤ÀǵǾî ÀÖÀ¸¹Ç·Î ÀÌ Çì´õ ÆÄÀÏÀ» ÀÎŬ·çµåÇØ¾ß ÇÑ´Ù. main¿¡¼­ Á¤¼öÇü º¯¼ö a¿Í b¸¦ ¼±¾ðÇÏ°í plus °´Ã¼ÀÇ ÇÔ¼ö ()¸¦ È£ÃâÇÏ¿© µÎ Á¤¼öÀÇ ÇÕÀ» °è»êÇß´Ù. ¿©±â¼­ plus<int>() ±¸¹®ÀÌ Á¶±Ý º¹ÀâÇØ º¸À̴µ¥ ¾Õ¿¡¼­ ¼³¸íÇß´Ù½ÃÇÇ µðÆúÆ® »ý¼ºÀÚ È£Ãâ¹®À̸ç Àӽà °´Ã¼¸¦ »ý¼ºÇÑ´Ù. »ý¼ºµÈ Àӽð´Ã¼·ÎºÎÅÍ ()¿¬»êÀÚ ÇÔ¼ö¸¦ È£ÃâÇ쵂 Àμö·Î a, b¸¦ ³Ñ±ä °ÍÀÌ´Ù. Á» ½±°Ô Ç®¾î¾²¸é ´ÙÀ½ µÎ ÁÙÀÌ µÈ´Ù.

 

plus<int> P;

int c=P(a,b);

 

plus Ŭ·¡½º ÅÛÇø´À¸·ÎºÎÅÍ plus<int> ŸÀÔÀÇ Å¬·¡½º¸¦ ±¸Ã¼È­ÇÏ°í ÀÌ Å¬·¡½º ŸÀÔÀÇ °´Ã¼ P¸¦ ¼±¾ðÇÑ´Ù. ±×¸®°í PÀÇ ¿À¹ö·ÎµùµÈ ¿¬»êÀÚ ()¸¦ È£ÃâÇߴµ¥ ÀÌ ÇÔ¼ö°¡ µÎ ÀμöÀÇ ÇÕÀ» ¸®ÅÏÇϵµ·Ï µÇ¾î ÀÖÀ¸¹Ç·Î °á±¹ c¿¡´Â a+bÀÎ 3ÀÌ ´ëÀԵȴÙ. °´Ã¼¸¦ ÅëÇØ ¸â¹ö ÇÔ¼ö¸¦ È£ÃâÇßÀ» »Ó º°·Î ÈñÇÑÇÒ °Íµµ ¾ø´Â ¿¹Á¦ÀÌ´Ù. plus¿Ü¿¡µµ ¸¹Àº ÇÔ¼ö °´Ã¼µéÀÌ ¹Ì¸® Á¤ÀǵǾî ÀÖ´Ù.

 

ÇÔ¼ö °´Ã¼

¿¬»ê

minus

µÎ ÀμöÀÇ Â÷¸¦ °è»êÇÑ´Ù.

multiplies

µÎ ÀμöÀÇ °öÀ» °è»êÇÑ´Ù.

divides

µÎ Àμö¸¦ ³ª´« ÈÄ ¸òÀ» ¸®ÅÏÇÑ´Ù.

modulus

µÎ Àμö¸¦ ³ª´« ÈÄ ³ª¸ÓÁö¸¦ ¸®ÅÏÇÑ´Ù.

negate

Àμö Çϳª¸¦ Àü´Þ¹Þ¾Æ ºÎÈ£¸¦ ¹Ý´ë·Î ¸¸µç´Ù.

equal_to

µÎ Àμö°¡ °°ÀºÁö ºñ±³ÇÏ¿© °á°ú¸¦ boolŸÀÔÀ¸·Î ¸®ÅÏÇÑ´Ù.

not_equal_to

µÎ Àμö°¡ ´Ù¸¥Áö ºñ±³ÇÑ´Ù.

greater

ù ¹ø° Àμö°¡ µÎ ¹ø° Àμöº¸´Ù Å«Áö Á¶»çÇÑ´Ù.

less

ù ¹ø° Àμö°¡ µÎ ¹ø° Àμöº¸´Ù ÀÛÀºÁö Á¶»çÇÑ´Ù.

greater_equal

ù ¹ø° Àμö°¡ µÎ ¹ø° Àμöº¸´Ù Å©°Å³ª °°ÀºÁö Á¶»çÇÑ´Ù.

less_equal

ù ¹ø° Àμö°¡ µÎ ¹ø° Àμöº¸´Ù À۰ųª °°ÀºÁö Á¶»çÇÑ´Ù.

logical_and

µÎ ÀμöÀÇ ³í¸®°ö(&&) °á°ú¸¦ ¸®ÅÏÇÑ´Ù.

logical_or

µÎ ÀμöÀÇ ³í¸®ÇÕ(||) °á°ú¸¦ ¸®ÅÏÇÑ´Ù.

logical_not

Àμö Çϳª¸¦ Àü´Þ¹Þ¾Æ ³í¸®ºÎÁ¤(!)À» ¸®ÅÏÇÑ´Ù.

 

Çì´õ ÆÄÀÏÀ» ±»ÀÌ ¿­¾î º¸Áö ¾Ê´õ¶óµµ ÇÔ¼ö °´Ã¼ÀÇ À̸§À¸·ÎºÎÅÍ ¾î¶² ¿¬»êÀ» ÇÏ´ÂÁö ½±°Ô À¯ÃߵȴÙ. ÀÌ ÇÔ¼ö °´Ã¼µéÀ» »ç¿ëÇÏ¸é ¾Ë°í¸®ÁòµéÀÇ µ¿ÀÛ¿¡ ¿©·¯ °¡Áö ´Ù¾çÇÑ º¯È­¸¦ ÁÙ ¼ö ÀÖ´Ù. ±× ¿¹·Î Á¤·Ä ¹æ½Ä¿¡ º¯È­¸¦ °¡ÇØ º¸ÀÚ. sort ÇÔ¼ö´Â ¿ä¼ÒÀÇ < ¿¬»êÀÚ·Î ´ë¼Ò¸¦ ºñ±³ÇϹǷΠ±âº»ÀûÀ¸·Î ¿Ã¸²Â÷¼øÀ¸·Î Á¤·ÄÇϴµ¥ ÇÔ¼ö °´Ã¼¸¦ ÃëÇÏ´Â ´ÙÀ½ ¹öÀüÀ» »ç¿ëÇϸé Á¤·Ä ¼ø¼­¸¦ ¿øÇϴ´ë·Î ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù.

 

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

 

¸¶Áö¸· Àμö F´Â ºñ±³ÇÒ µÎ ¿ä¼Ò¸¦ Àü´Þ¹Þ¾Æ ºñ±³ °á°ú¸¦ ¸®ÅÏÇϴµ¥ ÇÔ¼ö °´Ã¼ÀÇ Á¶°ÇÀ» ¸¸Á·Çϸé true¸¦ ¸®ÅÏÇÑ´Ù. boolÇüÀ» ¸®ÅÏÇϹǷΠF´Â Á¶°ÇÀÚ ÇÔ¼ö °´Ã¼ÀÌ´Ù. ´ÙÀ½ ¿¹Á¦´Â ¹®ÀÚ¿­À» Á¤·ÄÇϴµ¥ ÀÏ¹Ý sort ÇÔ¼ö¿Í ÇÔ¼ö °´Ã¼ ¹öÀüÀ¸·Î °¢°¢ Á¤·ÄÇÑ´Ù.

 

¿¹ Á¦ : sortdesc

#include <iostream>

#include <string>

#include <vector>

#include <algorithm>

#include <functional>

using namespace std;

 

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());

     sort(vs.begin(),vs.end(),greater<string>());

    

     vector<string>::iterator it;

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

          cout << *it << endl;

     }

}

 

sortÀÇ ±âº» ¹öÀüÀº ¿ä¼Ò°£ÀÇ ºñ±³¸¦ À§ÇØ < ¿¬»êÀÚ, Áï less ºñ±³ ÇÔ¼ö °´Ã¼¸¦ »ç¿ëÇϵµ·Ï µÇ¾î ÀÖ¾î ÀÛÀº °ªÀÌ ´õ ¾ÕÂÊ¿¡ ¿Â´Ù. ±×·¯³ª greater ÇÔ¼ö °´Ã¼¸¦ »ç¿ëÇϸé Å« °ªÀÌ ´õ ¾ÕÂÊ¿¡ ¿À¹Ç·Î Á¤·Ä ¼ø¼­´Â ¹Ý´ë°¡ µÈ´Ù.

 

Ada

C/C++

Delphi

MFC

Python

STL

basic

html

owl

pascal

pascal

owl

html

basic

STL

Python

MFC

Delphi

C/C++

Ada

sort·Î Á¤·ÄÇßÀ» ¶§

sort(greater)·Î Á¤·ÄÇßÀ» ¶§

 

sort´Â Äü Á¤·Ä ¾Ë°í¸®Áò´ë·Î ºñ±³ ¹× ±³È¯À» ¼öÇàÇϴµ¥ ºñ±³¸¦ ¾î¶² ½ÄÀ¸·Î Çϴ°¡¿¡ µû¶ó Á¤·Ä ¼ø¼­°¡ ´Þ¶óÁø´Ù. ºñ±³°¡ ÇÊ¿äÇÒ ¶§¸¶´Ù ÇÔ¼ö °´Ã¼¸¦ È£ÃâÇϴµ¥ ÀÌ °´Ã¼°¡ lessÀÎÁö greaterÀÎÁö¿¡ µû¶ó ¿À¸§Â÷¼ø, ³»¸²Â÷¼øÀÌ °áÁ¤µÇ´Â °ÍÀÌ´Ù. µÎ ÇÔ¼ö °´Ã¼´Â STL ¶óÀ̺귯¸®¿¡ ÀÇÇØ Á¦°øµÇ¹Ç·Î ±×³É ¾²±â¸¸ ÇÏ¸é µÈ´Ù.

¸¸¾à ¹Ì¸® Á¦°øµÇ´Â ÇÔ¼ö °´Ã¼°¡ ¾Æ´Ï¶ó »ç¿ëÀÚ°¡ Á¤ÀÇÇÑ ¹æ½Ä´ë·Î Á¤·ÄÇÏ°í ½Í´Ù¸é Á÷Á¢ ÇÔ¼ö °´Ã¼¸¦ ¸¸µé¾î sortÀÇ ¼¼ ¹ø° Àμö·Î Àü´ÞÇÑ´Ù. ´ÙÀ½ ¿¹Á¦´Â ´ë¼Ò¹®ÀÚ ±¸ºÐ¾øÀÌ ¾ËÆĺª¼øÀ¸·Î ¹®ÀÚ¿­À» ¿À¸§Â÷¼ø Á¤·ÄÇÑ´Ù.

 

¿¹ Á¦ : sortfunctor

#include <iostream>

#include <string>

#include <vector>

#include <algorithm>

using namespace std;

 

struct compare {

     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());

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

     vector<string>::iterator it;

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

          cout << *it << endl;

     }

}

 

compare´Â Àμö·Î Àü´ÞµÈ µÎ ¹®ÀÚ¿­ a, b¸¦ ´ë¼Ò¹®ÀÚ ±¸ºÐ¾øÀÌ ºñ±³ÇÏ¿© a°¡ ´õ ÀÛÀºÁö¸¦ ¸®ÅÏÇÑ´Ù. compare¸¦ ¾²Áö ¾Ê´Â sort´Â stringÀÇ < ¿¬»êÀڷθ¸ ´ë¼Ò¸¦ ºñ±³ÇϹǷΠ´ë¹®ÀÚ°¡ Ç×»ó ¼Ò¹®ÀÚ ¾Õ¿¡ ¿ÀÁö¸¸ compare¸¦ »ç¿ëÇÏ´Â sort´Â ´ë¼Ò¹®ÀÚ¿¡ »ó°ü¾øÀÌ ¾ËÆĺª¼øÀ¸·Î Á¤·ÄµÈ´Ù.

 

Ada

C/C++

Delphi

MFC

Python

STL

basic

html

owl

pascal

Ada

basic

C/C++

Delphi

html

MFC

owl

pascal

Python

STL

compare¸¦ ¾²Áö ¾ÊÀº °æ¿ì

compare¸¦ ¾´ °æ¿ì

 

Á¤·ÄÀ» À§ÇÑ ¾Ë°í¸®Áò ±¸ÇöÀº sort°¡ Ç쵂 ºñ±³ ¹æ½Ä¸¸ ÇÔ¼ö °´Ã¼·Î »ç¿ëÀÚ°¡ ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. Á» ´õ º¹ÀâÇÑ °´Ã¼ ÄÁÅ×À̳ʶó¸é ÀÌÂ÷ Á¤·Ä Á¶°ÇÀ» µÑ ¼ö Àִµ¥ ¿¹¸¦ µé¾î »ç¿øµéÀ» À̸§¼øÀ¸·Î Á¤·ÄÇÏµÇ È¤½Ã µ¿¸íÀÌÀÎÀÌ ÀÖÀ¸¸é ³ªÀ̼øÀ¸·Î Á¤·ÄÇϵµ·Ï ¼¼ºÎ Á¤·Ä ÁöħÀ» Á¦°øÇÒ ¼ö ÀÖ´Ù. ºñ±³ ±¸¹®ÀÌ ÀζóÀÎÀ¸·Î »ðÀԵǾî Á¤·Ä ¼Óµµµµ ±²ÀåÈ÷ ºü¸¥µ¥ CÀÇ qsort ÇÔ¼öº¸´Ùµµ ÈξÀ ´õ ºü¸£´Ù.