38-1-³ª.¾Ë°í¸®ÁòÀÇ º¯Çü

for_each ÇÔ¼ö´Â ¼øÈ¸ Áß¿¡ ÇÒ ÀÏÀ» °áÁ¤Çϱâ À§ÇØ ¹Ýµå½Ã ÇÔ¼ö °´Ã¼¸¦ ºÎ¸£µµ·Ï µÇ¾î ÀÖ´Ù. ¼øÈ¸¸¸ ÇÒ ¹Ù¿¡¾ß for_each¸¦ ºÎ¸¦ Çʿ䰡 ¾øÀ¸¹Ç·Î for_each¿¡°Ô ÇÔ¼ö °´Ã¼´Â ÇʼöÀûÀÎ Á¸Àç¶ó°í ÇÒ ¼ö ÀÖ´Ù. ÀÌó·³ ÇÔ¼ö °´Ã¼¸¦ ¸í½ÃÀûÀ¸·Î ¿ä±¸ÇÏ´Â ¾Ë°í¸®Áòµµ ÀÖ°í ÇÊ¿äÇÒ ¶§¸¸ ÇÔ¼ö °´Ã¼¸¦ ¿É¼ÇÀ¸·Î ¹Þ´Â ¾Ë°í¸®Áòµµ ÀÖ´Ù.

ÄÁÅ×À̳ʿ¡¼­ °ªÀ» °Ë»öÇÏ´Â find´Â ¼øÈ¸ÁßÀÇ ¹Ýº¹ÀÚ °ª°ú ¼¼ ¹øÂ° Àμö·Î ÁöÁ¤ÇÑ °ª(val)À» == ¿¬»êÀÚ·Î ºñ±³ÇÏ¿© Á¤È®ÇÏ°Ô ÀÏÄ¡ÇÏ´Â ¿ä¼Ò¸¦ ã¾Æ³½´Ù. ±×·±µ¥ ¶§·Î´Â ==·Î Á¤È®ÇÑ ÀÏÄ¡¸¦ °Ë»öÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó »ç¿ëÀÚ°¡ Á¤ÀÇÇÏ´Â ¹æ½ÄÀ¸·Î °Ë»öÇÒ ¿ä¼Ò¸¦ °ñ¶ó¾ß ÇÏ´Â °æ¿ìµµ ÀÖ´Ù. À̶§ ÇÔ¼ö °´Ã¼·Î ¿ä¼Ò¸¦ Á÷Á¢ ºñ±³ÇÒ ¼ö Àִµ¥ ÀÌ·± ÇÔ¼ö´Â º¸Åë ¿ø·¡ ÇÔ¼öÀÇ À̸§ ³¡¿¡ _if°¡ ºÙ´Â´Ù. findÀÇ ÇÔ¼ö °´Ã¼ ¹öÀüÀº ´ÙÀ½°ú °°´Ù.

 

InIt find_if(InIt first, InIt last, UniPred F);

 

¼¼ ¹øÂ° Àμö F´Â () ¿¬»êÀÚ¸¦ ¿À¹ö·ÎµùÇÏ´Â ÇÔ¼ö °´Ã¼ÀÌ¸ç ¿ä¼Ò°ª Çϳª¸¦ Àμö·Î Àü´Þ¹Þ¾Æ ÀÌ °ªÀÌ ¿øÇÏ´Â Á¶°ÇÀÌ ¸Â´ÂÁö °Ë»çÇÏ¿© boolÇüÀ» ¸®ÅÏÇÑ´Ù. ã´Â Á¶°Ç¿¡ ¸ÂÀ¸¸é true¸¦ ¸®ÅÏÇÏ°í ¾Æ´Ï¸é false¸¦ ¸®ÅÏÇÒ °ÍÀÌ´Ù. ÀÌó·³ boolÀ» ¸®ÅÏÇÏ´Â ÇÔ¼ö °´Ã¼¸¦ Ưº°È÷ Á¶°ÇÀÚ(Predicate)¶ó°í ºÎ¸£´Âµ¥ ¿ä¼Ò°¡ ÁöÁ¤ Á¶°ÇÀ» ¸¸Á·ÇÏ´ÂÁö¸¦ °Ë»çÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù. ´ÙÀ½Àº find_if¸¦ Ȱ¿ëÇÑ °Ë»ö ¿¹Á¦ÀÌ´Ù.

 

