3.1 ÇÔ¼ö(function) Ç¥ÁØ ¶óÀ̺귯¸®¿¡¼­ Á¦°øÇÏ´Â ¾Ë°í¸®µëÁß¿¡´Â ÇÔ¼ö¸¦ ÀÎÀÚ·Î ¿ä±¸ÇÏ´Â °ÍµéÀÌ ¸¹´Ù. ¿¹¸¦ µé¾î, for_each() ¾Ë°í¸®µëÀº ÄÁÅ×À̳ʿ¡ ´ã±ä °¢°¢ÀÇ ¿ø¼Ò¿¡ ÀÎÀÚ·Î ³Ñ°Ü¹ÞÀº ÇÔ¼ö¸¦ Àû¿ëÇÑ´Ù. ¾Æ·¡´Â printElement() ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© Á¤¼ö listÀÇ ¿ø¼ÒµéÀ» Ãâ·ÂÇÏ´Â ÄÚµåÀÌ´Ù. void printElement(int value) { cout << "The list contains " << value << endl; } main() { list aList; ... for_each(aList.begin(), aList.end(), printElement); } ÀÌÇ× ÇÔ¼ö(binary function)´Â µÎ°³ÀÇ ÀÎÀÚ¸¦ ÃëÇϴµ¥, ¼­·Î ´Ù¸¥ µÎ ½ÃÄö½º¿¡¼­ °ªµéÀ» Çϳª¾¿ °¡Á®¿Í ÇÔ¼ö¿¡ ³Ñ°ÜÁØ´Ù. ¿¹¸¦ µé¾î, ¹®ÀÚ¿­ list¿Í Á¤¼ö list¸¦ ÁÖ¾îÁö°í, ¹®ÀÚ¿­ list¿¡ ´ã±ä °¢°¢ÀÇ ¹®ÀÚ¿­À» Á¤¼ö list¿¡ ÀûÈù Ƚ¼ö¸¸Å­ º¹»çÇÑ´Ù°í ÇÒ ¶§, Ç¥ÁØ ¶óÀ̺귯¸®¿¡¼­ Á¦°øÇÏ´Â transform() ÇÔ¼ö¸¦ »ç¿ëÇÏ¸é ½±°Ô ÇÒ ¼ö ÀÖ´Ù. À̸¦ À§ÇØ ¿ì¼± ¿øÇÏ´Â ±â´ÉÀ» °¡Áø ÀÌÇ× ÇÔ¼ö¸¦ Á¤ÀÇÇÑ´Ù. // 'base'¸¦ 'number' °¹¼ö¸¸Å­ º¹»çÇÑ´Ù. string stringRepeat(const string& base, int number) { string result; // 'result'´Â óÀ½¿¡ ºñ¾î ÀÖ´Ù. while (number--) result += base; return result; } ±×¸®°í, ´ÙÀ½°ú °°ÀÌ transform()À» È£ÃâÇÏ¸é ¿øÇÏ´Â °á°ú¸¦ ¾òÀ» ¼ö ÀÖ´Ù. list words; list counts; ... transform(words.begin(), words.end(), counts.begin(), words.begin(), stringRepeat); (one, two, three)¸¦ (3, 2, 3)°ú ÇÔ²² transform()À» È£ÃâÇϸé, (oneoneone, twotwo, threethreethree)ÀÇ °á°ú¸¦ ¾òÀ» ¼ö ÀÖ´Ù. .2 Á¶°ÇÀÚ(predicate) Á¶°ÇÀÚ(predicate)´Â ºÒ°ª(true/false) ¶Ç´Â Á¤¼ö°ªÀ» ¸®ÅÏÇÏ´Â ÇÔ¼öÀÌ´Ù. ±âÁ¸ÀÇ C °üÇà¿¡ µû¶ó, ¿µÀÌ ¾Æ´Ñ Á¤¼ö°ªÀº ÂüÀ¸·Î °£ÁÖÇÏ°í, ¿µÀÎ °æ¿ì¿¡´Â °ÅÁþÀ¸·Î °£ÁÖÇÑ´Ù. ´ÙÀ½Àº Á¤¼ö°ªÀ» ÀÎÀÚ·Î ¹Þ¾Æ À±³âÀ̸é ÂüÀ», ¾Æ´Ï¸é °ÅÁþÀ» ¸®ÅÏÇÏ´Â ÇÔ¼öÀÌ´Ù.(¾Æ·¡ À±³â ÇÁ·Î±×·¥Àº ¾ÈÀçÇü´ÔÀÌ Á¦°øÇØ Áּ̽À´Ï´Ù.) // 'year'°¡ À±³â¿¡ ÇØ´çÇϸé ÂüÀ» ¸®ÅÏÇÑ´Ù. bool isLeapYear(unsigned int year) { int flag = false; if ((year % 4) == 0) { // 4³â¸¶´Ù À±³âÀÌ°í, flag = true; if((year % 100) == 0) { // ±×Áß 100³â¸¶´Ù À±³âÀÌ ¾Æ´Ï°í, flag = false; if((year % 400) == 0) { // ±×Áß 400³â¸¶´Ù À±³â flag = true; } } } return flag; } generic ¾Ë°í¸®µëÀÇ ÀÎÀÚ·Î Á¶°ÇÀÚ¸¦ »ç¿ëÇÒ ¼ö Àִµ¥, find_if() ¾Ë°í¸®µëÀ» ¿¹·Î µé¾îº¸ÀÚ. ÀÌ ÇÔ¼ö´Â Á¶°ÇÀÚ¸¦ ¸¸Á·Çϴ ù¹ø° ¿ø¼Ò¸¦ ¸®ÅÏÇϴµ¥, ¸¸¾à ÀÌ Á¶°ÇÀÚ¸¦ ¸¸Á·ÇÏ´Â ¿ø¼Ò°¡ ¾øÀ¸¸é end-of-range °ªÀ» ¸®ÅÏÇÑ´Ù. ÀÌ ¾Ë°í¸®µëÀ» »ç¿ëÇÏ¿©, ´ÙÀ½°ú °°ÀÌ ³âµµµé·Î ±¸¼ºµÈ list(aList)¿¡¼­ ù¹ø°·Î ¹ß°ßµÈ À±³âÀÇ À§Ä¡¸¦ ¸®ÅÏÇÏ´Â Äڵ带 ¸¸µé ¼ö ÀÖ´Ù. list::iterator firstLeap = find_if(aList.begin(), aList.end(), isLeapYear); 3.3 ÇÔ¼ö °´Ã¼(function object) ÇÔ¼ö °´Ã¼(function object)´Â °ýÈ£ ¿¬»êÀÚ¸¦ ¸â¹öÇÔ¼ö·Î °¡Áö°í Àִ Ŭ·¡½ºÀÇ °´Ã¼ÀÌ´Ù. ÇÔ¼ö ´ë½Å¿¡ ÇÔ¼ö °´Ã¼¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ´õ Æí¸®ÇÑ °æ¿ì°¡ ¸¹Àºµ¥, ÇÔ¼ö °´Ã¼¸¦ ÇÔ¼ö·Î »ç¿ëÇϸé, ÇÔ¼ö°¡ È£ÃâµÉ ¶§¸¶´Ù ÇÔ¼ö °´Ã¼ÀÇ °ýÈ£ ¿¬»êÀÚ°¡ È£ÃâµÈ´Ù. ¿¹¸¦ µé¾î, ´ÙÀ½ Ŭ·¡½º Á¤ÀǸ¦ »ìÆ캸ÀÚ. class biggerThanThree { public: bool operator()(int val) { return val > 3; } }; ÀÌ biggerThanThree Ŭ·¡½ºÀÇ °´Ã¼¸¦ ÇÔ¼ö È£Ãâ ÇüŸ¦ »ç¿ëÇÏ¿© ÂüÁ¶ÇÏ°Ô µÇ¸é, ¸â¹öÇÔ¼ö·Î Á¤ÀÇµÈ °ýÈ£ ¿¬»êÀÚ°¡ È£ÃâµÈ´Ù. À̹ø¿¡´Â ÀÌ Å¬·¡½º¸¦ ÀϹÝÀûÀÎ ¿ëµµ¿¡ ¾µ ¼ö ÀÖµµ·Ï ´Ùµë¾î º»´Ù. »ý¼ºÀÚ¿Í µ¥ÀÌÅÍ ¸â¹ö¸¦ Ãß°¡ÇÏÀÚ. class biggerThan { public: const int testValue; biggerThan (int x) : testValue(x) { } bool operator()(int val) { return val > testValue; } }; ÀÌ·¸°Ô ÇÔÀ¸·Î½á 'Xº¸´ÙÅ©³Ä?'¶ó´Â ÇÔ¼ö°´Ã¼¸¦ ¸¸µé¼ö ÀÖ°í, ¿©±â¼­ XÀÇ °ªÀº ÇÔ¼ö °´Ã¼¸¦ »ý¼ºÇÒ ¶§ Á¤ÇÒ ¼ö ÀÖ´Ù. ÀÎÀÚ·Î Á¶°ÇÀÚ(predicate)¸¦ ¿ä±¸ÇÏ´Â generic ÇÔ¼ö¿¡ ÇÔ¼ö °´Ã¼¸¦ ³Ñ±æ ¼ö Àִµ¥, ´ÙÀ½Àº list¿¡¼­ 12º¸´Ù Å« ù¹ø° °ªÀ» ã¾Æ³»´Â ÄÚµåÀÌ´Ù. list::iterator firstBig = find_if(aList.begin(), aList.end(), biggerThan(12)); ÀÏ¹Ý ÇÔ¼ö´ë½Å¿¡ ÇÔ¼ö °´Ã¼¸¦ »ç¿ëÇÏ´Â °¡Àå Å« ÀÌÀ¯·Î ¼¼°¡Áö¸¦ µé ¼ö Àִµ¥, ù°·Î, »õ·Î¿î ÇÔ¼ö¸¦ ¸¸µéÁö ¾Ê°í Ç¥ÁØ ¶óÀ̺귯¸®¿¡¼­ Á¦°øµÇ´Â ÇÔ¼ö°´Ã¼¸¦ »ç¿ëÇÏÀÚ´Â °ÍÀÌ°í, µÑ°·Î, ÀζóÀÎ ÇÔ¼ö¸¦ È£ÃâÇÔÀ¸·Î½á ¼öÇà¼Óµµ¸¦ Çâ»óÇÏ°íÀÚ ÇÏ´Â °ÍÀÌ°í, ÇÔ¼ö°´Ã¼·Î ÇÏ¿©±Ý ÀÚ½ÅÀÌ °¡Áö°í ÀÖ´Â »óÅÂÁ¤º¸¸¦ Á¢±ÙÇÏ°í, °»½ÅÇÒ ¼ö ÀÖµµ·Ï ÇÏÀÚ´Â °ÍÀÌ´Ù. ±×·³ °¢°¢ÀÇ ¿¹¸¦ µé¾îº¸µµ·Ï ÇÏÀÚ. ´ÙÀ½ Ç¥´Â Ç¥ÁØ ¶óÀ̺귯¸®¿¡¼­ Á¦°øµÇ´Â ÇÔ¼ö°´Ã¼¸¦ ¼³¸íÇÏ°í ÀÖ´Ù. À̸§ ¿¬»ê »ê¼ú ÇÔ¼ö(arithmetic function) plus µ¡¼À x + y minus »¬¼À x - y multiplies °ö¼À x * y divides ³ª´°¼À x / y modulus ³ª¸ÓÁö x % y negate ºÎÁ¤ -x ºñ±³ ÇÔ¼ö(comparison function) equal_to °°ÀºÁö °Ë»ç x == y not_equal_to ´Ù¸¥Áö °Ë»ç x != y greater Å«°¡¸¦ ºñ±³ x > y less ÀÛÀº°¡¸¦ ºñ±³ x < y greater_equal Å©°Å³ª °°Àº°¡¸¦ ºñ±³ x >= y less_equal À۰ųª °°Àº°¡¸¦ ºñ±³ x <= y ³í¸® ÇÔ¼ö(logical function) logical_and ³í¸®°ö x && y logical_or ³í¸®ÇÔ x || y logical_not ³í¸®ºÎÁ¤ !x À̰͵éÀÌ ¾î¶»°Ô »ç¿ëµÇ´ÂÁö ¸î°¡Áö ¿¹¸¦ µé¾î »ìÆ캸ÀÚ. ù¹ø° ¿¹´Â plus()¸¦ »ç¿ëÇÏ¿© Á¤¼öµé·Î ±¸¼ºµÈ µÎ°³ÀÇ list¸¦ ¿ø¼Òº°·Î ´õÇÏ¿©, ±× °á°ú¸¦ ù¹ø° list¿¡ ¹èÄ¡ÇÑ´Ù. transform(listOne.begin(), listOne.end(), listTwo.begin(), listOne.begin(), plus()); µÎ¹ø° ¿¹´Â ºÒ°ªÀ¸·Î ÀÌ·ç¾îÁø vector³»ÀÇ ¸ðµç ¿ø¼Ò¸¦ ºÎÁ¤ÇÏ´Â ¿¹ÀÌ´Ù. transform(aVec.begin(), aVec.end(), aVec.begin(), logical_not()); [Image] Ŭ·¡½º Á¤ÀÇÀÇ À§Ä¡ Ç¥ÁØ ¶óÀ̺귯¸®°¡ À§ Ç¥¿¡¼­ º¸¿©ÁØ ÇÔ¼öµéÀ» Á¤ÀÇÇÒ ¶§ »ç¿ëÇÏ´Â ±âÀú Ŭ·¡½ºµéÀº »õ·Î¿î ÇÔ¼ö°´Ã¼µé(´ÜÇ×, ÀÌÇ×)À» ¸¸µé ¶§ ÇÊ¿äÇÏ´Ù. ÀÌµé ±âÀú Ŭ·¡½ºµéÀº ´ÙÀ½°ú °°´Ù. template struct unary_function { typedef Arg argument_type; typedef Result result_type; }; template struct binary_function { typedef Arg1 first_argument_type; typedef Arg2 second_argument_type; typedef Result result_type; }; À̵é ÇÔ¼öµéÀ» »ç¿ëÇÏ´Â ¿¹´Â 6.3Àý¿¡¼­ »ìÆ캻´Ù. ¿©±â¼­´Â "Widget" ŸÀÔ°ú Á¤¼ö ŸÀÔÀ» ÀÎÀÚ·Î ¹Þ°í, widgetÀÇ ¾ÆÀ̵ð ¹øÈ£¿Í Á¤¼ö°ªÀ» ¼­·Î ºñ±³ÇÏ´Â ÀÌÇ× ÇÔ¼ö¸¦ Á¤ÀÇÇغ¸ÀÚ. struct WidgetTester : binary_function { public: bool operator()(const Widget& wid, int testid) const { return wid.id == testid; } }; ÇÔ¼ö ´ë½Å¿¡ ÇÔ¼ö°´Ã¼¸¦ »ç¿ëÇÏ´Â µÎ¹ø° ÀÌÀ¯·Î ¼öÇà¼ÓµµÀÇ Çâ»óÀ» µé¾ú´Âµ¥, ¸¹Àº °æ¿ì¿¡ À§¿¡¼­ ¿¹·Îµç transform()ó·³ ÇÔ¼ö°´Ã¼ÀÇ È£ÃâÀ» in-lineÀ¸·Î ´ëÄ¡ÇÔÀ¸·Î½á ÇÔ¼ö È£ÃâÀÇ ¿À¹öÇìµå¸¦ ¾ø¾Ù ¼ö ÀÖ°Ô µÈ´Ù. [Image] ÇÔ¼ö °´Ã¼¸¦ »ç¿ëÇÏ¿© ·¹ÆÛ·±½º ÀúÀåÇϱâ ÇÔ¼ö´ë½Å¿¡ ÇÔ¼ö°´Ã¼¸¦ »ç¿ëÇÏ´Â ¼¼¹ø° ÀÌÀ¯´Â ÇÔ¼ö¸¦ ¸Å¹ø È£ÃâÇÒ ¶§¸¶´Ù ÀÌÀü¿¡ È£ÃâÇßÀ» ´ç½ÃÀÇ »óŸ¦ ±â¾ïÇØ¾ß µÉ »óȲÀÌ Àֱ⠶§¹®ÀÌ´Ù. ÀÌ·¯ÇÑ ¿¹·Î, generate() ¾Ë°í¸®µë¿¡ »ç¿ëµÇ´Â ¹ß»ý±â(generator)¸¦ »ý¼ºÇÒ¶§¸¦ µé¼ö Àִµ¥, ¿©±â¼­ ¹ß»ý±â¶õ ¸Å¹ø È£ÃâµÉ¶§¸¶´Ù ´Ù¸¥ °ªÀ» ¹ÝȯÇÏ´Â ÇÔ¼ö¸¦ ¸»ÇÑ´Ù. °¡Àå ¸¹ÀÌ »ç¿ëµÇ´Â ÇüÅÂÀÇ ¹ß»ý±â´Â ³­¼ö ¹ß»ý±â¸¦ µé ¼ö ÀÖ°ÚÁö¸¸, ÀÌ¿Ü¿¡µµ ¿©·¯°¡Áö ¿ëµµ·Î ¾²ÀÏ ¼ö ÀÖ´Ù. ½ÃÄö½º ¹ß»ý±â´Â ´Ü¼øÈ÷ 1,2,3,4¿Í °°ÀÌ ÀÚ¿¬¼öÀÇ ¼ö¿­À» ¹ÝȯÇÑ´Ù. ÀÌ ÇÔ¼ö°´Ã¼¸¦ APL¿¡ ÀÖ´Â ÀÌ¿Í ºñ½ÁÇÑ ¿¬»êÀÇ À̸§À» µû¼­, iotaGenÀ̶ó ÇÏ°í, ´ÙÀ½°ú °°ÀÌ Á¤ÀÇÇغ¼ ¼ö ÀÖ°Ú´Ù. class iotaGen { public: iotaGen(int start = 0) : current(start) { } int operator()() { return current++; } private: int current; }; iota °´Ã¼´Â »ý¼ºÀÚ°¡ ÃʱâÈ­Çϰųª, µðÆúÆ®·Î 0À¸·Î ÃʱâÈ­µÈ °ªÀ» À¯ÁöÇÏ°í ÀÖ´Ù°¡, ÇÔ¼öÈ£Ãâ ¿¬»êÀÚ°¡ È£ÃâµÉ¶§¸¶´Ù, ÇöÀç °ªÀ» ¹ÝȯÇÏ°í, ÀÚ½ÅÀÇ °ªÀ» Çϳª Áõ°¡½ÃŲ´Ù. ÀÌ°´Ã¼¸¦ »ç¿ëÇؼ­, ´ÙÀ½°ú °°ÀÌ Ç¥ÁØ ¶óÀ̺귯¸® ÇÔ¼ö generate()¸¦ È£ÃâÇϸé 20°³ÀÇ ¿ø¼Ò¸¦ °¡Áø vector¸¦ 1ºÎÅÍ 20±îÁöÀÇ °ªÀ¸·Î ÃʱâÈ­ÇÒ ¼ö ÀÖ´Ù. vector aVec(20); generate(aVec.begin(), aVec.end(), iotaGen(1)); 3.4 ÇÔ¼ö ¾î´ðÅÍ(function adaptor) ÇÔ¼ö ¾î´ðÅÍ(function adaptor)´Â ÇÔ¼ö¸¦ ÇÔ¼ö°´Ã¼·Î »ç¿ëÇÒ ¼ö ÀÖµµ·Ï Àü¿ªÇÔ¼ö ¶Ç´Â ¸â¹öÇÔ¼ö¸¦ ¹Ù²ãÁִ Ŭ·¡½ºÀÇ °´Ã¼ÀÌ´Ù(ÇÔ¼ö °´Ã¼´Â ÇÔ¼ö ¶Ç´Â ÇÔ¼ö°´Ã¼ÀÇ ÇൿÀ» ¹Ù²Ù´Âµ¥ »ç¿ëÇÒ ¼öµµ ÀÖ´Ù. ÀÌ´Â ´ÙÀ½ Àý¿¡¼­ ´Ù·çµµ·Ï ÇÑ´Ù). °¢°¢ÀÇ ÇÔ¼ö ¾î´ðÅÍ´Â Àü¿ª ÇÔ¼ö ¶Ç´Â ¸â¹ö ÇÔ¼ö¸¦ ÀÎÀÚ·Î ÇÏ´Â »ý¼ºÀÚ¸¦ °¡Áö°í ÀÖ´Ù. pointer_to_unary_function°ú pointer_to_binary_function ÅÛÇø´Àº Çϳª ¶Ç´Â µÎ°³ÀÇ ÀÎÀÚ¸¦ °¡Áö´Â Àü¿ª ÇÔ¼ö¸¦ °³ÀÛÇϴµ¥ »ç¿ëµÈ´Ù. ÀÌµé ¾î´ðÅÍ´Â Á÷Á¢ Àû¿ëÇÒ ¼öµµ ÀÖ°í, ptr_fun ÇÔ¼ö ÅÛÇø´À» »ç¿ëÇÏ¿© ÀûÀýÇÑ ¾î´ðÅ͸¦ ÀÚµ¿À¸·Î »ý¼ºÇÒ¼öµµ ÀÖ´Ù. ¿¹¸¦ µé¾î, ±×³É ´Ü¼øÇÑ times3() ÇÔ¼ö¸¦ °³ÀÛÇÏ¿©, À̸¦ Á¤¼ö vector¿¡ Àû¿ëÇÒ ¼ö ÀÖ´Ù. int times3(int x) { return 3 * x; } int a{} {1,2,3,4,5}; vector v(a, a+5), v2; transform(v.begin(), v.end(), v2.end(), ptr_fun(times3)); ¶Ç´Â, ¾î´ðÅ͸¦ Àû¿ëÇÏ¿© »õ·Ó°Ô °³ÀÛµÈ ÇÔ¼ö °´Ã¼¸¦ vector·Î ³Ñ°ÜÁØ´Ù. pointer_to_unary_function pf(times3); transform(v.begin(), v.end(), v2.end(), pf); ÀÌ·¸°Ô ÇÏ´Â °æ¿ì, ÄÄÆÄÀÏ·¯°¡ ptr_funÀ» »ç¿ëÇÏ¿© pointer_to_unary_functionÀÌ ¿ä±¸Çϴ ŸÀÔÀ» Ãß·ÐÇÒ ¼ö ÀÖ´Ù´Â ÀåÁ¡ÀÌ ÀÖ´Ù. (?) 'mem_fun' ºÎ·ùÀÇ ÅÛÇø´Àº Àü¿ªÇÔ¼ö°¡ ¾Æ´Ñ ¸â¹öÇÔ¼ö¸¦ °³ÀÛÇϴµ¥ »ç¿ëµÈ´Ù. ¿¹¸¦ µé¾î, listÀÇ setÀ» °¡Áö°í ÀÖ°í, set³»ÀÇ °¢ list¸¦ Á¤·ÄÇÏ°í ½Í´Ù¸é, mem_fun_t³ª mem_funÀ» »ç¿ëÇÏ¿© set³»ÀÇ °¢ list¿¡ list Á¤·ÄÇÔ¼ö¸¦ Àû¿ëÇÒ ¼ö ÀÖ´Ù. set* > s; // set ¿ø¼ÒµéÀ» listµé·Î ÃʱâÈ­ÇÑ´Ù ... // set¿¡ ¼ÓÇØÀÖ´Â listµéÀ» °¢°¢ Á¤·ÄÇÑ´Ù for_each(s.begin(),s.end(),mem_fun(&list::sort)); // ÀÌÁ¦ set¿¡ ¼ÓÇÑ °¢°¢ÀÇ listµéÀÌ ¸ðµÎ Á¤·ÄµÇ¾ú´Ù. This is necessary because the generic sort algorithm cannot be used on a list. This is also the simplest way to access any polymorphic characteristics of an object held in a standard container. For instance I might invoke a virtual draw function on a collection of objects that are all part of the canonical 'shape' hierarchy like this: // shape »ó¼Ó±¸Á¶ class shape { virtual void draw(); }; class circle : public shape { void draw(); }; class square : public shape { void draw(); }; // vector¿¡ shapeµéÀ» Áý¾î³Ö´Â´Ù circle c; square s; vector v; v.push_back(&s); v.push_back(&c); // vector¿¡ ´ã±ä °¢°¢ÀÇ shape¿¡ ´ëÇØ draw()¸¦ È£ÃâÇÑ´Ù for_each(v.begin(),v.end(), mem_fun(&shape::draw)); Àü¿ªÇÔ¼ö ¾î´ðÅÍ¿Í ºñ½ÁÇÏ°Ô, ¸â¹öÇÔ¼ö ¾î´ðÅÍ´Â °¢°¢ ÇϳªÀÇ Å¬·¡½º ÅÛÇø´°ú ÀÌ¿Í °ü·ÃµÈ ÇÔ¼ö ÅÛÇø´À¸·Î ±¸¼ºµÈ´Ù. Ŭ·¡½º°¡ ½ÇÁúÀûÀÎ ¾î´ðÅÍÀ̸ç, ÇÔ¼ö°¡ ±× Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ µµÁß¿¡ »ý¼ºÇÔÀ¸·Î½á Ŭ·¡½ºÀÇ »ç¿ëÀ» ´Ü¼øÇÏ°Ô ¸¸µé¾îÁØ´Ù. (?)¿¹¸¦ µé¾î, À§¿¡¼­ mem_fun_t¸¦ ¸¸µé¾î¼­ for_each() ¾Ë°í¸®µëÀ¸·Î ³Ñ°ÜÁÙ¼öµµ ÀÖ¾ú´Ù. mem_fun_t mf(&shape::draw); for_each(v.begin(), v.end(), mf); À̹ø¿¡µµ, mem_fun ÇÔ¼ö ÅÛÇø´ÀÌ ÄÄÆÄÀÏ·¯·Î ÇÏ¿©±Ý mem_fun_t°¡ ÇÊ¿ä·ÎÇϴ ŸÀÔÀ» ¾Ë¾Æ³¾ ¼ö ÀÖµµ·Ï ÇÔÀ¸·Î½á mem_fun_t ¾î´ðÅÍÀÇ »ç¿ëÀ» ´Ü¼øÈ­ÇÑ °ÍÀ» º¼ ¼ö ÀÖ´Ù.(?) ¶óÀ̺귯¸®´Â ÀÎÀÚ¸¦ °¡ÁöÁö ¾Ê´Â ÇÔ¼ö¿Í 1°³ÀÇ ÀÎÀÚ¸¦ °¡Áö´Â ÇÔ¼öµé¿¡ ´ëÇؼ­ ¸â¹ö ÇÔ¼ö ¾î´ðÅ͸¦ Á¦°øÇÑ´Ù. ÇÏÁö¸¸, ±× ÀÌ»óÀÇ ÀÎÀÚ¸¦ °¡Áö´Â ÇÔ¼öµé¿¡ ´ëÇؼ­µµ ½±°Ô È®ÀåÀÌ °¡´ÉÇÏ´Ù. 3.5 ºÎÁ¤ÀÚ(negator)¿Í ¹ÙÀδõ(binder) ºÎÁ¤ÀÚ(negator)¿Í ¹ÙÀδõ(binder)´Â ±âÁ¸¿¡ ÀÖ´ø ÇÔ¼ö °´Ã¼·ÎºÎÅÍ »õ·Î¿î ÇÔ¼ö °´Ã¼¸¦ ¸¸µå´Âµ¥ »ç¿ëµÇ´Â ÇÔ¼ö ¾î´ðÅÍÀÌ´Ù. À̵éÀº ´Ù¸¥ ÇÔ¼ö³ª generic ¾Ë°í¸®µëÀ» È£ÃâÇϱ⿡ ¾Õ¼­ ÀÎÀÚ ¸®½ºÆ®¸¦ ±¸¼ºÇÏ´Â °úÁ¤ÀÇ ÀϺηΠ»ç¿ëµÇ´Â °ÍÀÌ º¸ÅëÀÌ´Ù. ºÎÁ¤ÀÚ not1()¿Í not2()´Â °¢°¢ ´ÜÇ×°ú ÀÌÇ× Á¶°ÇÀÚ °´Ã¼¸¦ ÀÎÀÚ·Î ¹Þ¾Æµé¿©, ¿ø·¡ °ªÀÇ ¹Ý´ë°ªÀ» ³»¹ñ´Â »õ·Î¿î ÇÔ¼ö °´Ã¼¸¦ »ý¼ºÇÑ´Ù. ¿¹¸¦ µé¾î, ¾ÕÀý¿¡¼­ Á¤ÀÇÇÑ widget °Ë»ç±â ÇÔ¼ö °´Ã¼¸¦ ÀÌ¿ëÇϸé, ÇÔ¼ö°´Ã¼ not2(WidgetTester()) ´Â widget °Ë»ç±â¿Í °°Àº ÀÎÀÚ¸¦ °¡Áö°í, widget °Ë»ç±â°¡ ÂüÀ϶§ °ÅÁþÀ», °ÅÁþÀ϶§ ÂüÀ» ¹ÝȯÇÏ´Â ÀÌÁø Á¶°ÇÀÚ¸¦ ¸¸µé¾î³½´Ù. ºÎÁ¤ÀÚ´Â unary_function°ú binary_function Ŭ·¡½ºÀÇ ÇÏÀ§ Ŭ·¡½º·Î Á¤ÀÇµÈ ÇÔ¼ö °´Ã¼ÇÏ°í¸¸ »ç¿ëµÈ´Ù. [Image] A Hot Idea ¹ÙÀδõ´Â µÎ°³ÀÇ ÀÎÀÚ¸¦ °¡Áö´Â ÇÔ¼ö¸¦ ¹Þ¾Æ¼­, ù¹ø° ÀÎÀÚ³ª µÎ¹ø° ÀÎÀÚ¸¦ ƯÁ¤ °ªÀ¸·Î ¹ÙÀεå½ÃÄÑ ÇÑ°³ÀÇ ÀÎÀÚ¸¦ °¡Áö´Â ÇÔ¼ö¸¦ ¸¸µé¾î ³½´Ù. À̶§, ¹ÙÀδõÀÇ ÀÎÀÚ·Î ³Ñ¾î¿À´Â ÇÔ¼ö´Â binary_function Ŭ·¡½ºÀÇ ÇÏÀ§ Ŭ·¡½º¿¡ ¼ÓÇØ¾ß ÇÑ´Ù. bind1st() ¹ÙÀδõ´Â ù¹ø° ÀÎÀÚ¸¦ ¹ÙÀεåÇÏ°í, bind2nd()´Â µÎ¹ø° ÀÎÀÚ¸¦ ¹ÙÀεåÇÑ´Ù. ¿¹¸¦ µé¾î, ¹ÙÀδõ bind2nd(greater(), 5)´Â 5º¸´Ù Å«Áö¸¦ °Ë»çÇÏ´Â ÇÔ¼ö°´Ã¼¸¦ ¸¸µé¾î³»¸ç, ´ÙÀ½°ú °°ÀÌ ¾²ÀÏ ¼ö ÀÖ´Ù. ¾Æ·¡ ¿¹´Â list¿¡¼­ °¡Àå ¸ÕÀú ¹ß°ßµÇ´Â 5º¸´Ù Å« ¼ö¸¦ °¡¸®Å°´Â ¹Ýº¹ÀÚ¸¦ ¹ÝȯÇÏ´Â ÄÚµåÀÌ´Ù. list::iterator where = find_if(aList.begin(), aList.end(), bind2nd(greater(), 5)); ¹ÙÀδõ¿Í ºÎÁ¤ÀÚ¸¦ °áÇÕÇؼ­, ´ÙÀ½°ú °°Àº ÇÔ¼ö°´Ã¼¸¦ »ý¼ºÇÒ ¼ö ÀÖ´Ù. ÀÌ ÇÔ¼ö°´Ã¼´Â ÀÎÀÚ°¡ 3À¸·Î ³ª´²Áö¸é ÂüÀ», ±×·¸Áö ¾ÊÀ¸¸é °ÅÁþÀ» ¹ÝȯÇÑ´Ù. ¾Æ·¡ ÄÚµå´Â list·ÎºÎÅÍ 3ÀÇ ¹è¼ö¸¦ Á¦°ÅÇÑ´Ù. list::iterator where = remove_if(aList.begin(), aList.end(), not1(bind2nd(modulus(), 3))); ¾Æ·¡¿¡¼­ ¹ÙÀδõ´Â ÀÌÁø ÇÔ¼ö WidgetTester() ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§ widget ¹øÈ£¸¦ °íÁ¤½ÃÄѼ­, widget¸¸À» À¯ÀÏÇÑ ÀÎÀÚ·Î ÃëÇÏ´Â ÇÔ¼ö¸¦ ¸¸µé¾î³½´Ù. list::iterator wehave = find_if(on_hand.begin(), on_hand.end(), bind2nd(WidgetTester(), wid));