13.1 °³¿ä 13Àå°ú 14Àå¿¡¼­´Â Ç¥ÁØ ¶óÀ̺귯¸®°¡ Á¦°øÇÏ´Â generic ¾Ë°í¸®µë¿¡ ´ëÇØ ¼³¸íÇÑ´Ù. ¾Æ·¡ Ç¥´Â 13Àå¿¡¼­ ¼³¸íÇÒ ¾Ë°í¸®µëÀÇ À̸§°ú ¿ëµµ¸¦ ¿ä¾àÇØ ³õÀº °ÍÀ̸ç, ¾Ë°í¸®µëµéÀ» ¿ëµµº°·Î ºÐ·ùÇÏ¿´´Ù. À̸§ ¿ëµµ ÃʱâÈ­ ¾Ë°í¸®µë - 13.2Àý fill ½ÃÄö½º¸¦ ÃʱⰪÀ¸·Î ä¿ì±â fill_n n°³ÀÇ ÀÚ¸®¸¦ ÃʱⰪÀ¸·Î ä¿ì±â copy ½ÃÄö½º¸¦ ´Ù¸¥ ½ÃÄö½º¿¡ º¹»çÇϱâ copy_backward ½ÃÄö½º¸¦ ´Ù¸¥ ½ÃÄö½º¿¡ º¹»çÇϱâ generate »ý¼º±â(generator)¸¦ »ç¿ëÇÏ¿© ½ÃÄö½º¸¦ ÃʱâÈ­Çϱâ generate_n »ý¼º±â(generator)¸¦ »ç¿ëÇÏ¿© n°³ÀÇ ÀÚ¸®¸¦ ÃʱâÈ­Çϱâ swap_ranges µÎ º´·Ä ½ÃÄö½ºÀÇ ³»¿ë µÚ¹Ù²Ù±â °Ë»ö ¾Ë°í¸®µë - 13.3Àý find ÀÎÀÚ°ª°ú ÀÏÄ¡ÇÏ´Â ¿ø¼Ò ã±â find_if Á¶°ÇÀ» ¸¸Á·ÇÏ´Â ¿ø¼Ò ã±â adjacent_find ¿¬´Þ¾Æ Áߺ¹µÈ ¿ø¼Ò ã±â find_first_of ½ÃÄö½º³»¿¡¼­ ´Ù¸¥ ½ÃÄö½º¿¡ ¼ÓÇÏ´Â ¸â¹öÁß °¡Àå ¸ÕÀú ¹ß°ßµÇ´Â °Í ÂøÁö find_end ½ÃÄö½º³»¿¡¼­ ¼­ºê½ÃÄö½ºÀÇ ¸¶Áö¸· ¹ß»ý ã±â search ½ÃÄö½º³»¿¡¼­ ¼­ºê ½ÃÄö½º ã±â max_element ½ÃÄö½º¿¡¼­ ÃÖ´ë°ª ã±â min_element ½ÃÄö½º¿¡¼­ ÃÖ¼Ò°ª ã±â mismatch µÎ ½ÃÄö½º¸¦ ºñ±³ÇÏ¿© ºÒÀÏÄ¡µÇ´Â °÷ ã±â in-place º¯È¯ - 13.4Àý reverse ½ÃÄö½ºÀÇ ¿ø¼Ò µÚÁý±â replace ƯÁ¤°ªµéÀ» ´Ù¸¥ °ªÀ¸·Î ġȯ replace_if Á¶°ÇÀ» ¸¸Á·ÇÏ´Â ¿ø¼ÒµéÀ» ġȯ rotate ÇÑ Á¡À» Áß½ÉÀ¸·Î ¿ø¼ÒµéÀ» ¼øȯ partition ¿ø¼ÒµéÀ» µÎ±×·ìÀ¸·Î ÂÉ°³±â stable_partition ¼ø¼­¸¦ ±×´ë·Î À¯ÁöÇϸç ÂÉ°³±â next_permutation ´ÙÀ½ ¼ø¿­ »ý¼ºÇϱâ prev_permutation ÀÌÀü ¼ø¿­ »ý¼ºÇϱâ inplace_merge µÎ°³ÀÇ ÀÌ¿ôÇÑ ½ÃÄö½º¸¦ Çϳª·Î ÇÕÄ¡±â random_shuffle ½ÃÄö½º ³»ÀÇ ¿ø¼ÒµéÀ» ÀÓÀÇ·Î Àç¹èÄ¡Çϱ⠻èÁ¦ ¾Ë°í¸®µë - 13.5Àý remove Á¶°ÇÀ» ¸¸Á·ÇÏ´Â ¿ø¼Ò »èÁ¦ unique Áߺ¹µÇ´Â ¿ø¼Òµé Áß Ã¹¹ø° °Í¸¸ ³²±â°í ¸ðµÎ »èÁ¦ ½ºÄ®¶ó »ý¼º ¾Ë°í¸®µë - 13.6Àý count °ª°ú ÀÏÄ¡ÇÏ´Â ¿ø¼ÒµéÀ» Ä«¿îÆ® count_if Á¶°ÇÀ» ¸¸Á·ÇÏ´Â ¿ø¼ÒµéÀ» Ä«¿îÆ® accumulate ½ÃÄö½º·ÎºÎÅÍ ½ºÄ®¶ó°ª ¾ò±â inner_product µÎ ½ÃÄö½ºÀÇ ³»Àû equal µÎ ½ÃÄö½ºÀÇ »óµî °Ë»ç lexicographical_compare µÎ ½ÃÄö½º¸¦ ºñ±³ ½ÃÄö½º »ý¼º ¾Ë°í¸®µë - 13.7Àý transform °¢ ¿ø¼ÒµéÀ» º¯È¯ partial_sum ºÎºÐÇÕµéÀÇ ½ÃÄö½º¸¦ »ý¼º adjacent_difference ÀÎÁ¢Â÷µéÀÇ ½ÃÄö½º¸¦ »ý¼º ±âŸ ¿¬»ê - 13.8Àý for_each ÄÝ·º¼Ç³»ÀÇ ¿ø¼Ò °¢°¢¿¡ ´ëÇØ ÇÔ¼ö¸¦ Àû¿ë ÀÌ Àå¿¡¼­´Â °¢°¢ÀÇ ¾Ë°í¸®µëÀ» ¼³¸íÇÒ ¶§, °£´ÜÇÑ ¿¹Á¦¸¦ µé¾î ¼³¸íÇÒ °ÍÀÌ´Ù. 13.1.1 Include È­ÀÏ generic ¾Ë°í¸®µëÀ» »ç¿ëÇÏ·Á¸é ÀûÀýÇÑ Çì´õ È­ÀÏÀ» Æ÷ÇÔ½ÃÄÑ¾ß ÇÑ´Ù. ´ë´Ù¼öÀÇ ÇÔ¼ö°¡ algorithm Çì´õÈ­ÀÏ¿¡ Á¤ÀǵǾî ÀÖ´Ù. accumulate(), inner_product(), partial_sum(), adjacent_difference()´Â numeric Çì´õÈ­ÀÏ¿¡ Á¤ÀǵǾî ÀÖ´Ù. #include #include 13.2 ÃʱâÈ­ ¾Ë°í¸®µë °¡Àå ¸ÕÀú ´Ù·ç°Ô µÉ ¾Ë°í¸®µëµéÀº »õ·Î »ý¼ºÇÑ ½ÃÄö½º¸¦ ƯÁ¤°ªÀ¸·Î ÃʱâÈ­ÇÒ ¶§ »ç¿ëµÇ´Â °ÍµéÀÌ´Ù. 13.2.1 ½ÃÄö½º¸¦ ÃʱⰪÀ¸·Î ä¿ì±â fill()°ú fill_n() ¾Ë°í¸®µëÀº ½ÃÄö½º¸¦ Á¤ÇØÁø °ªÀ¸·Î ÃʱâÈ­Çϰųª ÀçÃʱâÈ­Çϴµ¥ »ç¿ëµÈ´Ù. ÇÁ·ÎÅäŸÀÔÀº ´ÙÀ½°ú °°´Ù. void fill(ForwardIterator first, ForwardIterator last, const T&); void fill_n(OutputIterator, Size, const T&); [Image] ÃʱâÈ­ ¾Ë°í¸®µëµé°£ÀÇ Â÷ÀÌÁ¡ ´ÙÀ½ ¿¹Á¦ ÇÁ·Î±×·¥Àº ÀÌµé ¾Ë°í¸®µëÀÇ ´Ù¾çÇÑ »ç¿ë¹ýÀ» º¸¿©ÁÖ°í ÀÖ´Ù. void fill_example() { // ¿¹1, ¹è¿­À» ÃʱâÈ­ÇÑ´Ù. char buffer[100], * bufferp = buffer; fill(bufferp, bufferp + 100, '\0'); fill_n(bufferp, 10, 'x'); // ¿¹2, list¸¦ ÃʱâÈ­ÇÑ µÚ, Ãß°¡·Î µ¡ºÙÀδÙ. list aList(5, "nothing"); fill_n(inserter(aList, aList.begin()), 10, "empty"); // ¿¹3, list³»ÀÇ °ªµéÀ» µ¤¾î¾´´Ù. fill(aList.begin(), aList.end(), "full"); // ¿¹4, ÄÝ·º¼ÇÀÇ ÀϺθ¦ ä¿î´Ù. vector iVec(10); generate(iVec.begin(), iVec.end(), iotaGen(1)); vector::iterator & seven = find(iVec.begin(), iVec.end(), 7); fill(iVec.begin(), seven, 0); } ¿¹1¿¡¼­´Â ¹®ÀÚ ¹è¿­À» ¼±¾ðÇÏ¿´´Ù. fill() ¾Ë°í¸®µëÀ» È£ÃâÇÏ¿© ÀÌ ¹è¿­À» ¸ðµÎ ³Î¹®ÀÚµé·Î ÃʱâÈ­ÇÑ´Ù. ÀÌÁß Ã³À½ 10ÀÚ¸®¸¦ ¹®ÀÚ 'x'·Î ġȯÇϱâ À§Çؼ­ fill_n() ¾Ë°í¸®µëÀ» »ç¿ëÇÑ´Ù. fill() ¾Ë°í¸®µëÀº ½ÃÀÛ ¹Ýº¹ÀÚ¿Í past-the-end ¹Ýº¹ÀÚ¸¦ ÀÎÀÚ·Î ¿ä±¸ÇÏÁö¸¸, fill_n() ¾Ë°í¸®µëÀº ½ÃÀÛ ¹Ýº¹ÀÚ¿Í ÃʱâÈ­ÇÒ °¹¼ö¸¦ ÀÎÀÚ·Î »ç¿ëÇÑ´Ù. ¿¹2´Â »ðÀÔ ¹Ýº¹ÀÚ(2.4Àý Âü°í)¿Í fill_n() ¾Ë°í¸®µëÀ» »ç¿ëÇÏ¿© list¿Í °°Àº °¡º¯±æÀÌ ÄÁÅ×À̳ʸ¦ ÃʱâÈ­ÇÏ°í ÀÖ´Ù. À§ ¿¹¿¡¼­ list´Â óÀ½¿¡ 5°³ÀÇ ¿ø¼Ò¸¦ °¡Áö°í ÀÖ°í, ÀÌµé ¸ðµÎ "nothing"À̶ó´Â ¹®ÀÚ¿­·Î ÃʱâÈ­µÇ¾î ÀÖ´Ù. ±× ´ÙÀ½, fill_n()À» È£ÃâÇÏ¿© ¹®ÀÚ¿­ "empty"¸¦ 10°³ »ðÀÔÇÏ¿´´Ù. °á°úÀûÀ¸·Î list´Â 15°³ÀÇ ¿ø¼Ò¸¦ °¡Áö°Ô µÈ´Ù. ¿¹3°ú ¿¹4´Â fill() »ç¿ëÇÏ¿© ÄÁÅ×À̳ÊÀÇ °ªµéÀ» º¯È­½ÃÅ°´Â ¹ýÀ» ¼³¸íÇÏ°í ÀÖ´Ù. ¿¹3Àº ¿¹2¿¡¼­ »ý¼ºÇÑ listÀÇ ¸ðµç ¿ø¼Òµé(ÃÑ15°³)À» ¹®ÀÚ¿­ "full"·Î µ¤¾î¾´´Ù. ¿¹4´Â listÀÇ ÀϺθ¸ µ¤¾î¾²´Â °ÍÀ» º¸¿©ÁØ´Ù. ¿ì¼± generate() ¾Ë°í¸®µë°ú iotaGen ÇÔ¼ö °´Ã¼(3.3Àý Âü°í)¸¦ »ç¿ëÇÏ¿©, 1 2 3 ... 10À¸·Î vector¸¦ ÃʱâÈ­ÇÑ´Ù. ±×¸®°í³ª¼­, find() ¾Ë°í¸®µë(13.3.1Àý)À» »ç¿ëÇÏ¿© ¿ø¼Ò 7¸¦ ã¾Æ, vector ŸÀÔÀÇ ¹Ýº¹ÀÚ¿¡ ÇØ´ç À§Ä¡¸¦ ÀúÀåÇÑ´Ù. ±× ´ÙÀ½¿¡, fill()À» È£ÃâÇÏ¿© óÀ½ºÎÅÍ ¿ø¼Ò 7 ¹Ù·Î ¾Õ±îÁö¸¦ ¸ðµÎ 0À¸·Î ġȯÇÑ´Ù. ÀÌ °á°ú vector´Â óÀ½ ¿©¼¸°³´Â 0À», ±× ´ÙÀ½¿¡´Â 7, 8, 9, 10ÀÇ °ªÀ» °¡Áö°Ô µÈ´Ù. fill()°ú fill_n() ¾Ë°í¸®µëÀº Ç¥ÁØ ¶óÀ̺귯¸®°¡ Á¦°øÇÏ´Â ¸ðµç ÄÁÅ×ÀÌ³Ê Å¬·¡½º¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Ù. set°ú °°Àº Á¤·Ä ÄÁÅ×À̳ʴ »ðÀÔ ¹Ýº¹ÀÚ¿Í ÇÔ²² »ç¿ëÇØ¾ß ÇÑ´Ù. 13.2.2 ½ÃÄö½º¸¦ ´Ù¸¥ ½ÃÄö½º¿¡ º¹»çÇϱâ [Image] ¿©·¯°³ÀÇ º¹»çº»À» µ¡ºÙÀÌ´Â ¹æ¹ý copy()¿Í copy_backward() ¾Ë°í¸®µëÀº ±â´ÉÀÌ ´Ù¾çÇÏ¿© ¿©·¯ ¿ëµµ·Î »ç¿ëµÈ´Ù. ¾Æ¸¶ Ç¥ÁØ ¶óÀ̺귯¸®¿¡¼­ °¡Àå ¸¹ÀÌ »ç¿ëµÇ´Â ¾Ë°í¸®µëÀÏ °ÍÀÌ´Ù. À̵éÀÇ ÇÁ·ÎÅäŸÀÔÀº ´ÙÀ½°ú °°´Ù. OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result); BidirectionalIterator copy_backward (BidirectionalIterator first, BidirectionalIterator last, BidirectionalIterator result); º¹»ç ¾Ë°í¸®µëÀº ´ÙÀ½°ú °°Àº ¿ëµµ¿¡ ÁÖ·Î »ç¿ëµÈ´Ù. * Àüü ½ÃÄö½º¸¦ »õ·Î¿î ½ÃÄö½º¿¡ º¹»çÇÑ´Ù. * Çö ½ÃÄö½ºÀÇ ºÎ½ÃÄö½º¸¦ »ý¼ºÇÑ´Ù. * ½ÃÄö½º¿¡ ¿ø¼Ò¸¦ Ãß°¡ÇÑ´Ù. * ÀԷ¿¡¼­ Ãâ·ÂÀ¸·Î ½ÃÄö½º¸¦ º¹»çÇÑ´Ù. * ½ÃÄö½º¸¦ ´Ù¸¥ ÇüÅ·Π¹Ù²Û´Ù. ´ÙÀ½ ¿¹Á¦ ÇÁ·Î±×·¥Àº ÀÌ µÎ ¾Ë°í¸®µëÀ» ¼³¸íÇÏ°í ÀÖ´Ù. void copy_example() { char *source = "reprise"; char *surpass = "surpass"; char buffer[120], *bufferp = buffer; // ¿¹1, ±×³É ´Ü¼øÇÑ º¹»ç copy(source, source + strlen(source) + 1, bufferp); // ¿¹2, ÀÚ±â ÀÚ½ÅÀ¸·ÎÀÇ º¹»ç copy(bufferp + 2, bufferp + strlen(buffer) + 1, bufferp); int buflen = strlen(buffer) + 1; copy_backward(bufferp, bufferp + buflen, bufferp + buflen + 3); copy(surpass, surpass + 3, bufferp); // ¿¹3, Ãâ·ÂÀ¸·Î º¹»ç copy(bufferp, bufferp + strlen(buffer), ostream_iterator(cout)); cout << endl; // ¿¹4, copy()¸¦ »ç¿ëÇÏ¿© ¹è¿­À» list·Î ¹Ù²Û´Ù. list char_list; copy(bufferp, bufferp + strlen(buffer), inserter(char_list, char_list.end())); char *big = "big "; copy(big, big + 4, inserter(char_list, char_list.begin())); char buffer2[120], *buffer2p = buffer2; *copy(char_list.begin(), char_list.end(), buffer2p) = '\0'; cout << buffer2 << endl; } ¿¹1¿¡¼­´Â copy()¸¦ È£ÃâÇÏ¿© º¯¼ö source°¡ °¡¸®Å°´Â ¹®ÀÚ¿­À» buffer·Î º¹»çÇÏ°í, µû¶ó¼­ buffer´Â "reprise"¸¦ °¡Áö°Ô µÈ´Ù. º¹»ç°¡ ³¡³ª´Â ÁöÁ¡Àº ¸¶Áö¸· ³Î¹®ÀÚ¸¦ Áö³ª¼­ÀÌ°í, µû¶ó¼­ ³Î¹®ÀÚµµ º¹»çµÈ´Ù. copy() ¿¬»êÀº ÀÚ±â Àڽſ¡°Ô·ÎÀÇ º¹»ç¸¦ Çã¿ëÇÑ´Ù. ´Ü, ¸ñÀûÁö ¹Ýº¹ÀÚ°¡ ¼Ò½º ¹Ýº¹ÀÚ ±¸°£¿¡ ¼ÓÇÏÁö ¾Ê¾Æ¾ß ÇÑ´Ù. ¿¹2¿¡¼­ º¹»ç´Â bufferÀÇ 2¹ø À§Ä¡¿¡¼­ ½ÃÀÛÇÏ¿© ³¡±îÁö ÁøÇàµÇ°í, ¹®ÀÚµéÀº bufferÀÇ ¸Ç¾ÕÀ¸·Î º¹»çµÈ´Ù. °á°úÀûÀ¸·Î buffer´Â "prise"¸¦ °¡Áö°Ô µÈ´Ù. "±×¸²"[copy_backward()] ¿¹2ÀÇ µÞºÎºÐÀº copy_backward() ¾Ë°í¸®µëÀ» ¼³¸íÇÏ°í ÀÖ´Ù. ÀÌ ÇÔ¼ö´Â copy() ¾Ë°í¸®µë°ú °°Àº ÀÛ¾÷À» ¼öÇàÇÏÁö¸¸, ½ÃÄö½ºÀÇ ³¡¿¡¼­ºÎÅÍ ¾ÕÂÊÀ¸·Î º¹»ç¸¦ °Å²Ù·Î ÇØ ³ª°£´Ù. À§ ¿¹¿¡¼­´Â buffer¿¡ "priprise"°¡ ³²°Ô µÈ´Ù. ±×¸®°í ³ª¼­, ´ÙÀ½¿¡ À̾îÁö´Â copy() ¿¬»ê¿¡ ÀÇÇØ Ã³À½ 3°³ÀÇ ¹®ÀÚ°¡ "sur"·Î ¼öÁ¤µÇ¾î, buffer¿¡ "surprise"°¡ ³²°Ô µÈ´Ù. [Image] copy_backward() ¿¹3Àº copy()¸¦ »ç¿ëÇÏ¿© °ªÀ» Ãâ·Â ½ºÆ®¸²À¸·Î ¿Å±â´Â °ÍÀ» ¼³¸íÇÑ´Ù(2.3.2Àý Âü°í). ÀÌ °æ¿ì¿¡ ¸ñÀûÁö´Â Ãâ·Â ½ºÆ®¸² cout¿¡ ´ëÇØ »ý¼ºµÈ ostream_iteratorÀÌ´Ù. ÀԷµµ ÀÌ¿Í ºñ½ÁÇÑ ¹æ¹ýÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, ÀÔ·Â ½ºÆ®¸²¿¡ µé¾îÀÖ´Â ¸ðµç ´Ü¾î¸¦ list·Î º¹»çÇÏ´Â ¹æ¹ýÀº copy() ¾Ë°í¸®µëÀ» ¾Æ·¡¿Í °°ÀÌ È£ÃâÇÏ¸é µÈ´Ù. list words; istream_iterator in_stream(cin), eof; copy(in_stream, eof, inserter(words, words.begin())); // words.begin()º¸´Ù´Â words.end()°¡ ÁÁÀ» °Í °°Àºµ¥... ÀÌ ±â¹ýÀº 8.3Àý¿¡¼­ ¼³¸íÇÑ Ã¶ÀÚ °Ë»ç±â¿¡¼­ »ç¿ëµÈ´Ù. º¹»ç´Â ½ºÆ®¸²À» ´Ù¸¥ ŸÀÔÀ¸·Î ¹Ù²Ù´Âµ¥ »ç¿ëÇÒ ¼öµµ ÀÖ´Ù. ¿¹¸¦ µé¾î, ¿¹4¿¡¼­ÀÇ È£ÃâÀº ¹®ÀÚ ¹è¿­, buffer¿¡ ´ã±ä ¹®ÀÚµéÀ» ¹®ÀÚ list·Î º¹»çÇÑ´Ù. inserter()¸¦ È£ÃâÇÏ¿©, »ðÀÔ ¹Ýº¹ÀÚ¸¦ ¸¸µé°í, À̸¦ ÀÌ¿ëÇÏ¿© list¿¡ °ªµéÀ» »ðÀÔÇÑ´Ù. copy()ÀÇ Ã¹¹ø° È£ÃâÀº 2¹ø ¿¹Á¦¿¡¼­ »ý¼ºÇÑ "surprise" ¹®ÀÚ¿­À» list¿¡ »ðÀÔÇÑ´Ù. copy()ÀÇ µÎ¹ø° È£ÃâÀº "big " ¹®ÀÚ¿­À» listÀÇ ¾Õ¿¡ »ðÀÔÇÑ´Ù. µû¶ó¼­, list¿¡´Â "big surprise"°¡ ´ã±â°Ô µÈ´Ù. copy()ÀÇ ¸¶Áö¸· È£ÃâÀº ÀÌÀü°ú´Â ¹Ý´ë·Î list³»ÀÇ ¹®ÀÚµéÀ» ¹®ÀÚ buffer·Î º¹»çÇÑ´Ù. 13.2.3 ¹ß»ý±â°¡ »ý¼ºÇÑ °ªÀ¸·Î ½ÃÄö½º ÃʱâÈ­Çϱ⠹߻ý±â(generator)´Â ¿¬¼ÓÀûÀΠȣÃâÀ» ÅëÇØ ÀÏ·ÃÀÇ °ªµéÀ» ¸®ÅÏÇÏ´Â ÇÔ¼öÀÌ´Ù. ¾Æ¸¶ °¡Àå Àͼ÷ÇÑ ¹ß»ý±â·Î ³­¼ö ¹ß»ý±â¸¦ µé ¼ö ÀÖÀ» °ÍÀÌ´Ù. ±×·¯³ª, ÀÌ¿Ü¿¡µµ ½ÃÄö½º¸¦ ÃʱâÈ­ÇÏ´Â µîÀÇ ¿©·¯°¡Áö ¿ëµµ¿¡ ¸Âµµ·Ï ¹ß»ý±â¸¦ ±¸¼ºÇÒ ¼ö ÀÖ´Ù. fill()°ú fill_n()°ú °°ÀÌ generate()°ú generate_n()Àº ½ÃÄö½º¸¦ ÃʱâÈ­Çϰųª ÀçÃʱâÈ­Çϴµ¥ »ç¿ëµÈ´Ù. ±×·¯³ª, ÀÌµé ¾Ë°í¸®µëÀº °íÁ¤µÈ ÀÎÀÚ°ª´ë½Å¿¡ ¹ß»ý±â°¡ »ý¼ºÇÑ °ªµéÀ» »ç¿ëÇÑ´Ù. ÀÌ µÎ ¾Ë°í¸®µëÀÇ ÇÁ·ÎÅäŸÀÔÀº ´ÙÀ½°ú °°´Ù. void generate(ForwardIterator, ForwardIterator, Generator); void generate_n(OutputIterator, Size, Generator); ´ÙÀ½ ¿¹´Â ½ÃÄö½º¸¦ ÃʱâÈ­ÇÏ´Â generate() ¾Ë°í¸®µëÀÇ ´Ù¾çÇÑ »ç¿ë¿¹¸¦ º¸¿©ÁÖ°í ÀÖ´Ù. // 'L_ddd' ÇüÅÂÀÇ À¯ÀÏÇÑ ¶óº§À» »ý¼ºÇÏ´Â ¹ß»ý±â string generateLabel() { static int lastLabel = 0; char labelBuffer[80]; ostrstream ost(labelBuffer, 80); ost << "L_" << lastLabel++ << '\0'; return string(labelBuffer); } void generate_example() { // ¿¹1, ¶óº§ÀÇ list¸¦ »ý¼º list labelList; // list ¼±¾ð½Ã »çÀÌÁ ¸í½ÃÇÏÁö ¾Ê¾ÒÀ¸¹Ç·Î »ðÀԹݺ¹ÀÚ¸¦ »ç¿ë generate_n(inserter(labelList, labelList.begin()), 4, generateLabel); // ¿¹2, Á¤¼öµéÀÇ ½ÃÄö½º¸¦ »ý¼º vector iVec(10); // vector ¼±¾ð½Ã »çÀÌÁ ¸í½ÃÇßÀ¸¹Ç·Î ÀÏ¹Ý ¹Ýº¹ÀÚ¸¦ »ç¿ë generate(iVec.begin(), iVec.end(), iotaGen(2)); generate_n(iVec.begin(), 5, iotaGen(7)); } ¹ß»ý±â´Â ÇÑ°³ ÀÌ»óÀÇ Á¤Àû º¯¼ö¿¡ ÀÌÀü »óŸ¦ ÀúÀåÇÏ´Â °£´ÜÇÑ ÇÔ¼ö·Î ±¸ÇöÇÒ ¼ö ÀÖ´Ù. À§ ¿¹ÀÇ ¸Ç ¾Õ¿¡ ÀÖ´Â generateLabel() ÇÔ¼ö°¡ ±× ¿¹ÀÌ´Ù. ÀÌ ÇÔ¼ö´Â À¯ÀÏÇÑ ¶óº§À» »ý¼ºÇÑ´Ù(ÄÄÆÄÀÏ·¯¿¡¼­ ÀÌ¿Í ºñ½ÁÇÑ ÀÛ¾÷À» ÇÑ´Ù). generateLabel() ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§¸¶´Ù, À¯ÀÏÇÑ ¹øÈ£¸¦ °¡Áö´Â L_ddd ÇüÅÂÀÇ »õ·Î¿î ¶óº§À» ¸¸µé¾î ³½´Ù. lastLabelÀ̶õ À̸§À» °¡Áø º¯¼ö´Â staticÀ¸·Î ¼±¾ðµÇ¾ú±â ¶§¹®¿¡, ÀÌ º¯¼öÀÇ °ªÀº ´ÙÀ½¹ø È£Ãâ½Ã¿¡µµ ±×´ë·Î ³²°Ô µÈ´Ù. ¿¹1Àº ¹ß»ý±â¿Í generate_n()¾Ë°í¸®µëÀ» »ç¿ëÇÏ¿© list¸¦ ³×°³ÀÇ ¶óº§·Î ÃʱâÈ­ÇÏ°í ÀÖ´Ù. 3Àå¿¡¼­ ¼³¸íÇÑ ¹Ù¿Í °°ÀÌ, Ç¥ÁØ ¶óÀ̺귯¸®¿¡¼­ÀÇ ÇÔ¼ö´Â ÇÔ¼öÈ£Ãâ ¿¬»êÀÚ(operator())¿¡ ¹ÝÀÀÇÏ´Â °´Ã¼ÀÌ´Ù. ÀÌ »ç½ÇÀ» ÀÌ¿ëÇϸé, Ŭ·¡½º¸¦ ÇÔ¼ö·Î ¸¸µé¾î ¹ö¸± ¼ö ÀÖ´Ù. 3.3Àý¿¡¼­ ¼³¸íÇÑ iotaGen Ŭ·¡½º°¡ ±× ¿¹ÀÌ´Ù. iotaGen ÇÔ¼ö °´Ã¼´Â Á¤¼ö ½ÃÄö½º¸¦ ¸¸µå´Â ¹ß»ý±â¸¦ »ý¼ºÇÑ´Ù. ¿¹2´Â ÀÌ ½ÃÄö½º¸¦ »ç¿ëÇÏ¿© vector¸¦ 2¿¡¼­ 11±îÁöÀÇ Á¤¼ö°ªÀ¸·Î ÃʱâÈ­ÇÑ µÚ, generate_n() ÇÔ¼ö¸¦ È£ÃâÇÏ¿© vectorÀÇ Ã³À½ ´Ù¼¸ÀÚ¸®¸¦ 7ºÎÅÍ 11±îÁöÀÇ °ªÀ¸·Î µ¤¾î¾²°í ÀÖ´Ù. °á°úÀûÀ¸·Î, vector¿¡´Â 7 8 9 10 11 7 8 9 10 11À» Æ÷ÇÔÇÏ°Ô µÈ´Ù. 13.2.4 µÎ°³ÀÇ ±¸°£¿¡ ¼ÓÇÑ ¿ø¼Òµé ¼­·Î µÚ¹Ù²Ù±â ÅÛÇø´ ÇÔ¼ö swap()Àº ŸÀÔÀÌ µ¿ÀÏÇÑ µÎ °´Ã¼ÀÇ °ªÀ» ±³È¯Çϴµ¥ »ç¿ëµÈ´Ù. swap()Àº ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾî ÀÖ´Ù. template void swap(T& a, T& b) { T temp(a); a = b; b = temp; } iter_swap() ÇÔ¼ö´Â swap()À» º¸´Ù ÀϹÝÈ­ÇÑ °ÍÀ¸·Î ±³È¯ÇÒ °ªÀ» ¹Ýº¹ÀÚ·Î °¡¸®Å²´Ù. swap_ranges() ¾Ë°í¸®µëÀº ±³È¯ÀÇ Àû¿ë¹üÀ§¸¦ Àüü ½ÃÄö½º·Î È®ÀåÇÑ °ÍÀÌ´Ù. ù¹ø° ½ÃÄö½º¿¡ ¼ÓÇÏ´Â °ªµéÀ» µÎ¹ø° ½ÃÄö½º¿¡ ¼ÓÇÏ´Â °ªµé°ú ±³È¯ÇÑ´Ù. swap_ranges() ¾Ë°í¸®µëÀÇ ÇÁ·ÎÅäŸÀÔÀº ´ÙÀ½°ú °°´Ù. ForwardIterator swap_ranges (ForwardIterator first, ForwardIterator last, ForwardIterator first2); [Image] º´·Ä ½ÃÄö½º µÎ¹ø° ½ÃÄö½º¸¦ ³ªÅ¸³»´Â ±¸°£Àº ½ÃÀÛ ¹Ýº¹Àڷθ¸ ¸í½ÃÇÑ´Ù. µÎ¹ø° ±¸°£Àº Àû¾îµµ ù¹ø° ±¸°£¸¸Å­ÀÇ ¿ø¼Ò¸¦ °¡Á®¾ß ÇÑ´Ù. ¿¹Á¦ ÇÁ·Î±×·¥¿¡¼­ ÀÌ µÎÇÔ¼ö¸¦ ¼³¸íÇÑ´Ù. void swap_example() { // ¸ÕÀú µÎ°³ÀÇ ½ÃÄö½º¸¦ »ý¼º int data[] = {12, 27, 14, 64}, *datap = data; vector aVec(4); generate(aVec.begin(), aVec.end(), iotaGen(1)); // swap()°ú iter_swap() swap(data[0], data[2]); vector::iterator last = aVec.end(); last--; iter_swap(aVec.begin(), last); // ½ÃÄö½º Àüü¸¦ ±³È¯ swap_ranges(aVec.begin(), aVec.end(), datap); } 13.3 °Ë»ö ¿¬»ê À̹ø¿¡ »ìÆ캼 ¾Ë°í¸®µëµéÀº ½ÃÄö½º¿¡¼­ ÁÖ¾îÁø Á¶°ÇÀ» ¸¸Á·ÇÏ´Â ¿ø¼Ò¸¦ ãÀ» ¶§ »ç¿ëµÇ´Â °ÍµéÀÌ´Ù. º¸Åë °Ë»öÀÇ °á°ú´Â º¹»ç(13.4.4Àý Âü°í), ºÐÇÒ(13.2.2Àý Âü°í), in-place ÇÕº´(13.4.6Àý Âü°í)°ú °°Àº ¿¬»êÀÇ ÀÎÀÚ·Î ´Ù½Ã »ç¿ëµÈ´Ù. ÀÌ Àý¿¡¼­ ¼³¸íÇÒ °Ë»ö ¾Ë°í¸®µëµéÀº °Ë»ö Á¶°ÇÀ» ¸¸Á·Çϴ ù¹ø° ¿ø¼Ò¸¦ °¡¸®Å°´Â ¹Ýº¹ÀÚ¸¦ ¸®ÅÏÇÑ´Ù. ÀÌ °ªÀº º¸Åë ´ÙÀ½°ú °°ÀÌ ¹Ýº¹ÀÚ º¯¼ö¿¡ ÀúÀåÇÑ´Ù. list::iterator where; where = find(aList.begin(), aList.end(), 7); °Ë»ö Á¶°ÇÀ» ¸¸Á·ÇÏ´Â '¸ðµç' ¿ø¼Ò¸¦ ãÀ¸·Á¸é, ·çÇÁ¸¦ ÀÛ¼ºÇØ¾ß ÇÑ´Ù. ÀÌ ·çÇÁ¿¡¼­ ÀÌÀü °Ë»öÀÇ °á°ú°ª¿¡¼­ Çϳª ÀüÁøÇÏ°í(¾È±×·¯¸é, ÀÌÀü°Ë»öÀÇ °á°ú¸¦ ´Ù½Ã ¾ò°Ô µÈ´Ù), À̹ø °Ë»öÀÇ °á°ú°ªÀº ´ÙÀ½¹ø °Ë»öÀÇ ½ÃÀÛÁ¡À¸·Î »ç¿ëµÈ´Ù. ¿¹¸¦ µé¾î, adjacent_find() ¿¹Á¦ ÇÁ·Î±×·¥(13.3.2Àý)¿¡¼­ µû¿Â ´ÙÀ½ ·çÇÁ´Â ÀÎÀÚ·Î ÁÖ¾îÁø string¿¡¼­ ¿¬¼ÓÀûÀ¸·Î ¹Ýº¹µÇ´Â ¹®ÀÚµéÀ» ¸ðµÎ Ãâ·ÂÇÑ´Ù. [Image] °Ë»ö °á°úÀÇ °Ë»ç while ((where = adjacent_find(where, stop)) != stop) { cout << "double " << *where << " in position " << where - start << endl; ++where; // °Ë»ö°á°ú°ªÀ» Çϳª ÀüÁø½ÃÄÑ ´ÙÀ½¹ø °Ë»ö¿¡ »ç¿ë } ¸¹Àº °Ë»ö ¾Ë°í¸®µëµéÀÌ ¿ø¼Ò ºñ±³¿¡ »ç¿ëÇÒ ÇÔ¼ö¸¦ ÀÎÀÚ·Î °¡Áö´Âµ¥, ¸¸¾à ÀÌ ÀÎÀÚ°¡ »ý·«µÈ´Ù¸é, ÄÁÅ×À̳ʿ¡ ¼ÓÇÑ ¿ø¼Ò ŸÀÔÀÇ »óµî ¿¬»êÀÚ(== ¿¬»êÀÚ)¸¦ »ç¿ëÇÑ´Ù. ¾ÕÀ¸·Î ¾Ë°í¸®µëÀ» ¼³¸íÇÒ ¶§ »ý·«°¡´ÉÇÑ ÀÎÀÚ´Â °¢Áø ºê·¡Å¶³»([])¿¡ ¾²±â·Î ÇÑ´Ù. 13.3.1 Á¶°ÇÀ» ¸¸Á·ÇÏ´Â ¿ø¼Ò ã±â find()¿Í find_if() µÎ ¾Ë°í¸®µëÀº Á¶°ÇÀ» ¸¸Á·Çϴ ù¹ø° ¿ø¼Ò¸¦ ã´Âµ¥ »ç¿ëÇÑ´Ù. ÀÌ µÎ ¾Ë°í¸®µëÀÇ ÇÁ·ÎÅäŸÀÔÀº ´ÙÀ½°ú °°´Ù. InputIterator find_if(InputIterator first, InputIterator last, Predicate); // Á¶°ÇÀÚ¸¦ »ç¿ë InputIterator find(InputIterator first, InputIterator last, const T&); // ÀÎÀÚ°ªÀ» »ç¿ë find_if() ¾Ë°í¸®µëÀº Á¶°ÇÀÚ¸¦ ÀÎÀÚ·Î ÃëÇϴµ¥, Á¶°ÇÀÚ´Â ºÒ°ªÀ» ¸®ÅÏÇÏ´Â ÇÔ¼ö¶ó¸é ¸ðµÎ °¡´ÉÇÏ´Ù(3.2Àý). find_if() ¾Ë°í¸®µëÀº Á¶°ÇÀ» ¸¸Á·Çϴ ù¹ø° ¿ø¼Ò¸¦ °¡¸®Å°´Â ¹Ýº¹ÀÚ¸¦ ¸®ÅÏÇÑ´Ù. Á¶°ÇÀ» ¸¸Á·ÇÏ´Â ¿ø¼Ò¸¦ ãÁö ¸øÇϸé, µÎ¹ø° ÀÎÀÚ·Î ³Ñ°ÜÁØ past-the-end ¹Ýº¹ÀÚ¸¦ ¸®ÅÏÇÑ´Ù. °á°ú°ªÀÌ ¹Ýº¹ÀÚÀ̱⠶§¹®¿¡, ½ÇÁ¦°ªÀ» ¾ò±â À§Çؼ­´Â ¹Ýµå½Ã ÂüÁ¶ ¿¬»êÀÚ(* ¿¬»êÀÚ)¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù. ÀÌ´Â ¿¹Á¦ ÇÁ·Î±×·¥¿¡¼­ ¼³¸íÇÒ °ÍÀÌ´Ù. find() ¾Ë°í¸®µëÀº Á¶°ÇÀÚ ´ë½Å¿¡ ƯÁ¤°ªÀ» ÀÎÀÚ·Î »ç¿ëÇÏ°í, ÀÌ ÀÎÀÚ°ª°ú µ¿ÀÏÇÑ ½ÃÄö½º³»ÀÇ Ã¹¹ø° ¿ø¼Ò¸¦ ã¾Æ ¸®ÅÏÇÏ°í, À̶§ ÁÖ¾îÁø µ¥ÀÌÅÍ Å¸ÀÔÀÇ »óµî ¿¬»êÀÚ(== ¿¬»êÀÚ)¸¦ »ç¿ëÇÏ¿© ºñ±³¸¦ ÇÑ´Ù. [Image] set°ú mapÀÇ °Ë»ö ´ÙÀ½Àº ÀÌµé ¾Ë°í¸®µëÀ» »ç¿ëÇÑ ¿¹Á¦ ÇÁ·Î±×·¥ÀÌ´Ù. void find_test() { int vintageYears[] = {1967, 1972, 1974, 1980, 1995}; int *start = vintageYears; int *stop = start + 5; int *where = find_if(start, stop, isLeapYear); if (where != stop) cout << "first vintage leap year is " << *where << endl; else cout << "no vintage leap years" << endl; where = find(start, stop, 1995); if (where != stop) cout << "1995 is position " << where - start << " in sequence" << endl; else cout << "1995 does not occur in sequence" << endl; } 13.3.2 ¿¬¼ÓÀûÀ¸·Î Áߺ¹µÈ ¿ø¼Ò ã±â adjacent_find() ¾Ë°í¸®µëÀº ½ÃÄö½º³»¿¡¼­ ¹Ù·Î ´ÙÀ½¿¡ µû¶ó¿À´Â ¿ø¼Ò¿Í ÀÏÄ¡Çϴ ù¹ø° ¿ø¼Ò¸¦ ã´Âµ¥ »ç¿ëµÈ´Ù. ¿¹¸¦ µé¾î, ½ÃÄö½º°¡ 1 4 2 5 6 6 7 5¸¦ ´ã°í ÀÖ´Ù¸é, adjacent_find() ¾Ë°í¸®µëÀº ù¹ø° 6À» °¡¸®Å°´Â ¹Ýº¹ÀÚ¸¦ ¸®ÅÏÇÒ °ÍÀÌ´Ù. Á¶°ÇÀ» ¸¸Á·ÇÏ´Â ¿ø¼Ò°¡ ¾øÀ¸¸é, end-of-sequence ¹Ýº¹ÀÚ¸¦ ¸®ÅÏÇÑ´Ù. ¾Ë°í¸®µëÀÇ ÇÁ·ÎÅäŸÀÔÀº ´ÙÀ½°ú °°´Ù. ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator last [, BinaryPredicate ] ); óÀ½ µÎ°³ÀÇ ÀÎÀÚ´Â °Ë»öÀÌ ÀÌ·ç¾îÁö´Â ½ÃÄö½º¸¦ ¸í½ÃÇÑ´Ù. ¼¼¹ø° ÀÎÀÚ(»ý·«°¡´É)´Â ¹Ýµå½Ã ÀÌÇ× Á¶°ÇÀÚÀ̾î¾ß ÇÑ´Ù(ºÒ°ªÀ» ¸®ÅÏÇÏ´Â ÀÌÇ× ÇÔ¼ö). ¸¸¾à¿¡ ¼¼¹ø° ÀÎÀÚ°¡ ÁÖ¾îÁö¸é, ÀÌÇ× ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ÀÌ¿ôÇÏ´Â ¿ø¼ÒµéÀ» °Ë»çÇÏ°í, ÁÖ¾îÁöÁö ¾ÊÀ¸¸é, »óµî ¿¬»êÀÚ(== ¿¬»êÀÚ)¸¦ »ç¿ëÇÑ´Ù. ¿¹Á¦ ÇÁ·Î±×·¥Àº ÅؽºÆ® ¹®ÀÚ¿­¿¡¼­ ÀÌ¿ôÇÏ´Â ¹®ÀÚ¸¦ ã´Â °ÍÀÌ´Ù. ¿¹Á¦ ÅؽºÆ®¿¡¼­´Â 5, 7, 9, 21, 37¹ø À§Ä¡¿¡¼­ Áߺ¹µÇ´Â ¹®ÀÚµéÀÌ ³ªÅ¸³­´Ù. °°Àº À§Ä¡°¡ ¹Ýº¹Çؼ­ ¸®ÅϵÇÁö ¾Êµµ·Ï ·çÇÁ³»¿¡ Áõ°¡ ¿¬»êÀÌ ÇÊ¿äÇÏ°Ô µÈ´Ù. void adjacent_find_example() { char *text = "The bookkeeper carefully opened the door."; char *start = text; char *stop = text + strlen(text); char *where = start; cout << "In the text: " << text << endl; while ((where = adjacent_find(where, stop)) != stop) { cout << "double " << *where << " in position " << where - start << endl; ++where; } } 13.3.3 ½ÃÄö½º·ÎºÎÅÍ ¾î¶² °ªÀÇ Ã¹¹ø° ¹ß»ý ã±â find_first_of() ¾Ë°í¸®µëÀº ½ÃÄö½º¿¡¼­ ´Ù¸¥ ½ÃÄö½º¿¡µµ ¼ÓÇØ Àִ ù¹ø° ¿ø¼Ò¸¦ ã´Âµ¥ »ç¿ëÇÑ´Ù. ForwardIterator1 find_first_of (ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2 [, BinaryPredicate pred ] ); ÀÌ ¾Ë°í¸®µëÀº [first1, last1)¿¡ Æ÷ÇԵǾî ÀÖ´Â ¿ø¼Òµé Áß, [first2,last2)¿¡µµ Æ÷ÇԵǾî Àִ ù¹ø° ¿ø¼Ò¸¦ °¡¸®Å°´Â »õ ¹Ýº¹ÀÚ¸¦ ¸®ÅÏÇÑ´Ù. ¿ø¼Ò¸¦ ãÁö ¸øÇϸé, µÎ¹ø° ÀÎÀÚ¸¦ ¸®ÅÏÇÑ´Ù. °á°ú°ªÀÌ ¹Ýº¹ÀÚÀ̹ǷÎ, ÂüÁ¶ ¿¬»êÀÚ(* ¿¬»êÀÚ)¸¦ »ç¿ëÇÏ¿© °ªÀ» ±¸ÇØ¾ß ÇÑ´Ù. ÀÌ´Â ¿¹Á¦ ÇÁ·Î±×·¥¿¡ ¼³¸íµÇ¾î ÀÖ´Ù. [Image] Searching Sets and Maps ´ÙÀ½ ¿¹Á¦ ÇÁ·Î±×·¥Àº ÀÌ ¾Ë°í¸®µëÀ» ¼³¸íÇÏ°í ÀÖ´Ù. void find_test() { int vintageYears[] = {1967, 1972, 1974, 1980, 1995}; int requestedYears[] = [1923, 1970, 1980, 1974 }; int *start = vintageYears; int *stop = start + 5; int *where = find_first_of (start, stop, requestedyears,requestedyears+4 ); if (where != stop) cout << "first requested vintage year is " << *where << endl; else cout << "no requested vintage years" << endl; } // The output would indicate 1974. µÎ°³ÀÇ ½ÃÄö½º¸¦ ´Ù·ç´Â ¸¹Àº ¾Ë°í¸®µë°ú´Â ´Þ¸® ÀÌµé ¾Ë°í¸®µëÀº ù¹ø° ½ÃÄö½º¿¡ ´ëÇؼ­»Ó¸¸ ¾Æ´Ï¶ó, µÎ ½ÃÄö½º ¸ðµÎ¿¡ ´ëÇØ ½ÃÀÛ ¹Ýº¹ÀÚ¿Í ³¡ ¹Ýº¹ÀÚ¸¦ »ç¿ëÇÑ´Ù. equal()°ú mismatch() ¾Ë°í¸®µë°ú ¸¶Âù°¡Áö·Î, find_first_of()ÀÇ ¶Ç ´Ù¸¥ ¹öÀüÀº ÀÌÇ× Á¶°ÇÀÚ¸¦ ÀÎÀÚ·Î ÃëÇÏ¿©, µÎ°³ÀÇ ½ÃÄö½º·ÎºÎÅÍ ¿ø¼Ò¸¦ ºñ±³Çϴµ¥ »ç¿ëÇÑ´Ù. 13.3.4 ½ÃÄö½º¿¡¼­ ºÎ½ÃÄö½º ã±â search()¿Í search_n() ¾Ë°í¸®µëÀº ½ÃÄö½º³»¿¡¼­ ƯÁ¤ ºÎ½ÃÄö½ºÀÇ ½ÃÀÛÀ§Ä¡¸¦ ã´Âµ¥ »ç¿ëµÈ´Ù. ÀÌÇØÇϱ⠰¡Àå ½¬¿î ¿¹·Î ¹®ÀÚ¿­¿¡¼­ ƯÁ¤ ºÎ¹®ÀÚ¿­À» ã´Â ¹®Á¦¸¦ µé ¼ö ÀÖ°Ú´Ù. ÀÎÀÚµéÀº Àû¾îµµ ¼ø¹æÇ⠹ݺ¹ÀÚÀ̾î¾ß ÇÑ´Ù. ForwardIterator search (ForwardIterator first1, ForwardIterator last1, ForwardIterator first2, ForwardIterator last2 [, BinaryPredicate ]); [Image] Speed of Search ¿¹¸¦ µé¾î "dreams and aspirations"¶ó´Â ¹®ÀÚ¿­¿¡¼­ "ration" ¹®ÀÚ¿­ÀÇ À§Ä¡¸¦ ã´Â´Ù°í ÇÏÀÚ. ÀÌ ¹®Á¦¿¡ ´ëÇÑ ÇØ°áÃ¥Àº ¿¹Á¦ ÇÁ·Î±×·¥¿¡ ³ª¿Í ÀÖ´Ù. ¿øÇÏ´Â ¹®ÀÚ¿­À» ãÀ» ¼ö ¾øÀ¸¸é, ù¹ø° ½ÃÄö½ºÀÇ past-the-end ¹Ýº¹ÀÚ¸¦ ¸®ÅÏÇÑ´Ù. void search_example() { char *base = "dreams and aspirations"; char *text = "ration"; char *where = search(base, base + strlen(base), text, text + strlen(text)); if (*where != '\0') cout << "substring position: " << where - base << endl; else cout << "substring does not occur in text" << endl; } µÎ°³ÀÇ ½ÃÄö½º¸¦ ´Ù·ç´Â ¾Ë°í¸®µë°ú´Â ´Þ¸® ÀÌ ¾Ë°í¸®µëÀº ù¹ø° ½ÃÄö½º»Ó¸¸ ¾Æ´Ï¶ó µÎ¹ø° ½ÃÄö½º¿¡ ´ëÇؼ­µµ ½ÃÀÛ ¹Ýº¹ÀÚ¿Í ³¡ ¹Ýº¹ÀÚ¸¦ ¸ðµÎ »ç¿ëÇÑ´Ù. equal()°ú mismatch() ¾Ë°í¸®µë°ú ¸¶Âù°¡Áö·Î, search()ÀÇ ´Ù¸¥ ¹öÀüÀº µÎ°³ÀÇ ½ÃÄö½º¸¦ ºñ±³ÇÒ ¶§ »ç¿ëÇÒ ÀÌÇ× Á¶°ÇÀÚ¸¦ ÃëÇÑ´Ù(»ý·«°¡´É). 13.3.5 ºÎ½ÃÄö½ºÀÇ ¸¶Áö¸· ¹ß»ý ã±â find_end() ¾Ë°í¸®µëÀº ½ÃÄö½º ³»¿¡¼­ ƯÁ¤ ºÎ ½ÃÄö½º°¡ ¸¶Áö¸·À¸·Î ³ªÅ¸³ª´Â ½ÃÀÛÁ¡À» ã´Âµ¥ »ç¿ëÇÑ´Ù. °¡Àå ÀÌÇØÇϱ⠽¬¿î ¿¹·Î, ¹®ÀÚ¿­¿¡¼­ ƯÁ¤ ºÎ¹®ÀÚ¿­À» ã´Â ¹®Á¦¸¦ µé ¼ö ÀÖ´Ù. ÀÎÀÚ´Â Àû¾îµµ ¼ø¹æÇ⠹ݺ¹ÀÚÀ̾î¾ß ÇÑ´Ù. ForwardIterator find_end (ForwardIterator first1, ForwardIterator last1, ForwardIterator first2, ForwardIterator last2 [, BinaryPredicate ]); [Image] Speed of Find_end ¿¹¸¦ µé¾î, "The road less traveled" ¹®ÀÚ¿­¿¡¼­ "le" ¹®ÀÚ¿­ÀÌ ¸¶Áö¸·À¸·Î ³ªÅ¸³ª´Â À§Ä¡¸¦ ã´Â´Ù°í ÇÏÀÚ. ÀÌ ¹®Á¦ÀÇ ÇØ°á¹æ¹ýÀº ¿¹Á¦ ÇÁ·Î±×·¥¿¡ ³ªÅ¸³­´Ù. ¿øÇÏ´Â ¹®ÀÚ¿­À» ãÁö ¸øÇϸé, ù¹ø° ½ÃÄö½ºÀÇ past-the-end ¹Ýº¹ÀÚ¸¦ ¸®ÅÏÇÑ´Ù. void find_end_example() { char *base = "The road less traveled"; char *text = "le"; char *where = find(base, base + strlen(base), text, text + strlen(text)); if (*where != '\0') cout << "substring position: " << where - base << endl; else cout << "substring does not occur in text" << endl; } µÎ°³ÀÇ ½ÃÄö½º¸¦ ´Ù·ç´Â ´Ù¸¥ ¾Ë°í¸®µë°ú´Â ´Ù¸£°Ô, ÀÌ ¾Ë°í¸®µëÀº ù¹ø° ½ÃÄö½º»Ó¸¸ ¾Æ´Ï¶ó, µÎ¹ø° ½ÃÄö½º¿¡ ´ëÇؼ­µµ ½ÃÀÛ ¹Ýº¹ÀÚ¿Í ³¡ ¹Ýº¹ÀÚ¸¦ ¸ðµÎ »ç¿ëÇÑ´Ù. find_first_of(), search()¿Í ¸¶Âù°¡Áö·Î, find_end()ÀÇ ´Ù¸¥ ¹öÀüÀº µÎ ½ÃÄö½ºÀÇ ¿ø¼Ò¸¦ ºñ±³ÇÒ ¶§ »ç¿ëÇÏ´Â ÀÌÇ× Á¶°ÇÀÚ¸¦ ÀÎÀÚ·Î ÃëÇϸç, »ý·«°¡´ÉÇÏ´Ù. 13.3.6 ÃÖ´ë ¶Ç´Â ÃÖ¼Ò ¿ø¼Ò ã±â max()¿Í min() ÇÔ¼ö´Â µÎ °ªÀÇ ÃÖ´ë°ª°ú ÃÖ¼Ò°ªÀ» ¾Ë¾Æ³»´Âµ¥ »ç¿ëÇÑ´Ù. À̵é ÇÔ¼ö´Â less-than ¿¬»êÀÚ(< ¿¬»êÀÚ) ´ë½Å¿¡ »ç¿ëÇÒ ºñ±³ ÇÔ¼ö·Î ¼¼¹ø° ÀÎÀÚ¸¦ »ç¿ëÇÑ´Ù. template const T& max(const T& a, const T& b [, Compare ] ); template const T& min(const T& a, const T& b [, Compare ] ); max()¿Í min() ÇÔ¼ö¸¦ º¸´Ù ÀϹÝÈ­½ÃŲ max_element()¿Í min_element() ¾Ë°í¸®µëÀº ½ÃÄö½º Àüü¿¡ Àû¿ëÀÌ °¡´ÉÇÏ´Ù. À̵é ÇÔ¼öµéÀÇ ÀÎÀÚ´Â ÀÔ·Â ¹Ýº¹ÀÚµéÀÌ´Ù. ForwardIterator max_element (ForwardIterator first, ForwardIterator last [, Compare ] ); ForwardIterator min_element (ForwardIterator first, ForwardIterator last [, Compare ] ); [Image] Largest and Smallest Elements of a Set ÀÌ ¾Ë°í¸®µëµéÀº °¢°¢ ½ÃÄö½º³»¿¡¼­ ÃÖ´ë°ª°ú ÃÖ¼Ò°ªÀ» °¡¸®Å°´Â ¹Ýº¹ÀÚ¸¦ ¸®ÅÏÇÑ´Ù. ÃÖ´ë°ª ¶Ç´Â ÃÖ¼Ò°ªÀÌ Çϳª ÀÌ»óÀÏ °æ¿ì¿¡´Â ù¹ø° °ªÀÌ ¸®ÅϵȴÙ. µÎ ¾Ë°í¸®µë ¸ðµÎ ¼¼¹ø° ÀÎÀÚ·Î µðÆúÆ® ¿¬»êÀÚ ´ë½Å »ç¿ëÇÒ ºñ±³ ¿¬»êÀÚ¸¦ ÃëÇϸç, »ý·«°¡´ÉÇÏ´Ù. ¿¹Á¦ ÇÁ·Î±×·¥Àº ÀÌµé ¾Ë°í¸®µëÀ» »ç¿ëÇÏ´Â ¿¹¸¦ º¸ÀÎ °ÍÀÌ´Ù. split() ÇÔ¼ö(12.3Àý Âü°í)¸¦ »ç¿ëÇÏ¿© ¹®ÀÚ¿­À» ´Ü¾îµé·Î ÂÉ°³°í ÀÖ´Ù. randomInteger() ÇÔ¼ö´Â 2.2.5Àý¿¡ ¼³¸íµÇ¾î ÀÖ´Ù. void max_min_example() { // make a vector of random numbers between 0 and 99 vector numbers(25); for (int i = 0; i < 25; i++) numbers[i] = randomInteger(100); // print the maximum vector::iterator max = max_element(numbers.begin(), numbers.end()); cout << "largest value was " << * max << endl; // example using strings string text = "It was the best of times, it was the worst of times."; list words; split(text, " .,!:;", words); cout << "The smallest word is " << * min_element(words.begin(), words.end()) << " and the largest word is " << * max_element(words.begin(), words.end()) << endl; } 13.3.7 º´·Ä ½ÃÄö½º¿¡¼­ óÀ½À¸·Î ÀÏÄ¡ÇÏÁö ¾Ê´Â ¿ø¼Ò ã±â mismatch() ¾Ë°í¸®µëÀº À̸§¿¡¼­ ¾Ë ¼ö ÀÖµíÀÌ, µÎ°³ÀÇ ½ÃÄö½º°¡ ¼­·Î °°ÀºÁö¸¦ ÆǺ°ÇÏ´Â equal() ¾Ë°í¸®µë(13.6.4Àý)°ú ¹Ý´ëµÇ´Â ÇÔ¼öÀÌ´Ù. ´ë½Å¿¡, mismatch() ¾Ë°í¸®µëÀº ¹Ýº¹ÀÚµéÀÇ pair¸¦ ¸®ÅÏÇϴµ¥, ÀÌµé ¹Ýº¹ÀÚ´Â °¢°¢ µÎ ½ÃÄö½º¿¡¼­ ´Ù¸¥ ¿ø¼Ò°¡ ³ªÅ¸³ª´Â ù¹ø° À§Ä¡¸¦ ³ªÅ¸³½´Ù(pair ±¸Á¶¿¡ ´ëÇؼ­´Â 9.1Àý Âü°í). µÎ¹ø° ½ÃÄö½º´Â ³¡ ¹Ýº¹ÀÚ ¾øÀÌ ½ÃÀÛ ¹Ýº¹Àڷθ¸ Ç¥½ÃÇϸç, µÎ¹ø° ½ÃÄö½º´Â Àû¾îµµ ù¹ø° ½ÃÄö½º¸¸Å­ÀÇ ¿ø¼Ò¸¦ °¡Áö°í ÀÖ¾î¾ß ÇÑ´Ù(ÀÌ´Â ¾Ë°í¸®µë³»¿¡¼­ °Ë»çÇÏÁö ¾Ê´Â´Ù). ÀÏÄ¡ÇÏÁö ¾Ê´Â ¿ø¼Ò¸¦ ã±âµµ Àü¿¡ ù¹ø° ½ÃÄö½º°¡ ³¡ÀÌ ³ª¸é, °á°ú°ªÀ¸·Î ¸®ÅϵǴ pair¿¡´Â ù¹ø° ½ÃÄö½ºÀÇ ³¡ ¹Ýº¹ÀÚ¿Í µÎ¹ø° ½ÃÄö½º¿¡¼­ ¸Ç ¸¶Áö¸·À¸·Î »ìÆ캻 ¿ø¼Ò¸¦ °¡¸®Å°´Â ¹Ýº¹ÀÚ°¡ ´ã±â°Ô µÈ´Ù.(µÎ¹ø° ½ÃÄö½º´Â ¸ðµÎ Á¶»çµÉ ÇÊ¿ä°¡ ¾ø´Ù.) mismatch()ÀÇ ÀÎÀÚ¿Í ¸®ÅÏ°ªÀº ´ÙÀ½°ú °°´Ù. pair mismatch (InputIterator first1, InputIterator last1, InputIterator first2 [, BinaryPredicate ] ); ¿ø¼ÒµéÀº º´·ÄÀûÀ¸·Î Çϳª¾¿ °Ë»çÇϸç, µÎ ½ÃÄö½º°¡ ´Þ¶óÁö´Â ÁöÁ¡À» ¹ß°ßÇϸé, µÎ°³ÀÇ ´Ù¸¥ ¿ø¼ÒÀÇ À§Ä¡¸¦ °¡¸®Å°´Â ¹Ýº¹ÀÚ¸¦ ´ãÀº pair¸¦ ±¸¼ºÇÏ¿© ¸®ÅÏÇÑ´Ù. ÀÏÄ¡ÇÏÁö ¾Ê´Â ¿ø¼Ò¸¦ ã±âµµ Àü¿¡ ù¹ø° ½ÃÄö½º°¡ ³¡ÀÌ ³ª¸é, °á°ú°ªÀ¸·Î ¸®ÅϵǴ pair¿¡´Â ù¹ø° ½ÃÄö½ºÀÇ ³¡ ¹Ýº¹ÀÚ¿Í µÎ¹ø° ½ÃÄö½º¿¡¼­ ¸Ç ¸¶Áö¸·À¸·Î Á¶»çµÈ ¿ø¼Ò¸¦ °¡¸®Å°´Â ¹Ýº¹ÀÚ°¡ ´ã±â°Ô µÈ´Ù.(µÎ¹ø° ½ÃÄö½º´Â ¸ðµÎ Á¶»çµÉ ÇÊ¿ä°¡ ¾ø´Ù.) ¿¹Á¦ ÇÁ·Î±×·¥Àº ÀÌ ¾Ë°í¸®µëÀÇ »ç¿ë¿¹¸¦ º¸¿©ÁÖ°í ÀÖ´Ù. mismatch_test() ¿¹Á¦ÇÔ¼ö´Â µÎ°³ÀÇ stringÀ» ÀÎÀÚ·Î ÃëÇÑ´Ù. À̵éÀº »çÀü½ÄÀ¸·Î ºñ±³µÇ¾î ¼­·ÎÀÇ »ó´ëÀûÀÎ ¼ø¼­¸¦ Ç¥½ÃÇÏ´Â ¸Þ½ÃÁö°¡ Ãâ·ÂµÈ´Ù(?). mismatch() ¾Ë°í¸®µëÀº µÎ¹ø° ½ÃÄö½º°¡ ù¹ø° ½ÃÄö½º¸¸Å­Àº µÇ¾î¾ß ÇϹǷÎ, µÎ stringÀÇ ±æÀ̸¦ ºñ±³ÇÑµÚ µÎ¹ø° ¹®ÀÚ¿­ÀÌ Ã¹¹ø°º¸´Ù ªÀ¸¸é ÀÎÀÚ¸¦ ¹Ù²Û´Ù. mismatch()¸¦ È£ÃâÇÑ µÚ¿¡´Â °á°ú pairÀÇ °¢ Çʵ尪À» ÀûÀýÇÑ º¯¼ö¿¡ ÇÒ´çÇÏ¿©, À̵éÀÇ »ó´ëÀûÀÎ ¼ø¼­¸¦ °áÁ¤Çϴµ¥ ¾²ÀδÙ. void mismatch_test(char *a, char *b) { pair differPositions(0, 0); char *aDiffPosition; char *bDiffPosition; if (strlen(a) < strlen(b)) { // make sure longer string is second differPositions = mismatch(a, a + strlen(a), b); aDiffPosition = differPositions.first; bDiffPosition = differPositions.second; } else { differPositions = mismatch(b, b + strlen(b), a); // note following reverse ordering aDiffPosition = differPositions.second; bDiffPosition = differPositions.first; } // compare resulting values cout << "string " << a; if (*aDiffPosition == *bDiffPosition) cout << " is equal to "; else if (*aDiffPosition < *bDiffPosition) cout << " is less than "; else cout << " is greater than "; cout << b << endl; } mismatch() ¾Ë°í¸®µëÀÇ µÎ¹ø° ÇüÅ´Â, ¿ø¼ÒµéÀ» ºñ±³ÇÒ ¶§ == ¿¬»êÀÚ ´ë½Å¿¡ »ç¿ëÇÒ ÀÌÇ× ÇÔ¼ö¸¦ ³×¹ø° ÀÎÀÚ·Î ÃëÇÑ´Ù. 13.4 In-Place º¯È¯ À̹ø¿¡ ¼³¸íÇÒ ¾Ë°í¸®µëµéÀº ¿ø·¡ÀÇ ÀúÀå À§Ä¡·ÎºÎÅÍ À̵¿ÇÏÁö ¾Ê°í ½ÃÄö½º¸¦ ¼öÁ¤ÇÏ°í º¯È¯Çϴµ¥ »ç¿ëµÇ´Â °ÍµéÀÌ´Ù. replace()¿Í °°Àº ¸î¸î ·çƾµéÀº º»·¡ÀÇ in-place º¯È¯ ¾Ë°í¸®µë»Ó¸¸ ¾Æ´Ï¶ó º¹»ç ¹öÀüµéÀ» °¡Áö°í ÀÖ´Ù. ¾î¶² ·çƾµéÀº ¿ø·¡ÀÇ ½ÃÄö½º¸¦ À¯ÁöÇÒ ÇÊ¿ä°¡ ÀÖ´Ù¸é, ½ÃÄö½º°¡ º¹»çº»À» ¸ÕÀú »ý¼ºÇÏ°í ³ª¼­, º¯È¯À» Àû¿ëÇؾßÇÑ´Ù. ¿¹¸¦ µé¾î, ´ÙÀ½Àº vector¸¦ µÚÁýÀº °ÍÀ» »õ·Ó°Ô ÇÒ´çµÈ vector¿¡ ¹èÄ¡ÇÏ´Â ¹æ¹ýÀ» º¸¿©ÁÖ°í ÀÖ´Ù. vector newVec(aVec.size()); copy(aVec.begin(), aVec.end(), newVec.begin()); // first copy reverse(newVec.begin(), newVec.end()); // then reverse transform()(13.7.1Àý Âü°í)À̳ª partial_sum()(13.7.2Àý)°ú °°Àº ½ÃÄö½º »ý¼º ¿¬»ê ¾Ë°í¸®µëµéÀº ÀԷ°ú Ãâ·ÂÀ» °°Àº ¹Ýº¹ÀÚ·Î ¸í½ÃÇÏ¿© Á÷Á¢ ½ÃÄö½º¸¦ Á÷Á¢ ¼öÁ¤Çϴµ¥ »ç¿ëÇÑ´Ù. 13.4.1 ½ÃÄö½º³»ÀÇ ¿ø¼Ò µÚÁý±â reverse() ¾Ë°í¸®µëÀº ½ÃÄö½º³»ÀÇ ¿ø¼ÒµéÀ» µÚÁý¾î, ¸¶Áö¸· ¿ø¼Ò¸¦ ù¹ø° ¿ø¼Ò·Î ¸¸µé°í, ù¹ø° ¿ø¼Ò¸¦ ¸¶Áö¸· ¿ø¼Ò·Î ¸¸µç´Ù. ÀÎÀÚµéÀº ¾ç¹æÇ⠹ݺ¹ÀÚÀ̾î¾ßÇÏ°í, °ªÀº ¸®ÅϵÇÁö ¾Ê´Â´Ù. void reverse (BidirectionalIterator first, BidirectionalIterator last); ¿¹Á¦ ÇÁ·Î±×·¥Àº ÀÌ ¾Ë°í¸®µëÀÇ µÎ°¡Áö ¿ëµµÀ» ¼³¸íÇÏ°í ÀÖ´Ù. óÀ½°ÍÀº ¹®ÀÚ ¹è¿­À» µÚÁý´Â °ÍÀÌ´Ù. reverse() ¾Ë°í¸®µëÀº µÎ¹ø° ¿¹¿¡¼­ º¸´Â ¹Ù¿Í °°ÀÌ list¿¡µµ »ç¿ëÇÒ ¼ö ÀÖ´Ù. list´Â ¸ÕÀú 2¿¡¼­ 11±îÁöÀÇ °ªÀ¸·Î ÃʱâÈ­ µÇ°í(ÀÌ´Â 3.3Àý¿¡¼­ ¼Ò°³ÇÑ iotaGen ÇÔ¼ö °´Ã¼¸¦ »ç¿ëÇÏ¿´´Ù.), À̾ µÚÁý±â¸¦ ÇÏ¿©, list´Â 11ºÎÅÍ 2±îÁöÀÇ °ªÀ» °¡Áö°Ô µÈ´Ù. ±×·¯³ª, list µ¥ÀÌÅÍ ±¸Á¶´Â reverse() ¸â¹ö ÇÔ¼öµµ °¡Áö°í ÀÖÀ½À» ±â¾ïÇϱ⠹ٶõ´Ù. void reverse_example() // illustrate the use of the reverse algorithm { // example 1, reversing a string char *text = "Rats live on no evil star"; reverse(text, text + strlen(text)); cout << text << endl; // example 2, reversing a list list iList; generate_n(inserter(iList, iList.begin()), 10, iotaGen(2)); reverse(iList.begin(), iList.end()); } 13.4.2 ¾î¶² °ªÀ» ƯÁ¤ °ªÀ¸·Î ġȯÇϱâ replace()¿Í replace_if() ¾Ë°í¸®µëÀº ƯÁ¤ ¿ø¼ÒµéÀ» »õ·Î¿î °ªÀ¸·Î ±³Ã¼Çϴµ¥ »ç¿ëÇÑ´Ù. µÎ ¾Ë°í¸®µë ¸ðµÎ ¾Æ¹«¸® ±³Ã¼°¡ ¸¹ÀÌ ÀϾµµ, ±³Ã¼µÇ´Â ¿ø¼ÒµéÀº °á±¹ °°Àº °ªÀ» °¡Áø´Ù. replace() ¾Ë°í¸®µëÀº ƯÁ¤ °ª°ú °°Àº °ªµéÀº ¸ðµÎ »õ·Î¿î °ªÀ¸·Î ±³Ã¼ÇÑ´Ù. replace_if()?ÁÖ¾îÁø Á¶°ÇÀÚ¸¦ ¸¸Á·ÇÏ´Â ¸ðµç ¿ø¼ÒµéÀ» »õ·Î¿î °ªÀ¸·Î ±³Ã¼ÇÑ´Ù. ÀÎÀÚ·Î ÁÖ¾îÁö´Â ¹Ýº¹ÀÚ´Â ¼ø¹æÇ⠹ݺ¹ÀÚÀ̾î¾ß ÇÑ´Ù. replace_copy()¿Í replace_copy_if()µéÀº replace(), replace_if()µé°ú ºñ½ÁÇÏÁö¸¸, ÀüÀÚµéÀº ¿ø·¡ ½ÃÄö½ºµéÀº ±×³É °Çµå¸®Áö ¾ÊÀ¸¸ç, °»½ÅµÈ °ªµéÀº »õ ½ÃÄö½º(ŸÀÔÀÌ ´Þ¶óµµ µÊ)¿¡ ¹èÄ¡ÇÑ´Ù´Â Á¡ÀÌ ´Ù¸£´Ù. void replace(ForwardIterator first, ForwardIterator last, const T&, const T&); void replace_if(ForwardIterator first, ForwardIterator last, Predicate, const T&); OutputIterator replace_copy(InputIterator, InputIterator, OutputIterator, const T&, const T&); OutputIterator replace_copy(InputIterator, InputIterator, OutputIterator, Predicate, const T&); ¿¹Á¦ ÇÁ·Î±×·¥¿¡¼­, vector´Â ¸ÕÀú 0 1 2 3 4 5 4 3 2 1 0 À¸·Î ÃʱâÈ­µÈ´Ù. replace()¸¦ È£ÃâÇÏ¿© 3À» 7·Î ¹Ù²Ù¾î 0 1 2 7 4 5 4 7 2 1 0 ÀÌ µÇ°Ô ÇÑ´Ù. À̹ø¿¡´Â replace_if()¸¦ È£ÃâÇÏ¿© ¦¼ö¸¦ ¸ðµÎ 9·Î ±³Ã¼ÇÏ¿© 9 1 9 7 9 5 9 7 9 1 °¡ µÇ°Ô ÇÑ´Ù. void replace_example() // illustrate the use of the replace algorithm { // make vector 0 1 2 3 4 5 4 3 2 1 0 vector numbers(11); for (int i = 0; i < 11; i++) numbers[i] = i < 5 ? i : 10 - i; // replace 3 by 7 replace(numbers.begin(), numbers.end(), 3, 7); // replace even numbers by 9 replace_if(numbers.begin(), numbers.end(), isEven, 9); // illustrate copy versions of replace int aList[] = {2, 1, 4, 3, 2, 5}; int bList[6], cList[6], j; replace_copy(aList, aList+6, &bList[0], 2, 7); replace_copy_if(bList, bList+6, &cList[0], bind2nd(greater(), 3), 8); } ¿¹Á¦ ÇÁ·Î±×·¥Àº replace_copy() ¾Ë°í¸®µëÀÇ »ç¿ë¹ýµµ ¼³¸íÇÏ°í ÀÖ´Ù. ¸ÕÀú 2 1 4 3 2 5 ÀÇ °ªµéÀ» ´ãÀº ¹è¿­À» »ý¼ºÇÑ´Ù. 2¸¦ 7·Î ±³Ã¼ÇÏ¿© 7 1 4 3 7 5 ·Î ¸¸µç´Ù. ´ÙÀ½¿¡ 3º¸´Ù Å« ¸ðµç °ªµéÀ» 8·Î ±³Ã¼ÇÏ¿© 8 1 8 3 8 8 ·Î ¼öÁ¤ÇÑ´Ù. ÈÄÀÚÀÇ °æ¿ì¿¡´Â bind2nd() ¾î´ðÅ͸¦ »ç¿ëÇÏ¿© ÀÌÇ× ÇÔ¼öÀÎ greater-than ÇÔ¼öÀÇ µÎ¹ø° ÀÎÀÚ¸¦ 3À¸·Î °íÁ¤½ÃÄÑ x > 3¸¦ ÀǹÌÇÏ´Â ´ÜÇ× ÇÔ¼ö·Î ¸¸µé¾ú´Ù. 13.4.3 Áß°£ÁöÁ¡À» Áß½ÉÀ¸·Î ¿ø¼Òµé µ¹¸®±â ½ÃÄö½º¸¦ ¼øȯÇÑ´Ù´Â °ÍÀº ½ÃÄö½º¸¦ µÎºÐÀ¸·Î ³ª´©°í, À̵κκÐÀÇ À§Ä¡¸¦ ¹Ù²Ù¾î µÎºÎºÐ³»ÀÇ ¿ø¼ÒµéÀÇ »ó´ëÀûÀÎ ¼ø¼­´Â À¯ÁöµÇµµ·Ï ÇÏ´Â °ÍÀÌ´Ù. ¿¹¸¦ µé¾î, ´ÙÀ½ 1ºÎÅÍ 10±îÁöÀÇ ½ÃÄö½º¸¦ »ý°¢Çغ¸ÀÚ. 1 2 3 4 5 6 7 8 9 10 ¿ø¼Ò 7 ÁÖÀ§·Î ¼øȯÀ» ÇÏ·Á¸é, 7ºÎÅÍ 10±îÁöÀÇ °ªµéÀ» ¾ÕÂÊÀ¸·Î ¿Å±â°í, 1ºÎÅÍ 10±îÁöÀÇ °ªµéÀ» µÚÂÊÀ¸·Î ¿Å±â¸é µÈ´Ù. °á°ú´Â ´ÙÀ½°ú °°´Ù. 7 8 9 10 1 2 3 4 5 6 rotate() ¾Ë°í¸®µëÀ» È£ÃâÇÒ ¶§´Â ½ÃÀÛÁ¡, Áß°£Á¡, past-the-end À§Ä¡¸¦ ¼ø¹æÇ⠹ݺ¹ÀÚ·Î ¸í½ÃÇÑ´Ù. void rotate(ForwardIterator first, ForwardIterator middle, ForwardIterator last); ¾ÕºÎºÐÀº ½ÃÀÛÁ¡ºÎÅÍ Áß°£Á¡ ¹Ù·Î ¾Õ±îÁöÀ̸ç, µÞºÎºÐÀº Áß°£Á¡ºÎÅÍ past-the-end±îÁöÀÌ´Ù. ¹Ù·Î ¾Õ¿¡ ¿¹¿¡¼­ ¾Ë ¼ö ÀÖµíÀÌ, ¾ÕºÎºÐ°ú µÞºÎºÐÀÇ ±æÀÌ°¡ °°À» ÇÊ¿ä´Â ¾ø´Ù. void rotate_example() // illustrate the use of the rotate algorithm { // create the list 1 2 3 ... 10 list iList; generate_n(inserter(iList, iList.begin()), 10, iotaGen(1)); // find the location of the seven list::iterator & middle = find(iList.begin(), iList.end(), 7); // now rotate around that location rotate(iList.begin(), middle, iList.end()); // rotate again around the same location list cList; rotate_copy(iList.begin(), middle, iList.end(), inserter(cList, cList.begin())); } ¿¹Á¦ ÇÁ·Î±×·¥Àº ¸ÕÀú 1ºÎÅÍ 10±îÁöÀÇ Á¤¼ö¸¦ ´ãÀº list¸¦ »ý¼ºÇÏ°í, find() ¾Ë°í¸®µë(13.3.1Àý)À» »ç¿ëÇÏ¿© ¿ø¼Ò 7ÀÇ À§Ä¡¸¦ ã´Â´Ù. ÀÌ°á°ú¸¦ ¼øȯÀÇ Áß°£Á¡À¸·Î »ç¿ëÇÑ´Ù. rotate()ÀÇ µÎ¹ø° ÇüÅ´ ¿ø·¡ ½ÃÄö½º³»¿¡¼­ µ¹¸®Áö ¾Ê°í, ¿ø¼ÒµéÀ» »õ·Î¿î ½ÃÄö½º¿¡ º¹»çÇÏ´Â °ÍÀÌ´Ù. ÀÌ´Â À§ ¿¹Á¦ÇÁ·Î±×·¥¿¡¼­ ´Ù·ç°í Àִµ¥, Áß°£Á¡(À̹ø¿¡´Â 3À» °¡¸®Å°°í ÀÖ´Ù.)À» Áß½ÉÀ¸·Î ´Ù½ÃÇѹø ¼øȯ½ÃÅ°°í ÀÖ´Ù. °á°ú´Â 3 4 5 6 7 8 9 10 1 2°¡ µÈ´Ù. iList¿¡ ´ã±ä °ªµéÀº ÀüÇô º¯ÇÏÁö ¾Ê´Â´Ù. 13.4.4 ½ÃÄö½º µÑ·Î ÂÉ°³±â ºÐÇÒ(partition)Àº ÁÖ¾îÁø Á¶°ÇÀ» ¸¸Á·ÇÏ´Â ¸ðµç ¿ø¼ÒµéÀ» ½ÃÄö½ºÀÇ ÇÑÂʳ¡À¸·Î ¿Å±â´Â °ÍÀÌ´Ù. ¿ø¼Ò¸¦ ºÐÇÒÇÏ´Â °ÍÀº qucksort¿Í °°Àº Á¤·Ä ¾Ë°í¸®µë¿¡¼­´Â ±âº»ÀûÀÎ ´Ü°èÀÌ´Ù. BidirectionalIterator partition (BidirectionalIterator, BidirectionalIterator, Predicate); BidirectionalIterator stable_partition (BidirectionalIterator, BidirectionalIterator, Predicate); Ç¥ÁضóÀ̺귯¸®°¡ Áö¿øÇÏ´Â ºÐÇÒÀÇ ÇüÅ¿¡´Â µÎ°¡Áö°¡ ÀÖ´Ù. ù¹ø°´Â partition()ÀÌ Á¦°øÇÏ´Â °ÍÀ¸·Î ¿ø¼ÒµéÀ» µÎºÎºÐÀ¸·Î ³ª´©´Â °Í¿¡¸¸ Ã¥ÀÓÀ» Áø´Ù. °á°ú°ªÀ¸·Î µÎ ±×·ì»çÀÌÀÇ ¸¶Áö¸·(?) Áß°£Á¡À» ³ªÅ¸³»´Â ¹Ýº¹ÀÚ¸¦ ¸®ÅÏÇÑ´Ù. ÀÌ Áß°£Á¡Àº ù¹ø° ±×·ìÀÇ ³¡À» Çϳª Áö³­ °÷ÀÌ´Ù. [Image] Partitions ¿¹Á¦ ÇÁ·Î±×·¥¿¡¼­ vector´Â óÀ½¿¡ 1ºÎÅÍ 10±îÁöÀÇ °ªÀ» ¼ø¼­´ë·Î ´ã°í ÀÖ´Ù. ºÐÇÒÀ» ¼öÇàÇÏ¿©, ¦¼ö ¿ø¼ÒµéÀ» ¾ÕÂÊÀ¸·Î, Ȧ¼ö ¿ø¼ÒµéÀ» µÚÂÊÀ¸·Î ¿Å±â°Ô µÈ´Ù. vector´Â 10 2 8 4 6 5 7 3 9 1 À» °¡Áö°Ô µÇ°í, °á°ú°ªÀ¸·Î Áß°£Á¡(¿ø¼Ò 5)À» °¡¸®Å°´Â ¹Ýº¹ÀÚ¸¦ ¹ÝȯÇÑ´Ù. void partition_example() // illustrate the use of the partition algorithm { // first make the vector 1 2 3 ... 10 vector numbers(10); generate(numbers.begin(), numbers.end(), iotaGen(1)); // now put the even values low, odd high vector::iterator result = partition(numbers.begin(), numbers.end(), isEven); cout << "middle location " << result - numbers.begin() << endl; // now do a stable partition generate (numbers.begin(), numbers.end(), iotaGen(1)); stable_partition (numbers.begin(), numbers.end(), isEven); } ºÐÇÒ·Î ³ª´©¾îÁø °¢ ¿µ¿ª¿¡ ¼ÓÇÏ´Â ¿ø¼ÒµéÀÇ »ó´ëÀûÀÎ ¼ø¼­°¡ ºÐÇÒ ÀÌÀüÀÇ ¼ø¼­¿Í ´Ù¸¦ ¼öµµ ÀÖ´Ù. ¿¹¸¦ µé¾î, ºÐÇÒ ÀÌÀü¿¡ 4°¡ 8¾Õ¿¡ ÀÖ¾úÁö¸¸, ºÐÇÒ ÀÌÈÄ¿¡´Â 8ÀÌ ¾ÕÀ¸·Î ¿Ã ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. ºÐÇÒÀÇ µÎ¹ø° ÇüÅ´ stable_partition()¿¡ ÀÇÇØ Á¦°øµÇ´Âµ¥ ÀÌ ¾Ë°í¸®µëÀº ºÐÇÒ ÀÌÈÄ¿¡µµ ºÐÇÒ ÀÌÀüÀÇ ¼ø¼­µéÀ» ±×´ë·Î À¯ÁöÇÑ´Ù. ¿¹¸¦ µé¾î, À§ ¿¹¿¡¼­´Â 2 4 6 8 10 1 3 5 7 9 °¡ µÈ´Ù. stable_partition()Àº partition() ¾Ë°í¸®µëº¸´Ù Á¶±Ý ´À¸®¸ç, ´õ ¸¹ÀÀ ¸Þ¸ð¸®¸¦ ÇÊ¿ä·Î ÇÑ´Ù. µû¶ó¼­, ¿ø¼ÒµéÀÇ ¼ø¼­°¡ º° »ó°üÀÌ ¾ø´Ù¸é, partition()À» »ç¿ëÇØ¾ß ÇÑ´Ù. 13.4.5 ½ÃÄö½º³»¿¡ ¼ø¿­ »ý¼ºÇϱâ [Image] Ordering Permutations ¼ø¿­(permutation)Àº °ªµéÀÇ Àç¹èÄ¡ÀÌ´Ù. ¼­·Î ºñ±³°¡ °¡´ÉÇÑ °ªµéÀ̶ó¸é(Á¤¼ö, ¹®ÀÚ, ´Ü¾î µîµî), ½ÃÄö½ºÀÇ ¼ø¿­À» ¸ðµÎ ¸¸µé¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, °ªÀÌ 2°³¸é 2°³ÀÇ ¼ø¿­À», 3°³¸é 6°³¸¦, 4°³¸é 24°³ÀÇ ¼ø¿­À» ¸¸µé ¼ö ÀÖ°Ô µÈ´Ù. ¼ø¿­À» ¸¸µé¾î³»´Â ¾Ë°í¸®µëÀº ´ÙÀ½ ÇÁ·ÎÅäŸÀÔÀ» °¡Áø´Ù. bool next_permutation (BidirectionalIterator first, BidirectionalIterator last, [ Compare ] ); bool prev_permutation (BidirectionalIterator first, BidirectionalIterator last, [ Compare ] ); ¿¹Á¦ ÇÁ·Î±×·¥¿¡¼­ÀÇ µÎ¹ø° ¿¹´Â Á¤¼ö ´ë½Å¿¡ ¹®ÀÚ ¹è¿­ÀÇ Æ÷ÀÎÅ͸¦ »ç¿ëÇÑ °Í¸¸ ´Ù¸¦»Ó, ¼³¸íÇÏ°íÀÚ ÇÏ´Â ³»¿ëÀº °°´Ù. ´Ü ÀÌ °æ¿ì¿¡´Â ºñ±³ÇÔ¼ö·Î ´Ù¸¥ °ÍÀ» »ç¿ëÇØ¾ß ÇÑ´Ù. µðÆúÆ® ºñ±³ ¿¬»êÀÚ´Â Æ÷ÀÎÅÍ ÁÖ¼Ò ÀÚü¸¦ ºñ±³Çϱ⠶§¹®ÀÌ´Ù. bool nameCompare (char * a, char * b) { return strcmp(a, b) <= 0; } void permutation_example () // illustrate the use of the next_permutation algorithm { // example 1, permute the values 1 2 3 int start [] = { 1, 2, 3}; do copy (start, start + 3, ostream_iterator (cout, " ")), cout << endl; while (next_permutation(start, start + 3)); // example 2, permute words char * words = {"Alpha", "Beta", "Gamma"}; do copy (words, words + 3, ostream_iterator (cout, " ")), cout << endl; while (next_permutation(words, words + 3, nameCompare)); // example 3, permute characters backwards char * word = "bela"; do cout << word << ' '; while (prev_permutation (word, &word[4])); cout << endl; } ¿¡Á¦ ÇÁ·Î±×·¥ÀÇ 3¹ø ¿¹´Â ¿ª ¼ø¿­ ¾Ë°í¸®µëÀ» ¼³¸íÇÏ°í Àִµ¥, ÀÌ´Â ¼ø¿­À» °Å²Ù·Î »ý¼ºÇÑ´Ù. ÀÌ ¿¹Á¦¿¡¼­´Â ¼ø¿­ÀÇ Áß°£¿¡¼­ ½ÃÀÛÇϴµ¥, "bela"ÀÇ ³ª¸ÓÁö ¼ø¿­µéÀº beal, bale, bael, aleb, albe, aelb, aebl, able, abelÀÌ´Ù. 13.4.6 µÎ°³ÀÇ ÀÌ¿ôÇÏ´Â ½ÃÄö½º¸¦ Çϳª·Î ÇÕÄ¡±â º´ÇÕ(merge)Àº µÎ°³ÀÇ ordered ½ÃÄö½º¸¦ ÇϳªÀÇ ordered ½ÃÄö½º·Î ÇÕÄ¡°í, ÇÊ¿äÇÏ´Ù¸é ¿ø¼ÒµéÀ» ³¢¿ö³Ö¾î »õ·Î¿î list¸¦ ¸¸µé¾î ³½´Ù. inplace_merge() ¾Ë°í¸®µëÀº ½ÃÄö½º°¡ ÀÌ¿ôÇÏ´Â µÎºÎºÐÀ¸·Î ³ª´²Á®ÀÖ¾î¾ß ÇÏ°í, °¢°¢Àº Á¤·ÄµÇ¾î ÀÖ¾î¾ß ÇÑ´Ù. º´ÇÕÀ» ÅëÇØ µÎºÎºÐÀ» Çϳª·Î ÇÕÄ¡°í, ÇÊ¿äÇÏ´Ù¸é ¿ø¼ÒµéÀ» À̵¿½ÃŲ´Ù.(merge() ¾Ë°í¸®µëÀº º°µµÀÇ µÎ ½ÃÄö½º¸¦ Çϳª·Î ÇÕÄ¥¶§ »ç¿ëÇÑ´Ù) inplace_merge()¿¡ ´ëÇÑ ÀÎÀÚµéÀº ¾ç¹æÇ⠹ݺ¹ÀÚÀ̾î¾ß ÇÑ´Ù. void inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last [, BinaryFunction ] ); ¿¹Á¦ ÇÁ·Î±×·¥Àº vector, list¿¡ ´ëÇØ inplace_merge() ¾Ë°í¸®µëÀ» »ç¿ëÇÏ´Â ¿¹¸¦ º¸ÀÌ°í ÀÖ´Ù. vector´Â 0 2 4 6 8 1 3 5 7 9ÀÇ ½ÃÄö½º¸¦ °¡Áö°í ÀÖ´Ù. find()(13.3.1Àý)À» È£ÃâÇÏ¿© Ȧ¼ö°¡ ½ÃÀÛÇÏ´Â À§Ä¡¸¦ ã´Â´Ù. inplace_merge()¸¦ »ç¿ëÇÏ¿© µÎ°³ÀÇ ½ÃÄö½º¸¦ Çϳª·Î ÇÕÄ£´Ù. void inplace_merge_example() // illustrate the use of the inplace_merge algorithm { // first generate the sequence 0 2 4 6 8 1 3 5 7 9 vector numbers(10); for (int i = 0; i < 10; i++) numbers[i] = i < 5 ? 2 * i : 2 * (i - 5) + 1; // then find the middle location vector::iterator midvec = find(numbers.begin(), numbers.end(), 1); // copy them into a list list numList; copy(numbers.begin(), numbers.end(), inserter (numList, numList.begin())); list::iterator midList = find(numList.begin(), numList.end, 1); // now merge the lists into one inplace_merge(numbers.begin(), midvec, numbers.end()); inplace_merge(numList.begin(), midList, numList.end()); } 13.4.7 ½ÃÄö½º³»ÀÇ ¿ø¼ÒµéÀ» ÀÓÀÇ·Î Àç¹èÄ¡Çϱâ random_shuffle() ¾Ë°í¸®µëÀº ½ÃÄö½º³»ÀÇ ¿ø¼ÒµéÀ» ÀÓÀÇ·Î Àç¹èÄ¡ÇÑ´Ù. Á¤È®È÷ n¹øÀÇ ±³Ã¼°¡ ¼öÇàµÇ¸ç, ¿©±â¼­ n¹øÀº ½ÃÄö½º°¡ ´ã°í ÀÖ´Â ¿ø¼ÒÀÇ °¹¼ö¸¦ ³ªÅ¸³½´Ù. ¹°·Ð, °á°ú´Â ¿¹ÃøÇÒ ¼ö ¾ø´Ù. ÀÎÀÚµéÀº ÀÓÀÇ Á¢±Ù ¹Ýº¹ÀÚµéÀ̾î¾ß ÇϹǷÎ, ÀÌ ¾Ë°í¸®µëÀº vector, deque ¶Ç´Â ÀÏ¹Ý Æ÷ÀÎÅ͵éÇÏ°í¸¸ »ç¿ëÀÌ °¡´ÉÇÏ´Ù. list, set, map°ú´Â ÇÔ²² »ç¿ëÇÒ ¼ö ¾ø´Ù. void random_shuffle (RandomAccessIterator first, RandomAccessIterator last [, Generator ] ); ÀÌ ¾Ë°í¸®µëÀÇ ´Ù¸¥ ¹öÀüÀº ¼¼¹ø° ÀÎÀÚ¸¦ Ãß°¡·Î Á¦°øÇϸç, »ý·«ÀÌ °¡´ÉÇÏ´Ù. ÀÌ °ªÀº ¹Ýµå½Ã ³­¼ö ¹ß»ý±âÀ̾î¾ß ÇÑ´Ù. ÀÌ ¹ß»ý±â´Â ÀÎÀÚ·Î ¾ç¼ö mÀ» ÃëÇÏ°í, 0°ú m-1 »çÀÌÀÇ °ªÀ» ¹ÝȯÇÑ´Ù. generate() ¾Ë°í¸®µë¿¡¼­Ã³·³, ÀÌ ³­¼ö ÇÔ¼ö´Â ÇÔ¼ö È£Ãâ ¿¬»êÀÚ¸¦ °¡Áö´Â ÀÓÀÇÀÇ °´Ã¼ÀÌ¸é µÈ´Ù. void random_shuffle_example () // illustrate the use of the random_shuffle algorithm { // first make the vector containing 1 2 3 ... 10 vector numbers; generate(numbers.begin(), numbers.end(), iotaGen(1)); // then randomly shuffle the elements random_shuffle (numbers.begin(), numbers.end()); // do it again, with explicit random number generator struct RandomInteger { { operator()(int m) { return rand() % m; } } random; random_shuffle (numbers.begin(), numbers.end(), random); } 13.5 »èÁ¦ ¾Ë°í¸®µë [Image] What is a Name? ´ÙÀ½ µÎ ¾Ë°í¸®µëÀº óÀ½ º¸°Ô µÇ¸é ´Ù¼Ò È¥¶õ½º·¯¿ï °ÍÀÌ´Ù. µÑ´Ù ½ÃÄö½º¿¡¼­ ƯÁ¤ °ªµéÀ» Á¦°ÅÇØ¾ß ÇÑ´Ù. ÇÏÁö¸¸, ½ÇÁ¦·Î ÀÌµé ¾Ë°í¸®µëÀº ½ÃÄö½ºÀÇ »çÀÌÁ °¨¼Ò½ÃÅ°Áö ¾Ê´Â´Ù. ÀÌ µÎ ¾Ë°í¸®µëÀº »èÁ¦´ë»óÀÌ ¾Æ´Ñ °ªµéÀ» ½ÃÄö½ºÀÇ ¾ÕÂÊÀ¸·Î ¸ô°í, ÀÌ °ªµéÀÇ ³¡À» °¡¸®Å°´Â ¹Ýº¹ÀÚ¸¦ ¸®ÅÏÇÑ´Ù. ÀÌ ¹Ýº¹ÀÚÀÇ µÞºÎºÐ¿¡ ÀÖ´Â °ªµéÀº ¿ø·¡ ½ÃÄö½º¿¡ ÀÖ´ø °ªµéÀÌ°í ¾Æ¹«·± º¯°æµµ °¡ÇØÁöÁö ¾ÊÀº °ÍµéÀÌ´Ù. generic ¾Ë°í¸®µëÀº ÀÚ½ÅÀÌ ¾î¶² ÄÁÅ×À̳ʿ¡ ´ëÇØ ÀÛ¾÷À» ÇÏ´ÂÁö¸¦ ¾ËÁö ¸øÇϱ⠶§¹®¿¡ ÀÌ·¯ÇÑ ÀϵéÀÌ ÇÊ¿äÇÏ´Ù. ¾Ë°í¸®µëÀº ¿ÀÁ÷ generic ¹Ýº¹ÀÚ¸¸À» °¡Áö°í ÀÖÀ» »ÓÀÌ´Ù. ÀÌ´Â generic ¾Ë°í¸®µëÀ» »ç¿ëÇÒ ¶§ °¨¼öÇØ¾ß ÇÒ ºÎºÐÀÌ´Ù. ´ëºÎºÐÀÇ °æ¿ì »ç¿ëÀÚ´Â ¸®ÅÏ°ªÀ¸·Î ¾òÀº ¹Ýº¹ÀÚ¸¦ ÇØ´ç ÄÁÅ×À̳ÊÀÇ erase() ¸â¹öÇÔ¼öÀÇ ÀÎÀÚ·Î »ç¿ëÇÏ¿© ¹Ýº¹ÀÚ°¡ °¡¸®Å°´Â °ªºÎÅÍ ½ÃÄö½ºÀÇ ³¡±îÁö ¸ðµÎ »èÁ¦ÇÑ´Ù. °£´ÜÇÑ ¿¹¸¦ ÅëÇØ ¼³¸íÇØ º¸ÀÚ. 1 2 3 4 5 6 7 8 9 10¿Í °°ÀÌ ½ÃÄö½º¿¡¼­ ¦¼öµéÀ» »èÁ¦ÇÑ´Ù°í ÇÏÀÚ. remove_if() ¾Ë°í¸®µëÀ» ¼öÇàÇÏ°í ³ª¸é ½ÃÄö½º´Â ´ÙÀ½°ú °°ÀÌ µÈ´Ù. 1 3 5 7 9 | 6 7 8 9 10 Áß°£¿¡ Ç¥½ÃµÈ ¸·´ë±â´Â remove_if() ¾Ë°í¸®µëÀÌ ¸®ÅÏÇÏ´Â ¹Ýº¹ÀÚÀÇ À§Ä¡ÀÌ´Ù. ¸·´ë±â ¾ÕÂÊ¿¡ ÀÖ´Â 5°³ÀÇ ¿ø¼Ò´Â ¿ì¸®°¡ ¿øÇÏ´Â °á°úÀÌ°í, ¸·´ë±â µÚÂÊ¿¡ ÀÖ´Â 5°³ÀÇ ¿ø¼Ò´Â ±×³É ¿ø·¡ ½ÃÄö½º¿¡¼­ µ¿ÀÏÇÑ À§Ä¡¿¡ ÀÖ´ø °ªµéÀÌ´Ù. ÀÌ ¹Ýº¹ÀÚ¿Í end-of-sequence ¹Ýº¹ÀÚ¸¦ erase()ÀÇ ÀÎÀÚ·Î ³Ñ°ÜÁ־, ÇÊ¿ä¾ø´Â °ªµéÀ» »èÁ¦ÇÏ°í ¿øÇÏ´Â °á°ú¸¦ ¾òÀ» ¼ö ÀÖ°Ô µÈ´Ù. Áö±Ý ¼³¸íÇÑ ¾Ë°í¸®µëµéÀº µÑ´Ù º¹»ç ¹öÀüÀ» µû·Î °¡Áö°í ÀÖ´Ù. ÀÌµé ¾Ë°í¸®µëÀÇ º¹»ç¹öÀüÀº ¿ø·¡ ½ÃÄö½º´Â ±×´ë·Î ³öµÎ°í, »èÁ¦ÇÏ°í ³²°Ô µÇ´Â °ªµéÀ» ´Ù¸¥ ½ÃÄö½º·Î Ãâ·ÂÇÑ´Ù. 13.5.1 ÇÊ¿ä¾ø´Â ¿ø¼Ò »èÁ¦Çϱâ remove() ¾Ë°í¸®µëÀº ½ÃÄö½º·ÎºÎÅÍ ÇÊ¿ä¾ø´Â °ªµéÀ» »èÁ¦ÇÑ´Ù. find() ¾Ë°í¸®µë°ú °°ÀÌ ÀÌ ¾Ë°í¸®µëµµ ƯÁ¤ °ªÀ» ¸í½ÃÇϰųª, Á¶°ÇÀ» ¸í½ÃÇÒ ¼ö ÀÖ´Ù. ÇÁ·ÎÅäŸÀÔÀº ´ÙÀ½°ú °°´Ù. ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T &); ForwardIterator remove_if (ForwardIterator first, ForwardIterator last, Predicate); remove() ¾Ë°í¸®µëÀº »èÁ¦´ë»ó¿¡¼­ Á¦¿ÜµÇ´Â °ªµéÀ» ½ÃÄö½ºÀÇ ¾ÕÂÊÀ¸·Î À̵¿½ÃÅ°¸ç, À̶§ ÀÌ¹Ì ¾ÕÂÊ¿¡ ÀÖ´ø ¿ø¼ÒµéÀ» µ¤¾î¾²°Ô µÈ´Ù. »èÁ¦µÇÁö ¾Ê´Â ¿ø¼ÒµéÀº »ó´ëÀûÀÎ ¼ø¼­¸¦ ±×´ë·Î À¯ÁöÇÑ´Ù. ÀÏ´Ü ¸ðµç ¿ø¼ÒµéÀ» Çѹø ÈÈ°í ³ª¸é, ½ÃÄö½ºÀÇ ³ª¸ÓÁö ºÎºÐÀº ÀüÇô º¯°æµÇÁö ¾Ê´Â´Ù. ¾Ë°í¸®µëÀÇ °á°ú·Î ¸®ÅϵǴ ¹Ýº¹ÀÚ´Â »õ ½ÃÄö½ºÀÇ ³¡À» °¡¸®Å²´Ù. ¿¹¸¦ µé¾î, ½ÃÄö½º 1 2 4 3 2 ·ÎºÎÅÍ ¿ø¼Ò 2¸¦ »èÁ¦Çϸé, ½ÃÄö½º 1 4 3 3 2 °¡ µÇ°í, °á°ú·Î ¸®ÅϵǴ ¹Ýº¹ÀÚ´Â µÎ¹ø° 3À» °¡¸®Å°°Ô µÈ´Ù. ÀÌ ¹Ýº¹ÀÚ¸¦ erase() ¸â¹ö ÇÔ¼öÀÇ ÀÎÀÚ·Î »ç¿ëÇÏ¿© ³ª¸ÓÁö °ª(3°ú 2)µéÀ» »èÁ¦ÇÏ°Ô µÈ´Ù. ¾Ë°í¸®µëÀÇ º¹»ç ¹öÀüÀº °ªµéÀ» Ãâ·Â ½ÃÄö½º·Î º¹»çÇϸç, ¿ø·¡ ½ÃÄö½º´Â ÀüÇô ¼ÕÀ» ´ëÁö ¾Ê´Â´Ù. OutputIterator remove_copy (InputIterator first, InputIterator last, OutputIterator result, const T &); OutputIterator remove_copy_if (InputIterator first, InputIterator last, OutputIterator result, Predicate); remove()ÀÇ »ç¿ëÀº ´ÙÀ½ ÇÁ·Î±×·¥¿¡¼­ º¼ ¼ö ÀÖ´Ù. void remove_example () // illustrate the use of the remove algorithm { // create a list of numbers int data[] = {1, 2, 4, 3, 1, 4, 2}; list aList; copy (data, data+7, inserter(aList, aList.begin())); // remove 2's, copy into new list list newList; remove_copy (aList.begin(), aList.end(), back_inserter(newList), 2); // remove 2's in place list::iterator where; where = remove (aList.begin(), aList.end(), 2); aList.erase(where, aList.end()); // remove all even values where = remove_if (aList.begin(), aList.end(), isEven); aList.erase(where, aList.end()); } 13.5.2 ºñ½ÁÇÑ °ªµéÀÇ ·±(run) »èÁ¦Çϱâ unique() ¾Ë°í¸®µëÀº ¼±Çü ½ÃÄö½º¸¦ ÈȾ¸é¼­, ¿¬¼ÓÀûÀ¸·Î °°Àº ¿ø¼ÒµéÀÌ ³ªÅ¸³ª´Â ±×·ìÀ» ¹ß°ßÇϸé ù¹ø° ¿ø¼Ò¸¸ ³²°ÜµÎ°í ³ª¸ÓÁö ¿ø¼ÒµéÀ» ¸ðµÎ »èÁ¦ÇÑ´Ù. ½ÃÄö½º´Â ¼ø¹æÇ⠹ݺ¹ÀÚ¸¦ »ç¿ëÇÏ¿© ÀÎÀÚ·Î ³Ñ°ÜÁØ´Ù. ForwardIterator unique (ForwardIterator first, ForwardIterator last [, BinaryPredicate ] ); ¾Ë°í¸®µëÀº ÄÝ·º¼ÇÀ» ÈȾ¸é¼­, ¿¬»ê °á°ú¸¦ ½ÃÄö½ºÀÇ ¾ÕÂÊÀ¸·Î ¿Å±â°í, ÀÌ¹Ì ¾ÕÂÊ¿¡ ÀÖ´ø ¿ø¼ÒµéÀº µ¤¾î¾²°Ô µÈ´Ù. ÀÏ´Ü ÀÛ¾÷ÀÌ ³¡³ª°Ô µÇ¸é, ½ÃÄö½ºÀÇ ³ª¸ÓÁö ¿ø¼ÒµéÀº °Çµå¸®Áö ¾Ê°í ±×³É ³»¹ö·Á µÎ°Ô µÈ´Ù. ¿¹¸¦ µé¾î, 1 3 3 2 2 2 4¿Í °°ÀÌ ±¸¼ºµÈ ½ÃÄö½º´Â 1 3 2 4 | 2 2 4 ·Î ¹Ù²î°Ô µÈ´Ù. ¸·´ë±â´Â °á°ú°ªÀ¸·Î ¸®ÅϵǴ ¹Ýº¹ÀÚÀÇ À§Ä¡¸¦ ³ªÅ¸³»¸ç, Áߺ¹ÀÌ Á¦°ÅµÈ ½ÃÄö½ºÀÇ ³¡ÀÌÀÚ ¿À¸¥ÂÊ¿¡ ³²°ÜÁø ¿ø¼ÒµéÀÇ ½ÃÀÛÀ» °¡¸®Å²´Ù. ´ëºÎºÐÀÇ ÄÁÅ×À̳ʿ¡¼­Ã³·³ ¾Ë°í¸®µëÀÌ ¸®ÅÏÇÏ´Â °ªÀº µÚµû¶ó ¿À´Â ¿¬»êÀÇ ÀÎÀÚ·Î »ç¿ëµÇ´Âµ¥, erase() ¸â¹ö ÇÔ¼öÀÇ ÀÎÀÚ·Î »ç¿ëÇÏ¿© ÇÊ¿ä¾ø´Â ¿ø¼ÒµéÀ» »èÁ¦ÇÏ°Ô µÈ´Ù. ÀÌ´Â ¿¹Á¦ ÇÁ·Î±×·¥¿¡¼­ Àß ³ªÅ¸³ª ÀÖ´Ù. ¾Ë°í¸®µëÀÇ º¹»ç ¹öÀüÀº Áߺ¹ÀÌ Á¦°ÅµÈ ¿ø¼ÒµéÀ» Ãâ·Â ¹Ýº¹ÀÚ·Î ¿Å±â°í, ¿ø·¡ ½ÃÄö½º´Â ÀüÇô °Çµå¸®Áö ¾Ê´Â´Ù. list³ª multisetÀ» º¯È¯ÇÒ ¶§´Â »ðÀÔ ¿¬»êÀÚ¸¦ »ç¿ëÇÏ¿©, Ãâ·Â ¹Ýº¹ÀÚÀÇ º¹»ç ¿¬»êÀ» »ðÀÔ ¿¬»êÀ¸·Î ¹Ù²Ü ¼ö ÀÖ´Ù. OutputIterator unique_copy (InputIterator first, InputIterator last, OutputIterator result [, BinaryPredicate ] ); À̵éÀº ´ÙÀ½ ¿¹Á¦ ÇÁ·Î±×·¥¿¡¼­ »ìÆì º¼ ¼ö ÀÖ´Ù. void unique_example() // illustrate use of the unique algorithm { // first make a list of values int data[] = {1, 3, 3, 2, 2, 4}; list aList; set aSet; copy (data, data+6, inserter(aList, aList.begin())); // copy unique elements into a set unique_copy (aList.begin(), aList.end(), inserter(aSet, aSet.begin())); // copy unique elements in place list::iterator where; where = unique(aList.begin(), aList.end()); // remove trailing values aList.erase(where, aList.end()); } 13.6 Scalar-Producing Algorithms À̹ø¿¡ ¼³¸íÇÒ ¾Ë°í¸®µëÀº Àüü ½ÃÄö½º·ÎºÎÅÍ ÇϳªÀÇ ½ºÄ®¶ó °ªÀ» ¾ò¾î³»´Â ¾Ë°í¸®µëµéÀÌ´Ù. ¿©±â¼­ accumulate()¿Í inner_product() ¾Ë°í¸®µëÀº ´Ù¸¥ ¾Ë°í¸®µëó·³ algorithm Çì´õ È­ÀÏ¿¡ Æ÷ÇԵǾî ÀÖÁö ¾Ê°í, numeric Çì´õ È­ÀÏ¿¡ Æ÷ÇԵǾî ÀÖ´Ù´Â °ÍÀ» ±â¾ïÇϱ⠹ٶõ´Ù. 13.6.1 Á¶°ÇÀ» ¸¸Á·ÇÏ´Â ¿ø¼ÒÀÇ °¹¼ö ¼¼±â count()¿Í count_if() ¾Ë°í¸®µëÀº °¢°¢ ÁÖ¾îÁø °ª ¶Ç´Â ÁÖ¾îÁø Á¶°ÇÀ» ¸¸Á·ÇÏ´Â ¿ø¼ÒÀÇ °¹¼ö¸¦ ¾Ë¾Æ³»´Âµ¥ »ç¿ëÇÑ´Ù. °¢°¢ÀÇ ¾Ë°í¸®µëÀº µÎ°¡Áö ÇüÅ°¡ Àִµ¥, Çϳª´Â ÀÏÄ¡µÇ´Â ¿ø¼Ò¸¦ ¸®ÅÏ°ªÀ¸·Î ¹ÝȯÇÏ°í, ´Ù¸¥ Çϳª´Â Ä«¿îÆ® º¯¼ö(´ëºÎºÐ Á¤¼ö)¿¡ ´ëÇÑ ·¹ÆÛ·±½º¸¦ ÀÎÀÚ·Î ¹Þ¾Æ¼­, ÀÌ º¯¼öÀÇ °ªÀ» Áõ°¡½ÃŲ´Ù(ÀÌ °æ¿ì¿¡´Â °ªÀ» ¸®ÅÏÇÏÁö ¾Ê´Â´Ù). (ÈÄÀÚÀÇ °æ¿ì Ãֱ٠ǥÁØ¿¡ ³²¾Æ ÀÖ´ÂÁö¸¦ È®ÀÎÇÒ °Í!) ÀüÀÚÀÇ °æ¿ì´Â Ãֱ٠ǥÁØ¿¡¼­ äÅõǾú°í, ÈÄÀÚ´Â ¿¹Àü¿¡ »ç¿ëµÇ´ø °ÍÀ¸·Î µÎ°¡Áö ÀÌÀ¯¶§¹®¿¡ ¾ÆÁ÷µµ ³²¾ÆÀÖ°Ô µÇ¾ú´Ù. ù° ÀÌÀ¯´Â backward compatibility ¶§¹®ÀÌ°í, µÎ¹ø° ÀÌÀ¯´Â ÀüÀÚ¿¡ ÇØ´çÇÏ´Â ¾Ë°í¸®µëÀÌ partial specializationÀ» ÇÊ¿ä·Î Çϴµ¥, ¾ÆÁ÷Àº À̸¦ Áö¿øÇÏ´Â ÄÄÆÄÀÏ·¯°¡ °ÅÀÇ ¾ø±â ¶§¹®ÀÌ´Ù. iterator_traits::distance_type count (InputIterator first, InputIterator last, const T& value); iterator_traits::distance_type count_if (InputIterator first, InputIterator last, Predicate pred); void count (InputIterator first, InputIterator last, const T&, Size &); void count_if (InputIterator first, InputIterator last, Predicate, Size &); (ÈÄÀÚÀÇ °æ¿ì Ç¥ÁØ¿¡¼­ äÅõǾú´ÂÁö È®ÀÎÇÒ °Í!) [Image] The Resulting Count ´ÙÀ½ ¿¹Á¦ ÇÁ·Î±×·¥Àº ¿¹ÀüÀÇ count() ¾Ë°í¸®µëÀ» »ç¿ëÇÑ ¿¹ÀÌ´Ù. count()¸¦ È£ÃâÇÏ¿© ÁÖ¾îÁø ¹®ÀÚ¿­¿¡¼­ 'e'ÀÇ °¹¼ö¸¦ ¾Ë¾Æ³»°í, count_if()¸¦ È£ÃâÇÏ¿© ¸ðÀ½ÀÇ °¹¼ö¸¦ ¾Ë¾Æ³»°í ÀÖ´Ù. void count_example() // illustrate the use of the count algorithm { int eCount = 0; int vowelCount = 0; char *text = "Now is the time to begin"; count(text, text + strlen(text), 'e', eCount); count_if(text, text + strlen(text), isVowel, vowelCount); cout << "There are " << eCount << " letter e's " << endl << "and " << vowelCount << " vowels in the text:" << text << endl; } 13.6.2 ½ÃÄö½º¸¦ ÇϳªÀÇ °ªÀ¸·Î À¯ÃßÇϱâ accumulate() ¾Ë°í¸®µëÀÌ »ý¼ºÇÏ´Â °á°ú°ªÀº ½ÃÄö½ºÀÇ °¢ ¿ø¼Ò »çÀÌ¿¡ ÀÌÇ× ¿¬»êÀÚ¸¦ ³õ¾Æ ¾ò¾î³½ °ªÀÌ´Ù. µðÆúÆ® ¿¬»êÀÚ´Â µ¡¼À ¿¬»êÀÚ(+)ÀÌ°í, ÀÌ°ÍÀº ´Ù¸¥ ÀÌÇ× ÇÔ¼ö·Î ¹Ù²Ü ¼ö ÀÖ´Ù. ÃʱⰪ(Ç×µî¿ø)Àº ¹Ýµå½Ã Á¦°øÇØ¾ß ÇÑ´Ù. ÀÌ °ªÀº ºó ½ÃÄö½º¿¡ ¾Ë°í¸®µëÀ» Àû¿ëÇßÀ» ¶§ÀÇ ¸®ÅϵǴ °ª¿¡ ÇØ´çÇϸç, ù¹ø° °è»êÇÒ ¶§ÀÇ ¿ÞÂÊ ÀÎÀÚ·Î »ç¿ëµÈ´Ù. ContainerType accumulate (InputIterator first, InputIterator last, ContainerType initial [, BinaryFunction ] ); ¿¹Á¦ ÇÁ·Î±×·¥Àº accumulate()¸¦ »ç¿ëÇÏ¿© Á¤¼ö vector¿¡ ´ã±ä °ªµéÀÇ ÇÕ°ú °öÀ» »ý¼ºÇÑ´Ù. ÇÕÀÇ °æ¿ì¿¡´Â ÃʱⰪ(Ç×µî¿ø)À¸·Î 0À», µðÆúÆ® ¿¬»êÀÚ +¸¦ »ç¿ëÇÏ¸é µÇ°í, °öÀÇ °æ¿ì¿¡´Â ÃʱⰪ(Ç×µî¿ø)À¸·Î 1À», °ö¼Á ¿¬»êÀÚ(times)¸¦ 4¹ø° ÀÎÀÚ·Î º°µµ·Î ¸í½ÃÇÏ¸é µÈ´Ù. void accumulate_example () // illustrate the use of the accumulate algorithm { int numbers[] = {1, 2, 3, 4, 5}; // first example, simple accumulation int sum = accumulate (numbers, numbers + 5, 0); int product = accumulate (numbers, numbers + 5, 1, times()); cout << "The sum of the first five integers is " << sum << endl; cout << "The product is " << product << endl; // second example, with different types for initial value list nums; nums = accumulate (numbers, numbers+5, nums, intReplicate); } list& intReplicate (list& nums, int n) // add sequence n to 1 to end of list { while (n) nums.push_back(n--); return nums; } ÃʱⰪ(Ç×µî¿ø)À̳ª ÀÌÇ× ÇÔ¼öÀÇ ¸®ÅÏ°ªÀÌ ¹Ýµå½Ã ÄÁÅ×ÀÌ³Ê Å¸ÀÔ°ú ÀÏÄ¡ÇÒ ÇÊ¿ä´Â ¾ø´Ù. ÀÌ´Â À§ÀÇ 2¹ø ¿¹¿¡¼­ º¼ ¼ö ÀÖ´Ù. ¿©±â¼­ ÃʱⰪÀº °ø listÀÌ´Ù. ÀÌÇ× ÇÔ¼ö(À§ ¿¹Á¦ÀÇ ³¡¿¡ Á¤ÀǵǾî ÀÖÀ½)´Â list¿Í Á¤¼ö°ªÀ» ÀÎÀÚ·Î ÃëÇÏ°í, list¿¡ ¹Ýº¹ÀûÀ¸·Î °ªµéÀ» »ðÀÔÇÑ´Ù. »ðÀԵǴ °ªµéÀº ÀÎÀÚ·Î ÁÖ¾îÁø Á¤¼ö°ªºÎÅÍ 1±îÁöÀÇ °ªÀ» Æ÷ÇÔÇÏ´Â ½ÃÄö½ºÀÌ´Ù. ¿¹¸¦ µé¾î, 1 2 3 4 5¸¦ ÀÔ·ÂÀ¸·Î ¹ÞÀ¸¸é, 1 2 1 3 2 1 4 3 2 1 5 4 3 2 1 °¡ °á°ú list°¡ µÈ´Ù. 13.6.3 ÀϹÝÈ­µÈ ³»Àû n°³ÀÇ ¿ø¼Ò¸¦ °¡Áö´Â µÎ°³ÀÇ ½ÃÄö½º°¡ ÀÖ´Ù°í ÇÏ°í, °¢°¢ a1, a2, ..., an°ú b1, b2, ..., bnÀ̶ó°í ÇÏÀÚ. µÎ ½ÃÄö½ºÀÇ ³»ÀûÀº ´ëÀÀµÇ´Â ¿ø¼Ò³¢¸® °öÇؼ­ À̸¦ ´õÇÑ °ÍÀ¸·Î a1*b1 + a2*b2 + ... + an * bn À¸·Î °è»êµÈ´Ù. ³»ÀûÀº ¸¹Àº °úÇÐ °è»ê¿¡¼­ ³ªÅ¸³­´Ù. ¿¹¸¦ µé¾î, Çà°ú ¿­ÀÇ ³»ÀûÀº Çà·Ä°ö ¾Ë°í¸®µëÀÇ ÇÙ½É ¿¬»êÀÌ´Ù. ÀϹÝÈ­µÈ ³»ÀûÀº ±âº»ÀûÀ¸·Î °°Àº °è»ê°úÁ¤À» »ç¿ëÇÏÁö¸¸, ÇÕ°ú °ö ¿¬»êÀÚ¸¦ ´Ù¸¥ ÀÌÇ× ÇÔ¼ö·Î ¹Ù²Ü ¼ö ÀÖ´Ù. Ç¥ÁØ ¶óÀ̺귯¸®´Â ³»ÀûÀ» °è»êÇϱâ À§ÇØ ´ÙÀ½ ¾Ë°í¸®µëÀ» Á¦°øÇÑ´Ù. ContainerType inner_product (InputIterator first1, InputIterator last1, InputIterator first2, ContainerType initialValue [ , BinaryFunction add, BinaryFunction times ] ); inner_product() ¾Ë°í¸®µëÀÇ Ã³À½ 3°³ÀÇ ÀÎÀÚ´Â µÎ°³ÀÇ ÀÔ·Â ½ÃÄö½º¸¦ Á¤ÀÇÇÑ´Ù. µÎ¹ø° ½ÃÄö½º´Â ½ÃÀÛ ¹Ýº¹ÀÚ¸¸ ¸í½ÃÇÏ°í, Àû¾îµµ ù¹ø° ½ÃÄö½º¸¸Å­ÀÇ ¿ø¼Ò¸¦ °¡Áö°í ÀÖ¾î¾ß ÇÑ´Ù. ±× ´ÙÀ½ ÀÎÀÚ´Â ÇÕ ¿¬»êÀÚÀÇ ÃʱⰪ(Ç×µî¿ø)ÀÌ´Ù. ÀÌ°ÍÀº accumulate() ¾Ë°í¸®µë¿¡¼­ »ç¿ëÇÏ´Â Ç×µî¿ø°ú À¯»çÇÏ´Ù. ÀϹÝÈ­µÈ ³»Àû ÇÔ¼ö¿¡¼­´Â ¸¶Áö¸· µÎ°³ÀÇ ÀÎÀÚ´Â °¢°¢ µ¡¼Á ¿¬»êÀÚ¿Í °ö¼Á ¿¬»êÀÚ ´ë½Å¿¡ »ç¿ëÇÒ ÀÌÇ× ÇÔ¼ö°¡ µÈ´Ù. ¿¹Á¦ ÇÁ·Î±×·¥¿¡¼­ÀÇ µÎ¹ø° ¿¹´Â ÀÎÀÚ·Î ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â ¿¹¸¦ º¸ÀÌ°í ÀÖ´Ù. °ö¼À ¿¬»êÀ» »óµî °Ë»ç·Î ¹Ù²Ù°í, µ¡¼ÀÀº ³í¸®ÇÕ(or)·Î ¹Ù²Ù¾ú´Ù. µû¶ó¼­, °°Àº ½ÖÀÌ Çϳª¶óµµ ÀÖÀ¸¸é ÂüÀÌ°í, ±×·¸Áö ¾ÊÀ¸¸é °ÅÁþÀ» ¸®ÅÏÇÏ°Ô µÈ´Ù. or ´ë½Å¿¡ and¸¦ »ç¿ëÇÏ¸é ¸ðµç ½ÖÀÌ °°À» ¶§¸¸ ÂüÀ» ¸®ÅÏÇÏ°Ô µÇ¾î, ´ÙÀ½¿¡ ¼³¸íÇÒ equal() ¾Ë°í¸®µë°ú ¶È°°Àº È¿°ú¸¦ °¡Áö°Ô µÈ´Ù. void inner_product_example () // illustrate the use of the inner_product algorithm { int a[] = {4, 3, -2}; int b[] = {7, 3, 2}; // example 1, a simple inner product int in1 = inner_product(a, a+3, b, 0); cout << "Inner product is " << in1 << endl; // example 2, user defined operations bool anyequal = inner_product(a, a+3, b, true, logical_or(), equal_to()); cout << "any equal? " << anyequal << endl; } 13.6.4 ½Öº°·Î µÎ°³ÀÇ ½ÃÄö½º¸¦ ºñ±³Çϱâ equal() ¾Ë°í¸®µëÀº °¢ ½Öº°·Î µÎ ½ÃÄö½ºÀÇ »óµî¿©ºÎ¸¦ ÆǺ°Çϴµ¥ »ç¿ëÇÑ´Ù. ÀÌÇ× Á¶°ÇÀÚ¸¦ ¹Ù²ÞÀ¸·Î½á, µÎ ½ÃÄö½ºÀÇ »óµî ¿©ºÎ¸¦ ´Ù¾çÇÏ°Ô ÆǺ°ÇÒ ¼ö ÀÖ´Ù. ÀÎÀÚ´Â ´Ü¼øÈ÷ ÀÔ·Â ¹Ýº¹ÀÚÀÌ¸é µÈ´Ù. bool equal(InputIterator first, InputIterator last, InputIterator first2 [, BinaryPredicate] ); [Image] Equal and Mismatch equal()Àº ¾Ë°í¸®µëÀº µÎ¹ø° ½ÃÄö½º°¡ ù¹ø° ½ÃÄö½º¸¸Å­ÀÇ ¿ø¼Ò¸¦ °¡Áö°í ÀÖ´Ù°í °¡Á¤ÇÑ´Ù. °¢°¢ ´ëÀÀµÇ´Â °ªµé³¢¸® »óµî °Ë»ç¸¦ ÇÏ¿© ¸ðµÎ °°À» ¶§ ÂüÀ» ¸®ÅÏÇÑ´Ù. ÀÌ ¾Ë°í¸®µëÀº »óµî Å×½ºÆ® ´ë½Å¿¡ ´Ù¸¥ ÀÌÇ× ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ¸ðµç ½ÖÀÌ ÀÌÇ× ÇÔ¼ö¸¦ ÅëÇØ ÁÖ¾îÁø Á¶°ÇÀ» ¸¸Á·Çϸé ÂüÀ» ¸®ÅÏÇÑ´Ù. ¿¹Á¦ ÇÁ·Î±×·¥¿¡¼­´Â greater_equal() ÇÔ¼ö¸¦ »ç¿ëÇÏ°í ÀÖÀ¸¸ç, ù¹ø° ½ÃÄö½ºÀÇ °ªµéÀÌ µÎ¹ø° ½ÃÄö½º³»¿¡ ´ëÀÀµÇ´Â °ªº¸´Ù Ç×»ó Å©°Å³ª °°À» ¶§¸¸ ÂüÀ» ¸®ÅÏÇÏ°Ô µÈ´Ù. void equal_example () // illustrate the use of the equal algorithm { int a[] = {4, 5, 3}; int b[] = {4, 3, 3}; int c[] = {4, 5, 3}; cout << "a = b is: " << equal(a, a+3, b) << endl; cout << "a = c is: " << equal(a, a+3, c) << endl; cout << "a pair-wise greater-equal b is: " << equal(a, a+3, b, greater_equal()) << endl; } 13.6.5 »çÀü½Ä ºñ±³(lexical comparison) µÎ ½ÃÄö½ºÀÇ »çÀü½Ä ºñ±³ÀÇ ¾ÆÁÖ ÈçÇÑ ¿¹·Î µÎ°³ÀÇ ´Ü¾î¸¦ ºñ±³ÇÏ¿© »çÀü»ó¿¡ ³ªÅ¸³­ ¼øÀ¸·Î ¹èÄ¡ÇÏ´Â °ÍÀ» µé ¼ö ÀÖ´Ù. µÎ°³ÀÇ ´Ü¾î¸¦ ºñ±³ÇÒ ¶§´Â °¢ ½ÃÄö½ºÀÇ ¿ø¼Ò(Áï, ¹®ÀÚ)µéÀ» »ó´ë ½ÃÄö½º¿¡ ´ëÀÀµÇ´Â ¹®ÀÚ¿Í ºñ±³ÇÑ´Ù. µÎ¹®ÀÚ°¡ ÀÏÄ¡Çϸé, ¾Ë°í¸®µëÀº ´ÙÀ½ ¹®ÀÚ¸¦ »ìÇÇ°Ô µÇ°í, ÀÏÄ¡ÇÏÁö ¾ÊÀ¸¸é, ´õ ¾Õ¿¡ ÀÖ´Â ¹®ÀÚ¸¦ Æ÷ÇÔÇÏ´Â ´Ü¾î°¡ »çÀü»óÀ¸·Î ¾Õ¿¡ À§Ä¡ÇÏ°Ô µÈ´Ù. ¿¹¸¦ µé¾î, everybody´Â everything º¸´Ù ÀÛ°Ô µÇ´Âµ¥, ÀÌ´Â everybodyÀÇ b°¡ everythingÀÇ tº¸´Ù À۱⠶§¹®ÀÌ´Ù. µÑÁßÀÇ ÇÑ ½ÃÄö½º°¡ ´Ù¸¥ ½ÃÄö½ºº¸´Ù ¸ÕÀú ³¡³ª°Ô µÇ¸é ³¡³ª´Â ½ÃÄö½º°¡ ´Ù¸¥ ½ÃÄö½ºº¸´Ù ÀÛÀº°ÍÀ¸·Î °áÁ¤ÇÑ´Ù. ¿¹¸¦ µé¾î, every´Â everybody¿Í everything º¸´Ù ¾Õ¿¡ ÀÖ°Ô µÇ°í, eve µÚ¿¡ ¿À°Ô µÈ´Ù. ¸¶Áö¸·À¸·Î, µÎ ½ÃÄö½º°¡ µ¿½Ã¿¡ ³¡³ª°í ¸ðµç ¹®ÀÚµéÀÌ ¼­·Î °°À¸¸é, µÎ ´Ü¾î¸¦ °°Àº °ÍÀ¸·Î °áÁ¤ÇÑ´Ù. lexicographical_compare() ¾Ë°í¸®µëÀº ÀÌ°ÍÀ» ±¸ÇöÇÑ °ÍÀ¸·Î, ù¹ø° ½ÃÄö½º°¡ µÎ¹ø° ½ÃÄö½ºº¸´Ù ¼ø¼­»óÀ¸·Î ¾Õ¿¡ ÀÖÀ¸¸é Âü, ±×·¸Áö ¾ÊÀ¸¸é °ÅÁþÀ» ¸®ÅÏÇÑ´Ù. ÀÌ ¾Ë°í¸®µëÀº ¾î¶² ½ÃÄö½º¿¡¶óµµ Àû¿ëÇÒ ¼ö ÀÖÀ¸¸ç, array, string, vector, list ¶Ç´Â Ç¥ÁØ ¶óÀ̺귯¸®°¡¿¡¼­ »ç¿ëµÇ´Â ´Ù¸¥ µ¥ÀÌÅÍ ±¸Á¶¿¡µµ »ç¿ëÇÒ ¼ö ÀÖ´Ù. bool lexicographical_compare (InputIterator first1, InputIterator last1, InputIterator first2, InputIterator last2 [, BinaryFunction ] ); lexicographical_compare() ¾Ë°í¸®µëÀº µÎ°³ÀÇ ½ÃÄö½º¸¦ ÀÎÀÚ·Î ÃëÇÏ´Â ´ëºÎºÐÀÇ ´Ù¸¥ ¾Ë°í¸®µë°ú´Â ´Þ¸® µÎ ½ÃÄö½º¿¡ ´ëÇؼ­ ½ÃÀÛ ¹Ýº¹ÀÚ¿Í past-the-end ¹Ýº¹ÀÚ¸¦ ¸ðµÎ »ç¿ëÇÑ´Ù. »ý·« °¡´ÉÇÑ 5¹ø° ÀÎÀڷδ µÎ ½ÃÄö½ºÀÇ ¿ø¼Ò¸¦ ¼­·Î ºñ±³ÇÒ ¶§ »ç¿ëÇÏ´Â ÀÌÇ× ÇÔ¼ö¸¦ ÃëÇÑ´Ù. ¿¹Á¦ ÇÁ·Î±×·¥Àº ÀÌ ¾Ë°í¸®µëÀ» ¹®ÀÚ¿­°ú Á¤¼ö ¹è¿­¿¡ Àû¿ëÇÑ ¿¹¸¦ º¸ÀÌ°í ÀÖ´Ù. void lexicographical_compare_example() // illustrate the use of the lexicographical_compare algorithm { char *wordOne = "everything"; char *wordTwo = "everybody"; cout << "compare everybody to everything " << lexicographical_compare(wordTwo, wordTwo + strlen(wordTwo), wordOne, wordOne + strlen(wordOne)) << endl; int a[] = {3, 4, 5, 2}; int b[] = {3, 4, 5}; int c[] = {3, 5}; cout << "compare a to b:" << lexicographical_compare(a, a+4, b, b+3) << endl; cout << "compare a to c:" << lexicographical_compare(a, a+4, c, c+2) << endl; } 13.7 ½ÃÄö½º »ý¼º ¾Ë°í¸®µë ÀÌ Àý¿¡¼­ ¼³¸íÇÒ ¾Ë°í¸®µëÀº ¸ðµÎ º¯È¯À» ¼öÇàÇÏ¿© ÁÖ¾îÁø ½ÃÄö½º·ÎºÎÅÍ »õ·Î¿î ½ÃÄö½º¸¦ »ý¼ºÇϴµ¥ »ç¿ëµÇ´Â °ÍµéÀÌ´Ù. ´ëºÎºÐÀÇ °æ¿ì Ãâ·Â ½ÃÄö½º´Â Ãâ·Â ¹Ýº¹ÀÚ¸¦ ÅëÇØ °¡¸®Å°´Âµ¥, ÀÌ´Â ÀÌµé ¾Ë°í¸®µëÀ» »ç¿ëÇÏ¿© ÁÖ¾îÁø ½ÃÄö½º(¿¹, vector)¸¦ µ¤¾î ¾µ ¼öµµ ÀÖ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. ¶Ç´Â, »ðÀÔ ¿¬»êÀÚ(2.4Àý)¸¦ »ç¿ëÇÏ¿©, setÀ̳ª list¿Í °°Àº °¡º¯ ±æÀÌ ±¸Á¶¿¡ »õ ¿ø¼ÒµéÀ» »ðÀÔÇÏ´Â °Íµµ °¡´ÉÇÏ´Ù. ¸¶Áö¸·À¸·Î, Á¾Á¾ ¾î¶² °æ¿ì¿¡´Â Ãâ·Â ¹Ýº¹ÀÚ°¡ ÀÔ·Â ¹Ýº¹ÀÚ·Î ÁöÁ¤µÈ ½ÃÄö½º¿Í °°À» ¼ö°¡ Àִµ¥ ÀÌ·¸°Ô µÇ¸é, in-place º¯È¯À» ÇÏ°Ô µÈ´Ù. ´Ù¸¥ ÇÔ¼öµéÀÌ ´ëºÎºÐ algorithm Çì´õÈ­ÀÏ¿¡ ¼±¾ðµÇ¾î ÀÖ´Â °Í°ú´Â ´Þ¸®, partial_sum()°ú adjacent_difference() ÇÔ¼ö´Â numeric Çì´õ È­ÀÏ¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù. 13.7.1 ÇÑ°³ ¶Ç´Â µÎ°³ÀÇ ½ÃÄö½º º¯È¯Çϱâ transform() ¾Ë°í¸®µëÀº ÇϳªÀÇ ½ÃÄö½º¸¦ º¯È¯½ÃÅ°´Âµ¥ »ç¿ëÇÒ ¼öµµ ÀÖ°í, µÎ°³ÀÇ ½ÃÄö½º¿¡ ¿ø¼ÒµéÀÇ ½Öº°·Î ÀÌÇ× ÇÔ¼ö¸¦ Àû¿ëÇÏ¿© »õ·Î¿î ½ÃÄö½º¸¦ ¸¸µé¾î ³»±âµµ ÇÑ´Ù. ÇÁ·ÎÅäŸÀÔÀº ´ÙÀ½°ú °°´Ù. OutputIterator transform (InputIterator first, InputIterator last, OutputIterator result, UnaryFunction); OutputIterator transform (InputIterator first1, InputIterator last1, InputIterator first2, OutputIterator result, BinaryFunction); ù¹ø° ÇüÅ´ ½ÃÄö½º °¢°¢ÀÇ ¿ø¼Ò¿¡ ´ÜÇ× ÇÔ¼ö¸¦ Àû¿ëÇÏ´Â °ÍÀÌ´Ù. ¾Æ·¡ ÁÖ¾îÁø ¿¹Á¦ ÇÁ·Î±×·¥¿¡¼­´Â À̸¦ »ç¿ëÇÏ¿© ¿¬°á list¿¡ ´ã±ä °ªµé°ú ºÎÈ£°¡ ¹Ý´ëÀÎ °ªµé·Î ÀÌ·ç¾îÁø vector¸¦ ¸¸µé¾î³½´Ù. ÀÔ·Â ¹Ýº¹ÀÚ¿Í Ãâ·Â ¹Ýº¹ÀÚ¸¦ °°°Ô Çϸé, º¯È¯Àº in-place·Î Àû¿ëµÇ¸ç, ¿¹Á¦ ÇÁ·Î±×·¥ÀÇ 2¹ø° transform()ÀÌ ÀÌ·±½ÄÀ¸·Î »ç¿ëµÇ°í ÀÖ´Ù. µÎ¹ø° ÇüÅ´ µÎ°³ÀÇ ½ÃÄö½º¸¦ ÀÎÀÚ·Î ¹Þ¾Æ¼­, ½Öº°·Î ÀÌÇ× ÇÔ¼ö¸¦ Àû¿ëÇÑ´Ù. À̶§ µÎ¹ø° ½ÃÄö½º´Â Àû¾îµµ ù¹ø° ½ÃÄö½º¸¸Å­ÀÇ ¿ø¼Ò¸¦ °¡Áö°í ÀÖ¾î¾ß ÇÑ´Ù. Ãâ·Â ¹Ýº¹ÀÚ·Î ¸í½ÃµÇ´Â °á°ú ½ÃÄö½º´Â µÎ°³ÀÇ ÀÔ·Â ½ÃÄö½ºÁßÀÇ Çϳª°Å³ª ¶Ç´Â, Á¦»ïÀÇ ´Ù¸¥ ½ÃÄö½ºµµ °¡´ÉÇÏ´Ù. int square(int n) { return n * n; } void transform_example () // illustrate the use of the transform algorithm { // generate a list of value 1 to 6 list aList; generate_n (inserter(aList, aList.begin()), 6, iotaGen(1)); // transform elements by squaring, copy into vector vector aVec(6); transform (aList.begin(), aList.end(), aVec.begin(), square); // transform vector again, in place, yielding 4th powers transform (aVec.begin(), aVec.end(), aVec.begin(), square); // transform in parallel, yielding cubes vector cubes(6); transform (aVec.begin(), aVec.end(), aList.begin(), cubes.begin(), divides()); } 13.7.2 ºÎºÐÇÕ(partial sum) ½ÃÄö½ºÀÇ ºÎºÐÇÕÀ̶õ ¹Ù·Î ¾Õ¿¡ ÀÖ´Â ¿ø¼ÒµéÀÇ °ªÀ» ¸ðµÎ ´õÇÏ¿© »õ·Î¿î ¿ø¼Ò¸¦ ¸¸µé°í, ÀÌµé ¿ø¼Òµé·Î ±¸¼ºµÈ »õ·Î¿î ½ÃÄö½º¸¦ ¸¸µé¾î³»´Â °ÍÀÌ´Ù. ¿¹¸¦ µé¾î, vector 1 3 2 4 5 ÀÇ ºÎºÐÇÕÀº »õ vector 1 4 6 10 15°¡ µÈ´Ù. ¿ø¼Ò 4´Â 1 + 3À¸·Î °è»êµÇ¾úÀ¸¸ç, ¿ø¼Ò 6Àº 1 + 3 + 2·Î °Ô»êµÈ °ÍÀÌ´Ù. ¾Ë°í¸®µë À̸§¿¡ 'sum'À̶õ ´Ü¾î°¡ »ç¿ëµÇ¾úÁö¸¸, ½ÇÁ¦·Î ÀÌÇ× ÇÔ¼ö´Â µ¡¼À¿¬»ê»Ó¸¸ ¾Æ´Ï¶ó ÀÓÀÇÀÇ ÀÌÇ×ÇÔ¼ö°¡ ¸ðµÎ °¡´ÉÇÏ´Ù. ¿¹Á¦ ÇÁ·Î±×·¥¿¡¼­´Â ºÎºÐ°öÀ¸·Î À̸¦ ¼³¸íÇÏ°í ÀÖ´Ù. ÇÁ·ÎÅäŸÀÔÀº ´ÙÀ½°ú °°´Ù. OutputIterator partial_sum (InputIterator first, InputIterator last, OutputIterator result [, BinaryFunction] ); ÀÔ·Â ¹Ýº¹ÀÚ¿Í Ãâ·Â ¹Ýº¹ÀÚ¸¦ °°°Ô ÇÔÀ¸·Î½á ºÎºÐÇÕ ¿¬»êÀ» in-place º¯È¯ ¿¬»êÀ¸·Î ¹Ù²Ü ¼ö ÀÖ´Ù. void partial_sum_example () // illustrate the use of the partial sum algorithm { // generate values 1 to 5 vector aVec(5); generate (aVec.begin(), aVec.end(), iotaGen(1)); // output partial sums partial_sum (aVec.begin(), aVec.end(), ostream_iterator (cout, " ")), cout << endl; // output partial products partial_sum (aVec.begin(), aVec.end(), ostream_iterator (cout, " "), times()); } 13.7.3 ÀÎÁ¢Â÷(adjacent difference) ½ÃÄö½ºÀÇ ÀÎÁ¢Â÷(adjacent difference)´Â ½ÃÄö½ºÀÇ ÇöÀç ¿ø¼Ò¿Í ¹Ù·Î ¾Õ ¿ø¼Ò¿ÍÀÇ Â÷¸¦ »õ·Î¿î ½ÃÄö½ºÀÇ ¿ø¼Ò·Î ¸¸µå´Â °ÍÀÌ´Ù. »õ·Î¿î ½ÃÄö½ºÀÇ Ã¹¹ø° ¿ø¼Ò´Â ¹Ù²îÁö ¾Ê´Â´Ù. ¿¹¸¦ µé¾î, (1, 3, 2, 4, 5)¿Í °°Àº ½ÃÄö½º´Â (1, 3-1, 2-3, 4-2, 5-4)·Î º¯È¯µÇ°í, ÀÌ·±½ÄÀ¸·Î ÇÏ¿© (1, 2, -1, 2, 1)¿Í °°Àº ½ÃÄö½º¸¦ ¾ò°Ô µÈ´Ù. partial_sum() ¾Ë°í¸®µë¿¡¼­¿Í ¸¶Âù°¡Áö·Î, ÀÓÀÇÀÇ ÀÌÇ× ÇÔ¼ö°¡ »ç¿ëµÉ ¼ö ÀÖÀ¸¹Ç·Î, 'difference'¶ó´Â ´Ü¾î°¡ ±×¸® Á¤È®ÇÑ °ÍÀº ¾Æ´Ï´Ù. ¿¹¸¦ µé¾î, ÀÌ ½ÃÄö½ºÀÇ ÀÎÁ¢ÇÕ(adjacent sum)Àº (1, 3+1, 2+3, 4+2, 5+4)°¡ µÈ´Ù. ÀÎÁ¢Â÷ ¾Ë°í¸®µëÀÇ ÇÁ·ÎÅäŸÀÔÀº ´ÙÀ½°ú °°´Ù. OutputIterator adjacent_difference (InputIterator first, InputIterator last, OutputIterator result [, BinaryFunction ]); ÀÔ·Â ¹Ýº¹ÀÚ¿Í Ãâ·Â ¹Ýº¹ÀÚ¸¦ °°°Ô ÇÏ¿©, °øÂ÷ ¿¬»êÀ» in-place º¯È¯À¸·Î ¹Ù²Ü ¼ö ÀÖ´Ù. void adjacent_difference_example() // illustrate the use of the adjacent difference algorithm { // generate values 1 to 5 vector aVec(5); generate (aVec.begin(), aVec.end(), iotaGen(1)); // output adjacent differences adjacent_difference (aVec.begin(), aVec.end(), ostream_iterator (cout, " ")), cout << endl; // output adjacent sums adjacent_difference (aVec.begin(), aVec.end(), ostream_iterator (cout, " "), plus() ); } 13.8 ±âŸ ¾Ë°í¸®µë ¸¶Áö¸·À¸·Î ÀÌÀý¿¡¼­´Â ³ª¸ÓÁö ¾Ë°í¸®µëÀ» ¼³¸íÇÑ´Ù. 13.8.1 ÄÝ·º¼Ç ³»ÀÇ ¸ðµç ¿ø¼Ò¿¡ ÇÔ¼ö Àû¿ëÇϱâ for_each() ¾Ë°í¸®µëÀº 3°³ÀÇ ÀÎÀÚ¸¦ ÃëÇÑ´Ù. óÀ½ 2°³´Â °è»ê¿¡ ¾²ÀÏ ½ÃÄö½º¸¦ ³ªÅ¸³»´Â ¹Ýº¹ÀÚÀÌ°í, 3¹ø° ÀÎÀÚ´Â ÇÑ°³ÀÇ ÀÎÀÚ¸¦ °¡Áö´Â ÇÔ¼öÀÌ´Ù. for_each() ¾Ë°í¸®µëÀº ½ÃÄö½º³»ÀÇ °ª¿¡ ÇÔ¼ö¸¦ Àû¿ëÇϴµ¥, À̶§ ½ÃÄö½º³»ÀÇ ´ã±ä °¢°¢ÀÇ °ªÀ» Àû¿ëÇÒ ÇÔ¼öÀÇ ÀÎÀÚ·Î ³Ñ°ÜÁÖ°Ô µÈ´Ù. ÇÁ·ÎÅäŸÀÔÀº ´ÙÀ½°ú °°´Ù. Function for_each (InputIterator first, InputIterator last, Function); ¿¹¸¦ µé¾î, ´ÙÀ½ ÄÚµå´Â print_if_leap() ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© 1900³â°ú 1997³â »çÀÌ¿¡ ³ªÅ¸³ª´Â À±³âÀ» Ãâ·ÂÇÑ´Ù. cout << "leap years between 1990 and 1997 are: "; for_each (1990, 1997, print_if_leap); cout << endl; [Image] Results Produced by Side Effect ÀÎÀÚ·Î ÁÖ¾îÁö´Â ÇÔ¼ö´Â ½ÃÄö½º³»ÀÇ °¢ ¿ø¼Ò¿¡ ´ëÇØ ´Ü Çѹø¾¿¸¸ È£ÃâµÇ¾î¾ß ÇÑ´Ù. for_each() ¾Ë°í¸®µëÀº 3¹ø° ÀÎÀÚ¸¦ °á°ú·Î ¸®ÅÏÇÏÁö¸¸, º¸Åë Àß ¾²ÀÌÁö ¾Ê´Â´Ù. ´ÙÀ½ ¿¹´Â Æ÷µµÁÖÀÇ ¾çÁ¶ ³âµµ¸¦ ³ªÅ¸³»´Â Á¤¼ö°ªÀÇ ¹è¿­À» ÈȾ¸é¼­, À±³â¿¡ ÇØ´çÇÏ´Â °ÍÀ» Ãâ·ÂÇÏ´Â ÄÚµåÀÌ´Ù. int vintageYears[] = {1947, 1955, 1960, 1967, 1994}; ... cout << "vintage years which were also leap years are: "; for_each(vintageYears, vintageYears + 5, print_if_leap); cout << endl; side effect°¡ ¹Ýµå½Ã Ãâ·ÂÀÏ ÇÊ¿ä´Â ¾ø´Ù. ´ë¹®ÀÚÀÇ °¹¼ö¸¦ ¼¼´Â countCaps() ÇÔ¼ö¸¦ °¡Áö°í ÀÖ´Ù°í ÇÏÀÚ. int capCount = 0; void countCaps(char c) { if (isupper(c)) capCount++; } ´ÙÀ½ ¿¹Á¦´Â ¹®ÀÚ¿­¿¡ Æ÷ÇÔµÈ ´ë¹®ÀÚÀÇ °¹¼ö¸¦ ¼¼°í ÀÖ´Ù. string advice = "Never Trust Anybody Over 30!"; for_each(advice.begin(), advice.end(),countCaps); cout << "upper-case letter count is " << capCount << endl;