¿¹ Á¦ : find_if

#include <iostream>

#include <string>

#include <vector>

#include <algorithm>

using namespace std;

 

struct IsKim {

     bool operator()(string name) const {

          return (strncmp(name.c_str(),"±è",2)==0);

     }

};

 

void main()

{

     string names[]={"±èÀ¯½Å","À̼ø½Å","¼º»ï¹®","À庸°í","Á¶±¤Á¶",

          "½Å¼÷ÁÖ","±èÈ«µµ","Á¤µµÀü","À̼º°è","Á¤¸ùÁÖ"};

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

 

     vector<string>::iterator it;

     it=find_if(vs.begin(),vs.end(),IsKim());

     if (it==vs.end()) {

          cout << "¾ø´Ù." << endl;

     } else {

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

     }

}

 

names º¤ÅÍ¿¡ »ç¶÷ À̸§À» ¿©·¯ °³ ³ª¿­ÇØ ³õ°í ÀÌ Áß ±è¾¾¼ºÀ» °¡Áø »ç¶÷ÀÌ ÀÖ´ÂÁö¸¦ °Ë»öÇÑ´Ù. Àüü À̸§À» ´Ù °Ë»çÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó À̸§ÀÇ ÀϺθ¸À» °Ë»çÇϹǷΠfind ÇÔ¼ö·Î´Â ÀÌ °Ë»öÀ» ¼öÇàÇÒ ¼ö ¾ø´Ù. ºÎºÐ ¹®ÀÚ¿­ °Ë»öÀ» À§ÇØ () ¿¬»êÀÚ¸¦ ¿À¹ö·ÎµùÇÏ¿© ¾Õ µÎ ±ÛÀÚ°¡ "±è"ÀÎÁö¸¦ °Ë»çÇÏ´Â IsKimÀ̶ó´Â ÇÔ¼ö °´Ã¼ Ŭ·¡½º¸¦ ¼±¾ðÇØ ³õ°í find_ifÀÇ ¼¼ ¹øÂ° Àμö·Î ÀÌ ÇÔ¼ö °´Ã¼¸¦ Àü´ÞÇß´Ù. find_if È£Ãâ¹®Àº ´ÙÀ½ µÎ Áٷεµ Ç¥ÇöÇÒ ¼ö ÀÖ´Ù.

 

IsKim K;

it=find_if(vs.begin(),vs.end(),K);

 

Áö¿ª °´Ã¼ K¸¦ ¼±¾ðÇϰí ÀÌ °´Ã¼¸¦ find_ifÀÇ ¼¼ ¹øÂ° Àμö·Î Àü´ÞÇߴµ¥ À̶§ K´Â ¾îÂ÷ÇÇ find_if¿¡¼­¸¸ »ç¿ëµÇ¹Ç·Î Àӽà °´Ã¼À̸é ÃæºÐÇÏ´Ù. IsKim()Àº »ý¼ºÀÚ È£Ãâ¹®À̹ǷΠ() °ýÈ£´Â »ý·«ÇÒ ¼ö ¾ø´Ù. ¶Ç´Â ´ÙÀ½°ú °°ÀÌ ÀÏ¹Ý ÇÔ¼ö¸¦ Á¤ÀÇÇϰí ÇÔ¼ö Æ÷ÀÎÅ͸¦ Àü´ÞÇØµµ »ó°ü¾ø´Ù.

 

bool IsKim(string &name)

{

     return (strncmp(name.c_str(),"±è",2)==0);

}

 

it=find_if(vs.begin(),vs.end(),IsKim);

 

