42-4.¼öÄ¡ ¾Ë°í¸®Áò

42-4-°¡.accumulate

¼öÄ¡ °ü·Ã ¾Ë°í¸®ÁòµéÀº STL¿¡ Á÷Á¢ÀûÀ¸·Î ¼Ò¼ÓµÇÁö ¾ÊÀ¸¸ç C++ ¶óÀ̺귯¸®·Î ºÐ·ùµÈ´Ù. ±×·¯³ª ¼öÄ¡ ¾Ë°í¸®Áòµµ STL ÄÁÅ×ÀÌ³Ê¿Í ÇÔ²² ÈǸ¢ÇÏ°Ô µ¿ÀÛÇϸç STLÀÌ C++ Ç¥ÁØ ¶óÀ̺귯¸®¿¡ Èí¼öµÈ ÀÌ»ó À̸¦ ±»ÀÌ ±¸ºÐÇÒ ÇÊ¿ä´Â ¾ø´Ù. ´Ü, ÀÌ ÇÔ¼öµéÀº numeric Çì´õ ÆÄÀÏ¿¡ Á¤ÀǵǾî ÀÖÀ¸¹Ç·Î ¼öÄ¡ °ü·Ã ÇÔ¼ö¸¦ ¾µ ¶§´Â ÀÌ Çì´õ ÆÄÀÏÀ» ²À Æ÷ÇÔÇϵµ·Ï ÇÏÀÚ. ´©Àû ÇÕÀ» ±¸ÇÏ´Â ÇÔ¼ö´Â ´ÙÀ½ µÎ °¡ÁöÀÌ´Ù.

 

T accumulate(InIt first, InIt last, T val [, BinOp op]);

OutIt partial_sum (InIt first, InIt last, OutIt result [ ,BinOp op]);

 

accumulate ÇÔ¼ö´Â first ~ last ±¸°£¿¡ ¼ÓÇÑ °ªµéÀÇ ÃÑÇÕÀ» ±¸ÇÑ´Ù. ¼¼ ¹ø° Àμö valÀº ´©Àû ÃÑÇÕÀÇ ÃʱⰪÀε¥ 0À¸·Î ÁöÁ¤ÇÏ¸é ¼ø¼öÇÑ ÇÕÀ» ±¸ÇÒ ¼ö ÀÖ´Ù. partial_sumÀº first ~ last±îÁöÀÇ ºÎºÐÇÕµéÀ» ±¸ÇØ result ¹Ýº¹ÀÚ À§Ä¡¿¡ ¼ø¼­´ë·Î ´ëÀÔÇÑ´Ù.

 

¿¹ Á¦ : accumulate

#include <iostream>

#include <vector>

#include <numeric>

#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()

{

     int ar1[]={49,26,19,77,34,52,84,34,92,69};

     vector<int> vi1(&ar1[0],&ar1[10]);

     printf("º¤ÅÍÀÇ ÃÑÇÕÀº %dÀÌ´Ù.\n",accumulate(vi1.begin(),vi1.end(),0));

 

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

     vector<int> vi2(&ar2[0],&ar2[10]);

     vector<int> vi3;

     partial_sum(vi2.begin(),vi2.end(),back_inserter(vi3));

     dump("ºÎºÐÇÕ",vi3);

}

 

Á¤¼ö 10°³°¡ µé¾î ÀÖ´Â º¤ÅÍÀÇ ÃÑÇÕÀ» accumulate ÇÔ¼ö·Î ±¸Çß´Ù. ±×¸®°í 1 ~ 10±îÁöÀÇ Á¤¼ö°¡ µé¾î ÀÖ´Â º¤ÅÍÀÇ ºÎºÐÇÕÀ» vi3 º¤ÅÍ¿¡ »õ·Î ÀÛ¼ºÇß´Ù.

 

º¤ÅÍÀÇ ÃÑÇÕÀº 536ÀÌ´Ù.

ºÎºÐÇÕ      ==> 1 3 6 10 15 21 28 36 45 55

 

ÃÑÇÕÀº ¸ðµç ¿ä¼Ò°ªÀ» ´õÇÑ °ÍÀ̹ǷΠ½±°Ô ÀÌÇØ°¡ µÉ °ÍÀÌ´Ù. ºÎºÐÇÕÀ̶õ first¿¡¼­ºÎÅÍ ¹Ýº¹ÀÚ±îÁöÀÇ ÇÕÀ» ´õÇÑ °ªÀÇ º¤ÅÍÀε¥ 1±îÁö ´õÇϸé 1, 1°ú 2¸¦ ´õÇϸé 3, 1°ú 2¿Í 3À» ´õÇϸé 6, ÀÌ·± ½ÄÀ¸·Î ¾Õ ¿ä¼ÒµéÀÇ °ªÀ» °è¼Ó ´õÇØ ³ª°¡¸é¼­ Áß°£ Áß°£ÀÇ °á°ú°ªÀ» º¤ÅÍ·Î ´Ù½Ã ÀÛ¼ºÇÑ´Ù. ÀÏÁ¾ÀÇ ´©Àû°ª¿¡ ´ëÇÑ º¤Å͸¦ ¸¸µå´Âµ¥ ¿¹¸¦ µé¾î sale º¤ÅÍ¿¡ ¿ùº° ÆǸŷ®ÀÌ ÀÖ´Ù¸é ÀÌ º¤ÅÍ¿¡ ´ëÇÑ ´©ÀûÇÕµéÀº ÇØ´ç¿ù±îÁöÀÇ ÃÑ ÆǸŷ®ÀÌ µÈ´Ù.

