42-2-¶ó.¿ä¼Ò Àç¹èÄ¡

¿ä¼Ò Àç¹èÄ¡ ÇÔ¼öµéÀº ±¸°£ÀÇ ¿ä¼ÒµéÀ» ƯÁ¤ÇÑ ´Ù¸¥ °ªÀ¸·Î ¹Ù²Ù°Å³ª ¿ä¼Ò³¢¸® ±³È¯ÇÔÀ¸·Î½á À§Ä¡¸¦ º¯°æÇÑ´Ù. ´Ù¾çÇÑ ¿øÇüÀÌ ÀÖÁö¸¸ ÀÏ´Ü ±âº»ÇüÀÇ ¿øÇüÀ» º¸ÀÚ.

 

void replace (FwdIt first, FwdIt last, const Type& Old, const Type& New);

void reverse(BiIt first, BiIt last);

void rotate(FwdIt first, FwdIt middle, FwdIt last);

 

replace ÇÔ¼ö´Â first ~ last »çÀÌÀÇ Old°ªÀ» ¸ðÁ¶¸® µÚÁ® New·Î ´ëüÇÑ´Ù. ³ª¸ÓÁö °ªÀº ¹°·Ð ±×´ë·Î ³²´Â´Ù. ¾Ë°í¸®Áò ÇÔ¼öµé Áß¿¡ °¡Àå ÀÌÇØÇϱ⠽¬¿î ÇÔ¼öÀÌ´Ù. Á¶°ÇÀÚ ¹öÀüÀÎ replace_if´Â ƯÁ¤°ªÀÌ ¾Æ´Ñ ƯÁ¤ Á¶°ÇÀ» ¸¸Á·ÇÏ´Â °ªÀ» ´Ù¸¥ °ªÀ¸·Î º¯°æÇÒ ¼ö ÀÖ´Ù. º¹»ç ¹öÀüÀÎ replace_copyµµ ÀÖ°í Á¶°ÇÀÚ¸¦ ÃëÇÏ´Â º¹»ç ÇÔ¼öÀÎ replace_copy_if ÇÔ¼öµµ Á¦°øµÈ´Ù.

reverse´Â ±¸°£ÀÇ ¸ðµç ¿ä¼ÒÀÇ ¼ø¼­¸¦ ¹Ý´ë·Î µÚÁý´Â´Ù. Áï Á¦ÀÏ ¾Õ¿¡ ÀÖ´Â ¿ä¼Ò´Â Á¦ÀÏ µÚÂÊÀ¸·Î °¡°í Á¦ÀÏ µÚÂÊ¿¡ ÀÖ´Â ¿ä¼Ò°¡ Á¦ÀÏ ¾ÕÂÊÀ¸·Î ¿Â´Ù. º¹»ç ¹öÀüÀÎ reverse_copy ÇÔ¼öµµ Á¦°øµÈ´Ù. rotate ÇÔ¼ö´Â first ~ last ±¸°£À» middleÀ» ±âÁØÀ¸·Î ȸÀü½ÃŲ´Ù. ±¸°£À» ÀÏÁ¾ÀÇ ¿øÇüÀ¸·Î °£ÁÖÇϰí ÇÑ ¹ÙÄû µ¹¸®´Â °ÍÀÌ´Ù. ¼Â ´Ù °³³äÀÌ °£´ÜÇϹǷΠ¿¹Á¦¸¦ ½ÇÇàÇØ º¸¸é ½±°Ô ÀÌÇØÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

 

¿¹ Á¦ : replace

#include <iostream>

#include <vector>

#include <algorithm>

using namespace std;

 

template<typename C> void dump(const char *desc, C c) { cout.width(12);cout << left << desc << "==> ";

      copy(c.begin(),c.end(),ostream_iterator<typename C::value_type>(cout," ")); cout << endl; }

 

void main()

{

     const char *str="Notebook Computer";

     vector<char> vc(&str[0],&str[strlen(str)]);

    

     dump("¿øº»",vc);

     replace(vc.begin(),vc.end(),'o','a');

     dump("replace",vc);

     rotate(vc.begin(),vc.begin()+2,vc.end());

     dump("rotate",vc);

     reverse(vc.begin(),vc.end());

     dump("reverse",vc);

}

 