À̶§´Â IsKim ´ÙÀ½¿¡ °ýÈ£¸¦ ÀûÁö ¸»¾Æ¾ß Çϴµ¥ ÇÔ¼ö¸í ÀÚü°¡ ÇÔ¼ö Æ÷ÀÎÅÍÀ̹ǷΠ°ýÈ£°¡ ºÙÀ» Çʿ䰡 ¾øÀ¸¸ç ºÙ¾î¼­µµ ¾ÈµÈ´Ù. ÇÔ¼ö Æ÷ÀÎÅ͸¦ ¾²³ª ÇÔ¼ö °´Ã¼¸¦ ¾²³ª ½ÇÇà °á°ú´Â µ¿ÀÏÇÏÁö¸¸ °¡±ÞÀûÀ̸é ÇÔ¼ö °´Ã¼¸¦ ¾²´Â °ÍÀÌ ÈξÀ À¯¸®ÇÏ´Ù. ¼øÂ÷ °Ë»öÀ» ÇÏ´Â find_if´Â °¢ ¿ä¼Ò¸¶´Ù ÀÏÀÏÀÌ ºñ±³¸¦ Çϴµ¥ À̶§¸¶´Ù ½ÇÁ¦ ÇÔ¼ö°¡ È£ÃâµÈ´Ù¸é ¿À¹öÇìµå°¡ ³Ê¹« Ä¿Áö±â ¶§¹®ÀÌ´Ù.

ÇÔ¼ö °´Ã¼·Î ¸¸µé ¶§¿Í ÇÔ¼ö Æ÷ÀÎÅ͸¦ ¾µ ¶§ ÀμöÀÇ ÇüŰ¡ Á¶±Ý ´Þ¶óÁø´Ù. ÇÔ¼ö Æ÷ÀÎÅÍ´Â ·¹ÆÛ·±½º¸¦ Àü´Þ¹Þ´Â °ÍÀÌ ÁÁÀºµ¥ ¿Ö³ÄÇϸé string°°ÀÌ µ¢Ä¡°¡ Å« °´Ã¼¸¦ Àü´ÞÇÒ ¶§ °ªÀ¸·Î ¹ÞÀ¸¸é º¹»ç°¡ ¹ß»ýÇϸç ÀÌ ºñ¿ëÀÌ ¹«½ÃÇÒ ¼ö ¾øÀ» Á¤µµ·Î Ä¿Áú ¼ö Àֱ⠶§¹®ÀÌ´Ù. int°°Àº ´Ü¼ø ŸÀÔÀ̶ó¸é ¹°·Ð °ªÀ¸·Î Àü´ÞÇϳª ·¹ÆÛ·±½º·Î Àü´ÞÇϳª ÀüÇô Â÷À̰¡ ¾øÁö¸¸ ¸»ÀÌ´Ù. ¹Ý¸é ÇÔ¼ö °´Ã¼´Â Å©±â¿¡ »ó°ü¾øÀÌ °ªÀ¸·Î Àü´Þ¹Þ¾Æ¾ß Çϴµ¥ ¿Ö³ÄÇϸé ÀζóÀÎÀ¸·Î »ðÀԵDZ⠶§¹®¿¡ Àμö Àü´Þ °úÁ¤ÀÌ ÇÊ¿ä¾ø±â ¶§¹®ÀÌ´Ù.

¸¸¾à ÃÖÃÊÀÇ ±è°¡¸¸ ã´Â °ÍÀÌ ¾Æ´Ï¶ó ÄÁÅ×À̳ʳ»ÀÇ ¸ðµç ±è°¡¸¦ ´Ù °Ë»öÇÏ°í ½Í´Ù¸é ´Ù Ã£À» ¶§±îÁö ·çÇÁ¸¦ µ¹¸®¸é µÈ´Ù. mainÀÇ Äڵ带 ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÏ¸é ¸ðµç ±è°¡µéÀÌ ´Ù °Ë»öµÈ´Ù.

 

void main()

{

     ....

     vector<string>::iterator it;

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

          it=find_if(it,vs.end(),IsKim());

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

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

     }

}

 