accumulate ÇÔ¼ö´Â ¹Ýº¹ÀÚ ±¸°£À» ¼øȸÇϸ鼭 ÀÌ °ªµéÀ» °è¼Ó ´õÇÏ¿© Àüü ÃÑÇÕÀ» ¸¸µé¾î ³½´Ù. À̶§ º°µµÀÇ ÇÔ¼ö °´Ã¼¸¦ ÁöÁ¤ÇÏ¸é ´õÇϱⰡ ¾Æ´Ñ ´Ù¸¥ ¿¬»êÀ» ÇÒ ¼öµµ ÀÖ´Ù. ¿¹¸¦ µé¾î accumulate(vi1.begin(), vi1.end(), 1, multiplies<int>()) ¿¬»êÀ» ÇÏ¸é ¸ðµç ¿ä¼ÒÀÇ ´©Àû°öÀÌ ±¸ÇØÁø´Ù. À̶§ ÃʱⰪÀº °ö¼ÀÀÇ Ç×µî¿øÀÎ 1·Î ÁöÁ¤ÇØ¾ß ÇÒ °ÍÀÌ´Ù. ¾Æ¹«Æ° accumulate´Â ±¸°£ÀÇ ¸ðµç ¿ä¼Òµé¿¡ ´ëÇØ ¾î¶² ¿¬»êÀ» Àû¿ëÇÑ °á°ú¸¦ °è»êÇÏ¸ç µðÆúÆ® ¿¬»êÀÌ µ¡¼ÀÀÏ »ÓÀÌ´Ù.

´ÙÀ½ ÇÔ¼ö´Â partial_sum ÇÔ¼ö¿Í À¯»çÇÏ°Ô µ¿ÀÛÇϴµ¥ ÀÎÁ¢ ¿ä¼ÒµéÀÇ Â÷¸¦ °è»êÇØ result ¹Ýº¹ÀÚ¿¡ Â÷·Ê´ë·Î ´ëÀÔÇÑ´Ù.

 

OutIt adjacent_difference(InIt first, InIt last, OutIt result [ ,BinOp op]);

 

¾Æ¸¶ ´ëÃæ ¾î¶² µ¿ÀÛÀ» ÇÏ´ÂÁö »ó»óÀÌ °¥ °ÍÀÌ´Ù. ¿¹Á¦·Î µ¿ÀÛÀ» È®ÀÎÇØ º¸ÀÚ.

 

¿¹ Á¦ : adjacent_difference

#include <iostream>

#include <vector>

#include <numeric>

#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()

{

     int ar[]={1,2,5,10,15,12,20};

     vector<int> vi(&ar[0],&ar[7]);

     vector<int> vi2;

     adjacent_difference(vi.begin(),vi.end(),back_inserter(vi2));

     dump ("ºÎºÐÂ÷ ",vi2);

}

 

Á¤¼ö º¤Å͸¦ Á¤ÀÇÇÏ°í ÀÌ º¤ÅÍÀÇ ºÎºÐÂ÷¸¦ »õ·Î¿î º¤ÅÍ¿¡ °è»êÇß´Ù. ±×¸²À¸·Î ¿ä¼ÒµéÀÇ º¯È­¸¦ »ìÆ캸¸é ½±°Ô ÀÌÇØÇÒ ¼ö ÀÖ´Ù.

ù ¹ø° ¿ä¼Ò´Â ±×´ë·Î ³»·Á¿À°í ù ¹ø° ¿ä¼Ò¿Í µÎ ¹ø° ¿ä¼ÒÀÇ Â÷°¡ »õ º¤ÅÍÀÇ µÎ ¹ø° ¿ä¼Ò¿¡ ±â·ÏµÈ´Ù. °á°ú º¤ÅÍÀÇ n¹ø° ¿ä¼Ò´Â ¿øº»ÀÇ n-1 ¿ä¼Ò¿Í n ¿ä¼ÒÀÇ Â÷À̶ó°í ÇÒ ¼ö ÀÖ´Ù. ¸¸¾à ¿øº» º¤ÅÍ°¡ ¿ùº° ÆǸŷ®À̾ú´Ù¸é °á°ú º¤ÅÍ´Â ±× ´ÞÀÇ ÆǸŠÁõ°¡·®À̶ó°í ÇÒ ¼ö ÀÖ´Ù. result ¹Ýº¹ÀÚ´Â ÄÁÅ×ÀÌ³Ê ³»ºÎÀÇ ¹Ýº¹ÀÚÀÏ ¼öµµ ÀÖÀ¸¹Ç·Î Â÷¸¦ ±¸ÇØ °ð¹Ù·Î Àڽſ¡°Ô ´Ù½Ã ´ëÀÔÇÏ´Â °Íµµ °¡´ÉÇÏ´Ù.