¹®ÀÚÇüÀÇ º¤Å͸¦ ÁغñÇÏ°í ¼¼ ÇÔ¼ö¸¦ Â÷·Ê´ë·Î È£ÃâÇØ º¸¾Ò´Ù. ¼¼ ÇÔ¼ö ¸ðµÎ ÄÁÅ×ÀÌ³Ê ÀÚü¸¦ Á¶ÀÛÇÏÁö´Â ¾ÊÀ¸¹Ç·Î ÄÁÅ×À̳ÊÀÇ Å©±â´Â ±×´ë·Î À¯ÁöµÈ´Ù.

 

¿øº»        ==> N o t e b o o k   C o m p u t e r

replace     ==> N a t e b a a k   C a m p u t e r

rotate      ==> t e b a a k   C a m p u t e r N a

reverse     ==> a N r e t u p m a C   k a a b e t

 

replace ÇÔ¼ö·Î ¸ðµç o¸¦ ã¾Æ a·Î º¯°æÇß´Ù. rotate ÇÔ¼ö´Â middle À§Ä¡¿¡ ÀÖ´ø ¿ä¼Ò°¡ firstÀÇ ÀÚ¸®·Î ¿Â´Ù°í »ý°¢ÇÏ¸é µÈ´Ù. Àü ±¸°£À» begin+2¸¦ ±âÁØÀ¸·Î ȸÀü½ÃÄ×À¸¹Ç·Î ¸ðµç ¹®ÀÚ°¡ ¾ÕÀ¸·Î µÎÄ­¾¿ À̵¿Çϸç Á¦ÀÏ ¾ÕÂÊ¿¡ ÀÖ´ø µÎ ¹®ÀÚ N°ú a´Â Á¦ÀÏ µÚÂÊÀ¸·Î À̵¿ÇÑ´Ù. reverse´Â ¿ä¼ÒÀÇ ¼ø¼­¸¦ ¹Ý´ë·Î µÚÁý´Â´Ù. ´ÙÀ½ ÇÔ¼ö´Â ÀÏÁ¤ÇÑ Á¶°ÇÀ» ±âÁØÀ¸·Î ¿ä¼ÒµéÀ» Á¿ì·Î Àç¹èÄ¡ÇÑ´Ù.

 

BiIt partition(BiIt first, BiIt last, UniPred F);

BiIt stable_partition(BiIt first, BiIt last, UniPred F);

 

´ÜÇ× Á¶°ÇÀÚ F´Â ±¸°£³»ÀÇ ¿ä¼ÒµéÀ» Àμö·Î Àü´Þ¹Þ¾Æ ÀÌ ¿ä¼Ò°¡ Á¶°Ç¿¡ ¸Â´ÂÁö ¾Æ´ÑÁö¸¦ ÆÇº°ÇÑ´Ù. partition ÇÔ¼ö´Â FÀÇ Æò°¡ °á°ú¿¡ µû¶ó Á¶°Ç¿¡ ¸Â´Â ¿ä¼Ò´Â ±¸°£ÀÇ ¾ÕÂÊÀ¸·Î À̵¿½ÃŰ°í ±×·¸Áö ¾ÊÀº ¿ä¼Ò´Â µÚÂÊÀ¸·Î À̵¿½ÃŰ¸ç µÚÂÊ ±×·ìÀÇ ½ÃÀÛ À§Ä¡¸¦ ¸®ÅÏÇÑ´Ù. ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ°í ³­ ÈÄ¿¡ ¿ÞÂÊ¿¡´Â Á¶°Ç¿¡ ¸Â´Â ¿ä¼Ò, ¿À¸¥ÂÊ¿¡´Â ±×·¸Áö ¾ÊÀº ¿ä¼ÒµéÀÌ ¹èÄ¡µÇ¾î ÀÖÀ» °ÍÀÌ´Ù.