ÇÔ¼ö °´Ã¼´Â °íÁ¤µÈ Àǹ̸¦ °¡Áö´Â ¾Ë°í¸®Áò¿¡ À¯¿¬¼ºÀ» ºÎ¿©ÇÏ¿© Ȱ¿ëµµ¸¦ ´ëÆøÀûÀ¸·Î Çâ»ó½ÃŲ´Ù. ºñ±³ Á¶°ÇÀ» Á÷Á¢ ÀÛ¼ºÇÒ ¼ö ÀÖÀ¸¹Ç·Î Á¤È®ÇÏ°Ô °°Àº °Í¸¸ °Ë»öÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó »ç¿ëÀÚ°¡ ¿øÇÏ´Â ¾î¶² Á¶°ÇÀ¸·Îµµ °Ë»öÇÒ ¼ö ÀÖ´Ù. »ç¿ø ¸íºÎ ÄÁÅ×À̳ʿ¡¼­ Á÷±ÞÀÌ °úÀå ÀÌ»óÀÌ°í ³ªÀÌ´Â 45 ~ 49¼¼ »çÀÌÀÌ¸ç °¡ºÒÀ» ÇÑ ÀûÀÌ ÀÖ°í ÀÔ»çÇÑÁö 10³â ÀÌ»ó µÇ¾ú°í ÀÚÅÃÀ» ¼ÒÀ¯ÇÑ ³²ÀÚ »ç¿øÀ» °Ë»öÇÏ´Â Á¤µµÀÇ º¹ÀâÇÑ µ¿ÀÛ±îÁöµµ °¡´ÉÇØÁø´Ù.

find´Â ÅÛÇø´À¸·Î µÇ¾î ÀÖÀ¸¹Ç·Î ÀÓÀÇÀÇ ÄÁÅ×À̳ʿ¡ ´ëÇØ °Ë»öÀ» ¼öÇàÇÒ ¼ö ÀÖ´Â ÀϹݼºÀ» °¡Áø´Ù. °Ë»ö ´ë»óÀ» ÅÛÇø´ Àμö·Î Àü´Þ¹ÞÀ¸¹Ç·Î Àμö·Î °Ë»ö ´ë»óÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. find_if´Â ¿©±â¿¡ ºñ±³ ¹æ½Ä±îÁöµµ Àμö·Î Àü´Þ¹Þ¾Æ °Ë»ö Á¶°ÇÀÌ ¹«¾ùÀΰ¡±îÁöµµ »ç¿ëÀÚ°¡ ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. ±×·¡¼­ findº¸´Ù find_if°¡ ÈξÀ ´õ ÀϹÝÀûÀÌ´Ù.

find»Ó¸¸ ¾Æ´Ï¶ó ´ëºÎºÐÀÇ STL ¾Ë°í¸®ÁòÀº ÇÔ¼ö °´Ã¼¸¦ Àμö·Î ÃëÇÏ´Â ¹öÀüÀÌ ÀÖ´Ù. Á¤·Ä, ´ëü, º´ÇÕ, °è»ê µî¿¡ »ç¿ëÀÚ°¡ °³ÀÔÇÒ ¿©Áö°¡ ¸¹ÀÌ ³²°ÜÁ® ÀÖ¾î STLÀÌ Á¦°øÇÏ´Â ±â´É´ë·Î¸¸ »ç¿ëÇÏÁö ¾Ê¾Æµµ µÈ´Ù. ±×·¡¼­ 60°³¹Û¿¡ ¾ÈµÇ´Â ¾Ë°í¸®ÁòÀ¸·Îµµ ¾öû³ª°Ô ¸¹Àº ÀÏÀ» ó¸®ÇÒ ¼ö ÀÖ´Â °ÍÀÌ´Ù. ´ÙÀ½ Ç׿¡¼­´Â sort ÇÔ¼ö¿¡ ÇÔ¼ö °´Ã¼¸¦ »ç¿ëÇÏ¿© ¿øÇÏ´Â ¹Ù´ë·Î Á¤·ÄÇϵµ·Ï ÇØ º¼ °ÍÀÌ´Ù.

