ÇÔ¼ö °´Ã¼´Â Åë»ó () ¿¬»êÀÚ Çϳª¸¸ Á¤ÀÇÇÏ°í ±×³ª¸¶µµ µ¿ÀÛÀÌ °£´ÜÇØ ±æÀ̰¡ ¾ÆÁÖ Âª´Ù. ÀÌ·± ªÀº Ŭ·¡½ºµµ Á÷Á¢ ¼±¾ðÇØ¼ ¾²ÀÚ¸é ¹ø°Å·Î¿îµ¥ ±×·¡¼ 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 ÇÔ¼öº¸´Ùµµ ÈξÀ ´õ ºü¸£´Ù.