stable_partition ÇÔ¼ö´Â Àç¹èÄ¡ÈÄ¿¡µµ ¿ä¼ÒµéÀÇ ¿ø·¡ ¼ø¼­°¡ À¯ÁöµÇ´Â ¾ÈÁ¤µÈ ¹öÀüÀÌ´Ù °°Àº ±×·ì¿¡ ¼ÓÇÏ´Â °ªµé³¢¸®¶óµµ ¿ø·¡ ¾ÕÂÊ¿¡ ÀÖ¾ú´Ù¸é Àç¹èÄ¡ ÈÄ¿¡µµ ¿©ÀüÈ÷ ¾ÕÂÊ¿¡ ¹èÄ¡µÈ´Ù´Â ¶æÀÌ´Ù. ¾ÈÁ¤¼ºÀÌ ÀÖ´Â ´ë½Å ¼Óµµ´Â partitionº¸´Ù ´À¸®¸ç ´õ ¸¹Àº ¸Þ¸ð¸®¸¦ ¼Ò¸ðÇÑ´Ù. Á¤¼öµéÀ» ÀÏÁ¤ÇÑ °ª ±âÁØÀ¸·Î Àç¹èÄ¡ÇØ º¸ÀÚ.

 

¿¹ Á¦ : partition

#include <iostream>

#include <vector>

#include <algorithm>

#include <functional>

using namespace std;

 

template<typename C> void dump(const char *desc, C c) { cout.width(12);cout << left << desc << "==> ";

      copy(c.begin(),c.end(),ostream_iterator<typename C::value_type>(cout," ")); cout << endl; }

 

void main()

{

     int ari[]={3,1,4,1,5,9,2,6,5,3,5,8,9,7,9,3,2,3,8};

     vector<int> vi(&ari[0],&ari[sizeof(ari)/sizeof(ari[0])]);

 

     dump("¿øº»",vi);

     partition(vi.begin(),vi.end(),bind2nd(greater<int>(),5));

     dump("partition",vi);

 

     vector<int> ar2(&ari[0],&ari[sizeof(ari)/sizeof(ari[0])]);

     stable_partition(ar2.begin(),ar2.end(),bind2nd(greater<int>(),5));

     dump("stable",ar2);

}

 

Á¤¼öµéÀÌ ÀúÀåµÇ¾î ÀÖ´Â º¤Å͸¦ 5¸¦ ±âÁØÀ¸·Î ÇÏ¿© Á¿ì·Î Àç¹èÄ¡Çß´Ù. 5º¸´Ù ´õ Å©´Ù´Â Á¤µµÀÇ Á¶°ÇÀº ÇÔ¼ö °´Ã¼¸¦ ¸¸µé ÇÊ¿ä¾øÀÌ greater Ç¥ÁØ ÇÔ¼ö °´Ã¼¿Í bind2nd ¹ÙÀδõ¸¦ »ç¿ëÇÏ¸é ½±°Ô ¸¸µé ¼ö ÀÖ´Ù.

 

¿øº»        ==> 3 1 4 1 5 9 2 6 5 3 5 8 9 7 9 3 2 3 8

partition   ==> 8 9 7 9 8 9 6 2 5 3 5 5 1 4 1 3 2 3 3

stable      ==> 9 6 8 9 7 9 8 3 1 4 1 5 2 5 3 5 3 2 3

 

5º¸´Ù Å« °ªµéÀÌ ¿ÞÂÊÀ¸·Î ¿Å°ÜÁ³°í ¿À¸¥ÂÊ¿¡´Â ±×·¸Áö ¾ÊÀº °ªµéÀÌ ¹èÄ¡µÈ´Ù. 5´Â 5º¸´Ù Å©Áö ¾ÊÀ¸¹Ç·Î À̵¿ ´ë»óÀÌ ¾Æ´Ï´Ù. ¾ÈÁ¤¼ºÀÌ ÀÖ´Â Àç¹èÄ¡ ÇÔ¼ö´Â ¿ä¼ÒÀÇ ¿ø·¡ ¼ø¼­¸¦ ±×´ë·Î À¯ÁöÇϴµ¥ ¿øº»¿¡ ÀÖ´Â 5º¸´Ù Å« °ª 9, 6, 8, 9°¡ ¿øº» ¼ø¼­ ±×´ë·Î Àç¹èÄ¡µÇ¾î ÀÖ´Ù. ¹Ý¸é ¾ÈÁ¤¼ºÀÌ ¾ø´Â Àç¹èÄ¡ ÇÔ¼ö´Â Á¶°ÇÀ» ±âÁØÀ¸·Î Á¿ì·Î ¿Å±â±â¸¸ ÇÒ »Ó ¼ø¼­ À¯Áö´Â ÇÏÁö ¾Ê´Â´Ù.