´ÙÀ½Àº º» ÁÖÁ¦¸¦ Àá½Ã ¹þ¾î³ª find¿Í find_if ÇÔ¼öÀÇ À̸§¿¡ ´ëÇØ °íÂûÇØ º¸ÀÚ. °íÁ¤ °ªÀ¸·Î °Ë»öÇ졂 ÇÔ¼ö °´Ã¼¸¦ ¾²°Ç ³í¸®ÀûÀ¸·Î °Ë»öÀ̶ó´Â °°Àº ¿¬»êÀ» ÇϹǷΠµÎ ÇÔ¼öÀÇ À̸§À» ÅëÇÕÇϸé ÁÁÀ» °Í °°Àºµ¥ À̸§ÀÌ ´Þ¶ó ºÒÆíÇÏ´Ù. ÀÌ·¸°Ô µÈ ¿øÀÎÀº µÎ ÇÔ¼öÀÇ ¼±¾ð¹®ÀÌ »ç½Ç»ó µ¿ÀÏÇϱ⠶§¹®ÀÌ´Ù. µÎ ÇÔ¼öÀÇ ¿øÇüÀ» º¸ÀÚ.

 

InIt find(InIt first, InIt last, const T& val);

InIt find_if(InIt first, InIt last, UniPred F);

 

¹üÀ§¸¦ ÁöÁ¤ÇÏ´Â µÎ ÀμöÀÇ Å¸ÀÔÀº ¿ÏÀüÈ÷ µ¿ÀÏÇÏÁö¸¸ ¼¼ ¹øÂ° ÀμöÀÇ Å¸ÀÔÀÌ ´Þ¶ó ¾ð¶æ º¸±â¿¡´Â ¿À¹ö·Îµù Á¶°ÇÀ» ¸¸Á·ÇÏ´Â °Í °°´Ù. °ªÀÌ Àü´ÞµÇ´Â È£Ãâ°ú ÇÔ¼ö °´Ã¼°¡ Àü´ÞµÇ´Â È£ÃâÀÌ ±¸ºÐµÉ °Íó·³ º¸ÀδÙ. ±×·¯³ª ½ÇÁ¦·Î´Â ±¸ºÐµÇÁö ¾Ê´Âµ¥ ¿Ö³ÄÇÏ¸é µÑ ´Ù ÅÛÇø´À̱⠶§¹®ÀÌ´Ù. ¿À¹ö·ÎµùÀº ÇÔ¼ö È£Ãâ½Ã¿¡ ½ÇÀμöÀÇ Å¸ÀÔÀ» º¸°í °áÁ¤µÇÁö¸¸ ÅÛÇø´ ±¸Ã¼È­´Â ±×º¸´Ù ÈξÀ ÀÌÀüÀÎ ÄÄÆÄÀÏÇÒ ¶§ ÀϾ¹Ç·Î ±¸Ã¼È­ÇÒ ÅÛÇø´À» ¸ÕÀú ¼±ÅÃÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ¶È°°Àº À̸§À¸·Î µÎ °³ÀÇ ÅÛÇø´ÀÌ Á¤ÀǵǾî ÀÖÀ¸¸é ÄÄÆÄÀÏ·¯´Â µµ´ëü ¾î¶² °ÍÀ» ÂüÁ¶ÇÏ¿© ±¸Ã¼È­ÇØ¾ß ÇÏ´ÂÁö¸¦ °áÁ¤ÇÒ ¼ö ¾ø´Â °ÍÀÌ´Ù. ÀÌ »óȲÀÌ Àß ÀÌÇØ°¡ ¾È°¡¸é ´ÙÀ½ Äڵ带 ÄÄÆÄÀÏÇØ º¸°í ÄÄÆÄÀÏ·¯ÀÇ Åõ´ú°Å¸²À» ÀÐ¾î º¸ÀÚ.

 

template<typename IT, typename T>

IT find(IT first, IT last, T val) { return first; }

 

template<typename IT, typename F>

IT find(IT first, IT last, F Pred) { return first; }

 

º¸´Ù½ÃÇÇ ¿ÏÀüÈ÷ ¶È°°Àº ÅÛÇø´ÀÌ´Ù. ÅÛÇø´ ÀμöÀÇ À̸§ÀÌ T³ª FÀÎ °ÍÀº ÄÄÆÄÀÏ·¯°¡ º¸±â¿¡´Â ¾Æ¹« Àǹ̰¡ ¾ø´Ù. ¼³»ç ÄÄÆÄÀÏ·¯°¡ ÅÛÇø´ ÀμöÀÇ À̸§À» ³í¸®ÀûÀ¸·Î ÆÇ´ÜÇÏ´Â Àΰø Áö´ÉÀÌ ÀÖ¾î ÀÌ°Ô °¡´ÉÇÏ´Ù°í ÇÏ´õ¶óµµ ´ÙÀ½°ú °°Àº ¾ïÁö½º·¯¿î »óȲÀÌ Ãß°¡·Î ¹ß»ýÇÏ´Â ¹®Á¦°¡ ÀÖ´Ù.

 

find(vs.begin(),vs.end(),IsKim());

 

ÀÌ È£Ãâ¹®ÀÇ ¼¼ ¹øÂ° Àμö°¡ ÇÔ¼ö °´Ã¼À̹ǷΠÇÔ¼ö °´Ã¼ ¹öÀüÀ» È£ÃâÇØ¾ß ÇÑ´Ù°í È®½ÅÇÒ ¼ö ÀÖÀ»±î? ¸¸¾à vs°¡ ÇÔ¼ö °´Ã¼ÀÇ º¤ÅͶó¸é ±× Áß IsKim() °´Ã¼¿Í °°Àº ¿ä¼Ò¸¦ °Ë»öÇ϶ó´Â ¸í·ÉÀ̶ó°í ¿ì±æ ¼öµµ ÀÖÁö ¾Ê°Ú´Â°¡? ¹°·Ð ÀÌ°Ç ¾ïÁö¿¡ ºÒ°úÇÏ´Ù. ÀÌ·± ¾ïÁö°¡ ÅëÇÏÁö ¸»¾Æ¾ß Çϱ⠶§¹®¿¡ find¿Í find_if´Â Çϳª·Î ÅëÇÕµÇÁö ¸øÇÏ°í ¼­·Î ´Ù¸¥ À̸§À» °¡Áú ¼ö¹Û¿¡ ¾ø´Â °ÍÀÌ´Ù.

±×·¯³ª STLÀÇ ¸ðµç ÇÔ¼ö °´Ã¼ ¾Ë°í¸®ÁòÀÌ Ç×»ó if·Î¸¸ ³¡³ª´Â °ÍÀº ¶Ç ¾Æ´Ï´Ù. sort³ª merge°°Àº ¾Ë°í¸®ÁòÀº ÀÏ¹Ý ¹öÀü°ú ÇÔ¼ö °´Ã¼ ¹öÀüÀÇ Àμö °³¼ö°¡ ´Þ¶ó ¸ðÈ£ÇÔÀÌ ¾ø±â ¶§¹®¿¡ µÎ ¹öÀüÀÌ °°Àº À̸§À¸·Î Á¤ÀǵǾî ÀÖ´Ù. ÀϹÝÈ­¸¦ ºÎ¸£Â¢´Â STLÀÇ ¾Ë°í¸®Áò ÇÔ¼ö À̸§ÀÌ ºñÀϹÝÀûÀÎ ¼ÀÀε¥ ±â¼úÀûÀÎ ÀÌÀ¯¾ß ºÐ¸íÈ÷ ÀÖÁö¸¸ »ç¿ëÀÚµéÀÌ ±â¾ïÇÒ °Ô ¸¹¾ÆÁø´Ù´Â Á¡¿¡¼­ ¹Ù¶÷Á÷ÇÏÁö ¸øÇÑ ¼³°è¶ó°í ÇÒ ¼ö ÀÖ´Ù.

 

 IncludeSin

find_if ¿¹Á¦¸¦ º¯°æÇÏ¿© À̸§¿¡ "½Å"ÀÚ°¡ Æ÷ÇÔµÈ ¸ðµç ¿ä¼Ò¸¦ °Ë»öÇϵµ·Ï ¼öÁ¤ÇØ º¸¾Æ¶ó.