STL algorithm
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®
ÇöÀçÀ§Ä¡ : article>STL_algorithm



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

<a href="/modules/moniwiki/wiki.php/manSearch?google=none&name=STL">STL</a>(5) - algorithm

STL(5) - algorithm

À± »ó¹è

dreamyun@yahoo.co.kr



1절. algorithm ¿¡ ´ëÇØ¼­

Áö±Ý±îÁö STL ÀÇ ¿©·¯°¡Áö ±â´É¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸¾Ò´Âµ¥, ÀÌ·¯ÇÑ ±â´ÉµéÀº °á±¹ STL À» ÀÌ¿ëÇÑ ÀڷᱸÁ¶·Î½áÀÇ ±â´É¿¡ ÃÐÁ¡ÀÌ ¸ÂÃß¾îÁ® ÀÖÀ½À» ¾Ë¼ö ÀÖ´Ù. STLÀº ÀÌ·¯ÇÑ ÀڷᱸÁ¶¸¦ ½±°í À¯¿¬ÇÏ°Ô ±¸ÇöÇØÁÖ±â À§ÇÑ µµ±¸¶ó°í ÇÒ¼ö ÀÖÀ»°ÍÀÌ´Ù.

ÀڷᱸÁ¶°¡ »ç¿ëµÇ¸é ºüÁöÁö ¾Ê°í µû¶ó´Ù´Ï´Â°Ô Àִµ¥, ¹Ù·Î ¾Ë°í¸®Áò µéÀÌ´Ù. (¾Æ¸¶µµ °¡Àå ¸¹ÀÌ »ç¿ëµÇ´Â°Ô sort, search °ú °°Àº ¾Ë°í¸®ÁòµéÀϰÍÀÌ´Ù.)

STL ¿¡¼­´Â ¿©·¯°¡Áö ÄÁÅ×À̳ʵé·Î ±¸¼ºµÈ ÀڷᱸÁ¶ÀÇ ¿¬»êÀ» À§ÇÑ ´Ù¾çÇÑ ¾Ë°í¸®ÁòÀ» Á¦°øÇÑ´Ù.


2절. ¾Ë°í¸®Áò

¾Ë°í¸®ÁòÀ» »ç¿ëÇϱâ À§Çؼ­´Â ´ÙÀ½°ú °°ÀÌ Çì´õÆÄÀÏÀ» ¼±¾ðÇØ ÁÖ¾î¾ß ÇÑ´Ù.

	
#include <algorithm>
		

STL¿¡¼­ Á¦°øÇÏ´Â ¾Ë°í¸®ÁòµéÀº ±× Ư¼º¿¡ µû¶ó¼­ ¸î°¡Áö Á¾·ù·Î ºÐ·ùÇÒ¼ö ÀÖ´Ù. "Non-mutating algorithms", "Mutating algorithms", "Sorting algorithms", Generalized numeric algorithms" µîÀÌ´Ù.

ÀÌÁ¦ ºÎÅÍ ÀÌ·¯ÇÑ ºÐ·ùº°·Î °¢°¢ÀÇ ºÐ·ù¿¡ Æ÷ÇÔµÈ ¾Ë°í¸®ÁòÀ» ¼³¸íÇϵµ·ÏÇϰڴÙ. ±×·¯³ª ¿ö³«¿¡ ¸¹Àº ¾Ë°í¸®ÁòÀÌ Á¸ÀçÇϰí (´ë·« 50¿©°¡Áö) ÀÌµé ¾Ë°í¸®ÁòÁß¿¡´Â °ÅÀÇ »ç¿ëµÇ¾îÁöÁö ¾Ê´Â ¾Ë°í¸®Áòµéµµ ÀÖÀ¸¹Ç·Î, ÀÚÁÖ »ç¿ëµÈ´Ù°í »ý°¢µÇ´Â ¾Ë°í¸®Áòµé¸¸À» ¼³¸íÇϵµ·Ï ÇÒ°ÍÀÌ´Ù. ³ª¸ÓÁö ¾Ë°í¸®Áò¿¡ ´ëÇÑ Á¤º¸¸¦ ¾Ë±â¸¦ ¿øÇÑ´Ù¸é SGI STL Ȩ ¹®¼­¸¦ Âü°íÇÏ±æ ¹Ù¶õ´Ù.


2.1절. None-mutating algorithms

mutating Àº "º¯È­", "º¯°æ" ÀÇ ¶æÀ» °¡Áø´Ù. None-mutating algorithms ¿¡ Æ÷ÇԵǴ ¾Ë°í¸®ÁòµéÀº ÄÁÅ×À̳ʵéÀÇ ¿ø¼Ò¿¡ ´ëÇØ¼­ None-mutating Áï ÄÁÅ×À̳ʸ¦ º¯°æ½ÃŰÁö ¾Ê´Â Ư¼ºÀ» °¡Áö°í ÀÖ´Ù.

¿¹¸¦µé¾î¼­ search ³ª, ¿ø¼ÒÀÇ °¹¼ö¸¦ ¼¼´Â count µîÀÇ ¾Ë°í¸®ÁòÀº ÄÁÅ×À̳ʿ¡¼­ ÇÊ¿äÇÑ ¿ø¼Ò¸¦ ã°Å³ª, °è¼ö¸¦ ÇÏ´Â ÀÏÀ» ÇÒ»ÓÀ¸·Î, ÄÁÅ×À̳ʸ¦ º¯°æ(¿ø¼Ò¸¦ »èÁ¦Çϰųª, À§Ä¡¸¦ º¯°æ½ÃŰ°Å³ª)ÇÏ´Â ÀÏÀ» ¼öÇàÇÏÁö ¾ÊÀ»°ÍÀÌ´Ù. ±×·±ÀÌÀ¯·Î ÀÌ·¯ÇÑ ¾Ë°í¸®ÁòµéÀ» None-mutating(º¯°æºÒ°¡) ¾Ë°í¸®ÁòÀ̶ó°í ºÎ¸¥´Ù. (¸»Àº ¹«Áö º¹ÀâÇѵ¥ °³³äÀº ¹«Áö °£´ÜÇÏ´Ù´Â°É ¾Ë¼ö ÀÖÀ»°ÍÀÌ´Ù.)


2.1.1절. find

¾Æ¸¶µµ °¡À帹ÀÌ »ç¿ëµÇ´Â ¾Ë°í¸®ÁòÀÏ °ÍÀÌ´Ù. ÄÁÅ×À̳ʿ¡¼­ ÀÏÁ¤ÇÑ ¹üÀ§ÀÇ ¿ø¼Òµé»çÀÌ¿¡¼­ ¿øÇÏ´Â °ªÀ» ã´Â´Ù. ÀÌ ¹üÀ§´Â iterator ·Î ÁÖ¾îÁø´Ù.


template<class InputIterator, class EqualityComparable>
InputIterator find(InputIterator first, InputIterator last,
                   const EqualityComparable& value);
				
µ¹·ÁÁÖ´Â °ªÀº ¿ª½Ã iterator À̸ç, ÀÌ iterator Àº ãÀº ¿ø¼Ò°¡ ÄÁÅ×À̳ʿ¡¼­ À§Ä¡ÇÏ´Â °ªÀ» °¡¸®Å²´Ù.
#include <algorithm>
#include <vector>

int main()
{
    vector<int> V;

    V.push_back(1);
    V.push_back(4);
    V.push_back(7);
    V.push_back(5);

    vector<int>::iterator mi;

    mi = find(V.begin(), V.end(), 4);

    cout << *mi << endl;
}
				


2.1.2절. count

count ´Â ¸»±×´ë·Î ÄÁÅ×À̳ʿ¡ Æ÷ÇÔµÈ ¿ø¼ÒÀÇ °¹¼ö¸¦ °è¼öÇϱâ À§Çؼ­ »ç¿ëµÈ´Ù.

iterator_traits<InputIterator>::difference_type
count(InputIterator first, InputIterator last, 
      const EqualityComparable& value);
				
ù¹øÂ°¿Í µÎ¹øÂ° ¾Æ±Ô¸ÕÆ®·Î ÁÖ¾îÁö´Â iterator ¸¦ ¼øÈ¯Çϸ鼭 ¼¼¹øÂ° ¾Æ±Ô¸ÕÆ®·Î ÁÖ¾îÁö´Â value ¿Í ÀÏÄ¡ÇÏ´Â °ªÀÌ ÀÖ´ÂÁö È®ÀÎÇÏ¿©¼­ ÀÌ °ªÀ» °è¼öÇÑ´Ù.
#include <algorithm>
#include <vector>

int main()
{
    vector<int> V;

    V.push_back(1);
    V.push_back(4);
    V.push_back(1);
    V.push_back(7);
    V.push_back(1);

    cout << count(V.begin(), V.end(), 1) << endl;
}
				


2.2절. Mutating algorithms

À̰͵éÀº º¯°æ°¡´ÉÇÑ ¾Ë°í¸®Áòµé·Î½á, ÄÁÅ×À̳ÊÀÇ ¿ø¼Ò¸¦ ¼öÁ¤ÇÒ¼ö ÀÖ´Ù. ÄÁÅ×ÀÌ³Ê ¿ø¼Ò¸¦ º¹»çÇϰųª, ±³Ã¼, »èÁ¦ ÇϴµîÀÇ ÀÛ¾÷À» ¼öÇàÇÑ´Ù. ÀÌ·¯ÇÑ ÀÛ¾÷ ¼öÇàÁß¿¡ ¿ø¼ÒÀÇ ³»¿ëÀÌ º¯°æµÇ¹Ç·Î Mutating ¾Ë°í¸®ÁòÀ̶ó°í ÇÑ´Ù.


2.2.1절. copy

copy ´Â Iterator ·Î ÁÖ¾îÁö´Â ¹üÀ§ÀÇ ¿ø¼Ò¸¦ ´Ù¸¥ ÄÁÅ×À̳ʷΠº¹»çÇϰíÀÚ ÇÒ¶§ »ç¿ëÇÑ´Ù.

template <class InputIterator, class OutputIterator>
OutputIterator copy(InputIterator first, InputIterator last,
                    OutputIterator result);
				
ù¹øÂ° ¾Æ±Ô¸ÕÆ®¿Í µÎ¹øÂ° ¾Æ±Ô¸ÕÆ®·Î ÁÖ¾îÁö´Â Iterator »çÀ̸¦ ¼øÈ¯Çϸç, À̵é Iterator »çÀÌÀÇ ¿ø¼ÒµéÀ» result ÀÌÅ×·¹ÀÌÅÍ·Î º¹»çÇÑ´Ù.
#include <algorithm>
#include <vector>
#include <list>

int main()
{
    vector<int> V;
    list<int> L(5);

    V.push_back(1);
    V.push_back(2);
    V.push_back(3);
    V.push_back(4);
    V.push_back(5);

    copy(V.begin(), V.end(), L.begin());

    list<int>::iterator mi = L.begin();

    while(mi != L.end())
    {
        cout << *mi << endl;
        *mi++;
    }
}
				
list ¸¦ ¼±¾ðÇÒ¶§ Å©±â¸¦ 5·Î ÁöÁ¤ÇÑ°É ÁÖ¸ñÇ϶ó. copy ¾Ë°í¸®ÁòÀº ÀÚµ¿ÀûÀ¸·Î ÄÁÅ×À̳ÊÀÇ Å©±â¸¦ ÇÒ´ç½ÃÄÑÁÖÁö ¾ÊÀ¸¹Ç·Î, ¹Ì¸® º¹»çµÉ ÄÁÅ×À̳ÊÀÇ Å©±â¸¦ ÁöÁ¤ÇØ ³õ¾Æ¾ß ÇÑ´Ù. list ¸¦ Å©±â¸¦ ÇÒ´ç½ÃŰÁö ¾Ê°í copy ÇØº¸¸é ÄÁÅ×À̳ÊÀÇ Å©±â°¡ ÇÒ´çµÇÁö ¾ÊÀ¸¹Ç·Î, ÇϳªÀÇ °ª¸¸ÀÌ º¹»çµÊÀ» ¾Ë¼ö ÀÖÀ»°ÍÀÌ´Ù. ÀÌ·²°æ¿ì list ÄÁÅ×À̳ʿ¡´Â 5 Çϳª¸¸ µé¾î°¡°Ô µÉ°ÍÀÌ´Ù.


2.2.2절. swap

swap ´Â ÀÎÀÚ·Î ÁÖ¾îÁø 2°³ÀÇ ÄÁÅ×À̳ÊÀÇ ¿ø¼Ò¸¦ ±³È¯Çϱâ À§Çؼ­ »ç¿ëµÈ´Ù.

template <class Assignable> 
void swap(Assignable& a, Assignable& b);
				
´ÙÀ½Àº swap ¸¦ »ç¿ëÇÑ °£´ÜÇÑ ¿¹ÀÌ´Ù.
#include <algorithm>
#include <vector>

int main()
{
    vector<int> V1;
    vector<int> V2;

    V1.push_back(3);
    V1.push_back(2);

    V2.push_back(100);
    V2.push_back(200);

    swap(V1, V2);

    cout << V1[0] << endl;
    cout << V2[0] << endl;
    cout << V2[1] << endl;
}
				


2.2.3절. reverse

ÄÁÅ×À̳ÊÀÇ ¿ø¼Ò¸¦ µÚ¹Ù²Û´Ù. Áï ù¹øÂ° ¿ø¼Ò´Â ¸¶Áö¸·À¸·Î, ¸¶Áö¸·¿ø¼Ò´Â ù¹øÂ°·Î ±³È¯ÇÏ°Ô µÈ´Ù. ÀÌ·¯ÇÑ °úÁ¤ÀÌ ¾Æ±Ô¸ÕÆ®·Î ÁÖ¾îÁø iterator »çÀÌÀÇ ¸ðµç ¿ø¼Ò¿¡ ´ëÇØ¼­ ¹ß»ýÇÏ°Ô µÈ´Ù.

template <class BidirectionalIterator>
void reverse(BidirectionalIterator first, BidirectionalIterator last);
				

#include <algorithm>
#include <vector>

int main()
{
    vector<char> V;

    V.push_back('a');
    V.push_back('b');
    V.push_back('c');
    V.push_back('d');

    copy(V.begin(), V.end(), ostream_iterator<char>(cout, " "));
    // a b c d °¡ Ãâ·ÂµÈ´Ù. 
    cout << endl;

    reverse(V.begin(), V.end());
    copy(V.begin(), V.end(), ostream_iterator<char>(cout, " "));
    // d c b a °¡ Ãâ·ÂµÈ´Ù. 
    cout << endl;

}
				


2.2.4절. remove

iterator ¹üÀ§³»¿¡¼­ ÀÏÄ¡µÇ´Â ƯÁ¤ ¿ø¼Ò¸¦ »èÁ¦ÇϰíÀÚ ÇÒ¶§ »ç¿ëÇÑ´Ù.

template <class ForwardIterator, class T>
ForwardIterator remove(ForwardIterator first, ForwardIterator last,
                       const T& value);
				

#include <algorithm>
#include <list>

int main()
{
    list<int> L;

    L.push_back(1);
    L.push_back(2);
    L.push_back(5);
    L.push_back(1);
    L.push_back(3);

    copy(L.begin(), L.end(), ostream_iterator<int>(cout, " "));
    cout << endl;
    // 1 2 5 1 3 ÀÌ Ãâ·ÂµÉ°ÍÀÌ´Ù. 

    list<int>::iterator mi = remove(L.begin(), L.end(), 1);
    copy(L.begin(), mi, ostream_iterator<int>(cout, " "));
    cout << endl;
    // 2 5 3 ÀÌ Ãâ·ÂµÉ°ÍÀÌ´Ù. 
}
				


2.2.5절. random_shuffle

²Ï Àç¹ÌÀÖ´Â ¾Ë°í¸®ÁòÀÌ´Ù. ÄÁÅ×À̳ʿ¡ Æ÷ÇÔµÈ ¿ø¼Ò¸¦ ·£´ýÇÏ°Ô À§Ä¡¸¦ Àç¹è¿­ ÇØÁÖ´Â ÀÏÀ»ÇÑ´Ù.

template <class RandomAccessIterator>
void random_shuffle(RandomAccessIterator first, RandomAccessIterator last);
				

#include <algorithm>
#include <vector>

int main()
{
    vector<char> V;

    V.push_back('a');
    V.push_back('b');
    V.push_back('c');
    V.push_back('d');
    V.push_back('e');

    copy(V.begin(), V.end(), ostream_iterator<char>(cout, " "));
    cout << endl;

    random_shuffle(V.begin(), V.end());
    copy(V.begin(), V.end(), ostream_iterator<char>(cout, " "));
    cout << endl;

    random_shuffle(V.begin(), V.end());
    copy(V.begin(), V.end(), ostream_iterator<char>(cout, " "));
    cout << endl;

    random_shuffle(V.begin(), V.end(), 2);
    copy(V.begin(), V.end(), ostream_iterator<char>(cout, " "));
    cout << endl;
}
				


2.2.6절. unique

À̰ÍÀº ÄÁÅ×À̳ÊÁß¿¡ Áߺ¹µÈ ¿ä¼Ò¸¦ ¾ø¾ÚÀ¸·Î ¿ÀÁ÷ À¯ÀÏÇÑ ¿ä¼Òµé¸¸À» °¡Áöµµ·Ï ¸¸µé¾îÁØ´Ù.

template <class ForwardIterator>
ForwardIterator unique(ForwardIterator first, ForwardIterator last);
				
ÀÎÀÚ·Î ÁÖ¾îÁö´Â first ¿Í last iterator »çÀ̸¦ ¼øÈ¯Çϸç, Áߺ¹µÇ´Â °ªÀ» °¡Áö´Â ¿ø¼Ò°¡ ÀÖÀ»°æ¿ì óÀ½ ¿ø¼Ò¸¸ ±×´ë·Î µÎ°í ±×µÚ¿¡ ¿À´Â ¿ø¼ÒµéÀ» ¸ðµÎ »èÁ¦ÇÑ´Ù.
#include <algorithm>
#include <vector>

int main()
{
    vector<int> V;
    V.push_back(3);
    V.push_back(6);
    V.push_back(1);
    V.push_back(2);
    V.push_back(2);
    V.push_back(1);
    V.push_back(3);


	sort(V.begin(). V.end());
    copy(V.begin(), V.end(), ostream_iterator<int>(cout, " "));

    cout << endl;
	// 1 1 2 2 3 3 6 ÀÌ Ãâ·ÂµÈ´Ù. 

    vector<int>::iterator new_end = unique(V.begin(), V.end());
    copy(V.begin(), new_end, ostream_iterator<int>(cout, " "));
    cout << endl;
	// 1 2 3 6 ÀÌ Ãâ·ÂµÈ´Ù. 
}
				


2.3절. Sorting ¾Ë°í¸®Áòµé

Á¦¸ñ¿¡ ÇöȤµÇÁö ¸»±â¹Ù¶õ´Ù. ÄÁÅ×À̳ʿ¡ Æ÷ÇÔµÈ ¿ø¼Ò¸¦ Á¤·ÄÇÏ´Â ±×·± ¾Ë°í¸®ÁòµéÀ» ¶æÇÏ´Â°Ô ¾Æ´Ï´Ù. ¿©±â¿¡¼­ ¸»ÇÏ´Â Sorting À̶õ ¿ø¼Ò°¡ ¹Ì¸® Á¤·ÄµÇ¾îÀÖ´Â À» ¶æÇÑ´Ù. ¿©±â¿¡¼­ ¼Ò°³µÉ ¾Ë°í¸®ÁòµéÀ» Á¦´ë·Î »ç¿ëÇϱâ À§Çؼ­´Â °¢ ÄÁÅ×À̳ÊÀÇ ¿ø¼Ò°¡ ¹Ì¸® ¼ÒÆÃµÇ¾î ÀÖ¾î¾ß¸¸ Á¦´ë·ÎµÈ °á°ú¸¦ ¾òÀ»¼ö Àֱ⠶§¹®ÀÌ´Ù.(sort ¾Ë°í¸®ÁòÀº Á¦¿Ü)


2.3.1절. sort

°¡Àå °£´ÜÇÏ¸ç °¡Àå ÀÚÁÖ »ç¿ëµÇ´Â ¾Ë°í¸®ÁòÀÌ´Ù.

template <class RandomAccessIterator>
void sort(RandomAccessIterator first, RandomAccessIterator last);

template <class RandomAccessIterator, class StrictWeakOrdering>
void sort(RandomAccessIterator first, RandomAccessIterator last,
          StrictWeakOrdering comp);
				
ÀÎÀÚ·Î ÁÖ¾îÁö´Â first ¿Í last ÀÌÅÍ·¹ÀÌÅÍ »çÀ̸¦ ¼øÈ¯Çϸ鼭 ¼ÒÆÃÇÑ´Ù.

±×·±µ¥ ±× ¹Ø¿¡ ÀÖ´Â ¿À¹ö·ÎµùµÈ ¶Ç´Ù¸¥ sort ¹öÁ¯ÀÇ °æ¿ì comp °¡ Ãß°¡·Î µé¾î°¡´Â°ÍÀ» ¾Ë¼ö ÀÖ´Ù. À̰ÍÀº ÇÔ¼ö°´Ã¼·Î½á, ºñ±³¸¦ À§ÇÑ ÇÔ¼ö¸¦ »ç¿ëÇϰíÀÚ ÇÒ¶§ »ç¿ëµÈ´Ù. ¿¹¸¦µé¾î¼­ ÄÁÅ×À̳ʿ¡ µé¾îÀִ ŸÀÔÀÌ int À̰ųª, string Àϰæ¿ì¿¡´Â ºñ±³¿¬»êÀÌ µÇ¹Ç·Î ±»ÀÌ comp ÇÔ¼ö°´Ã¼¸¦ ÇÊ¿ä·Î ÇÏÁö ¾ÊÀ»°ÍÀÌ´Ù. ±×·¯³ª char * °°Àº°æ¿ì¿¡´Â ºñ±³¿¬»êÀÌ µÇÁö ¾ÊÀ¸¹Ç·Î, ÀÌ·²°æ¿ì¿¡´Â º°µµÀÇ ºñ±³¿¬»êÀ» À§ÇÑ ÇÔ¼ö°´Ã¼°¡ ÇÊ¿äÇÏ´Ù.

#include <algorithm>
#include <vector>
#include <string>

bool case_eq(char *c1,  char *c2) 
{ 
    if (strcmp(c1, c2) < 0)
        return 1;
    else
        return 0;
} 
int main()
{
    vector<int> V;
    V.push_back(4);
    V.push_back(7);
    V.push_back(2);
    V.push_back(3);
    V.push_back(1);
    V.push_back(6);

    sort(V.begin(), V.end());
    copy(V.begin(), V.end(), ostream_iterator<int>(cout, "\n")); 

    vector<char *> V2;
    V2.push_back("my name");
    V2.push_back("hello");
    V2.push_back("ma name");
    V2.push_back("hael");

    // ¸¸¾à case_eq ÇÔ¼ö°´Ã¼¸¦ »ç¿ëÇÏÁö ¾Ê´Â´Ù¸é sort µÇÁö ¾ÊÀ»°ÍÀÌ´Ù. 
    sort(V2.begin(), V2.end(), case_eq);
    copy(V2.begin(), V2.end(), ostream_iterator<char *>(cout, "\n")); 
}
				
À§ÀÇ ¿¹Á¦¸¦ º¸¸é ÇÔ¼ö°´Ã¼°¡ ¾î¶»°Ô »ç¿ëµÇ´ÂÁö ¾Ë¼ö ÀÖÀ»°ÍÀÌ´Ù. ÀÌ ÇÔ¼ö°´Ã¼¸¦ ¾à°£¸¸ ¼öÁ¤ÇÏ¸é ¼ÒÆÃÀ» ¿ªÀ¸·Î ÇÒ¼öµµ ÀÖ´Ù. ´ÜÁö strcmp(c1, c2) < 0 À» strcmp(c1, c2) > 0 À¸·Î¸¸ ¹Ù²ãÁÖ¸é µÈ´Ù.


2.3.2절. lower_bound ¿Í upper_bound

À̸§¿¡¼­ ¾Ë¼ö ÀÖµíÀÌ À̰͵éÀº ÄÁÅ×À̳ʿ¡¼­ ¿øÇÏ´Â ¿ä¼Ò¿Í ¿¬¼ÓÀûÀ¸·Î ÀÏÄ¡Çϴ ù¹øÂ° À§Ä¡¿Í ¸¶Áö¸· À§Ä¡¸¦ ¾Ë¾Æ³»±â À§Çؼ­ »ç¿ëÇÑ´Ù. STL ÀÇ ÄÁÅ×À̳ʸ¦ °øºÎÇß´Ù¸é multimap À̳ª multiset ¿¡ °°ÀºÀ̸§ÀÇ ÇÔ¼ö¸¦ º»ÀûÀÌ ÀÖÀ»°ÍÀÌ´Ù. À̵é°ú °°Àº ÀÏÀ»ÇÑ´Ù.

#include <vector>
#include <algorithm>

int main()
{
    vector<int> V;
    V.push_back(1);
    V.push_back(1);
    V.push_back(2);
    V.push_back(2);
    V.push_back(2);
    V.push_back(3);
    V.push_back(4);
    V.push_back(5);
    V.push_back(2);

    vector<int>::iterator m_start = lower_bound(V.begin(), V.end(), 2);
    vector<int>::iterator m_end   = upper_bound(V.begin(), V.end(), 2);

    copy(m_start, m_end, ostream_iterator<int>(cout, " "));
    // 2 2 2  °¡ Ãâ·ÂµÉ°ÍÀÌ´Ù.  
    // ¸¶Áö¸·ÀÇ 2´Â ¿¬¼ÓµÈ °ªÀÌ ¾Æ´ÔÀ¸·Î ¹«½ÃµÈ´Ù.  
}
				


2.3.3절. merge

2°³ÀÇ ÄÁÅ×À̳ÊÀÇ ¿ø¼Ò¸¦ °áÇÕÇÑ´Ù. ÄÁÅ×À̳ÊÀÇ ¿ø¼ÒµéÀº °áÇյǸ鼭 ÀÚµ¿ÀûÀ¸·Î sort µÈ´Ù. ¸¸¾à ¿ø¼Ò°¡ ºñ±³¿¬»êÀ» Áö¿øÇÏÁö ¾Ê´Â ŸÀÔÀÇ ¿ø¼Ò¶ó¸é ºñ±³°´Ã¼ ÇÔ¼ö¸¦ Á¤ÀÇÇØ¼­ »ç¿ëÇÏ¸é µÈ´Ù. À̿ܿ¡µµ ÇÔ¼ö°´Ã¼´Â ¾Ë°í¸®ÁòÀÇ ¿¬»êÀ» ¹æ½ÄÀ» º¯°æÇϱâ À§ÇÑ ¿ëµµ·Îµµ »ç¿ëµÈ´Ù. ÀÌ ¾Ë°í¸®ÁòÀ» Àû¿ëÇϱâ À§Çؼ­´Â °¢ ÄÁÅ×À̳ÊÀÇ ¿ø¼Ò°¡ ¹Ì¸® Á¤·ÄµÇ¾î ÀÖ¾î¾ß ÇÑ´Ù.

template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator merge(InputIterator1 first1, InputIterator1 last1,
                     InputIterator2 first2, InputIterator2 last2,
                     OutputIterator result);

template <class InputIterator1, class InputIterator2, class OutputIterator,
          class StrictWeakOrdering>
OutputIterator merge(InputIterator1 first1, InputIterator1 last1,
                     InputIterator2 first2, InputIterator2 last2,
                     OutputIterator result, StrictWeakOrdering comp);
				
merge µÈÈÄÀÇ °ªÀº result ·Î Ãâ·Â°¡´ÉÇÏ´Ù.
#include <vector>
#include <algorithm>

int main()
{
    vector<int> V1;
    vector<int> V2;

    V1.push_back(1);
    V1.push_back(3);
    V1.push_back(5);

    V2.push_back(2);
    V2.push_back(4);
    V2.push_back(5);
    V2.push_back(6);

    merge(V1.begin(), V1.end(), V2.begin(), V2.end(), ostream_iterator<int>(cout, " "));
    cout << endl;
}
				
¸¸¾à ¿ø¼Ò°¡ ºñ±³¿¬»êÀÌ ºÒ°¡´ÉÇÑ char * °ú °°Àº ÇüÀϰæ¿ì¿¡´Â °´Ã¼ÇÔ¼ö comp ¸¦ Á¤ÀÇÇÏ¸é µÈ´Ù. Á¤ÀÇ ¹æ¹ýÀÎ ÀÌÀü¿¡ ÀÌ¹Ì ¼³¸íÇßÀ½À¸·Î ±×³É ³Ñ¾î°¡µµ·Ï ÇϰڴÙ.


2.3.4절. set_union, set_intersection, set_difference

°¢°¢ ÇÕÁýÇÕ, ±³ÁýÇÕ, Â÷ÁýÇÕÀ» ±¸ÇöÇÏ´Â ¾Ë°í¸®ÁòÀÌ´Ù. ¶§¿¡ µû¶ó¼­ ¸Å¿ì À¯¿ëÇÏ°Ô »ç¿ëÇÒ¼ö ÀÖÀ»°ÍÀÌ´Ù.

template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_union(InputIterator1 first1, InputIterator1 last1,
                         InputIterator2 first2, InputIterator2 last2,
                         OutputIterator result);

template <class InputIterator1, class InputIterator2, class OutputIterator,
          class StrictWeakOrdering>
OutputIterator set_union(InputIterator1 first1, InputIterator1 last1,
                         InputIterator2 first2, InputIterator2 last2,
                         OutputIterator result, 
                         StrictWeakOrdering comp);
				
set_union ¾Ë°í¸®Áò¸¸ Ãâ·ÂÇߴµ¥, ´Ù¸¥°Íµé¿ª½Ã À̸§¸¸ ´Ù¸£°í µ¿ÀÏÇÏ°Ô »ç¿ëÇÒ¼ö ÀÖ´Ù. ºñ±³°´Ã¼ ÇÔ¼öÀÎ comp ¸¦ Á¤ÀÇÇÔÀ¸·Î½á, °á°ú°ªÀ» sort ÇÒ¼öÀÖ´Ù. comp ¸¦ ÀÌ¿ëÇØ¼­ ¾Ë°í¸®ÁòÀÇ ¿¬»ê¹æ½ÄÀ» º¯°æ½ÃÄÑÁÙ¼ö ÀÖ´Ù.

¶ÇÇÑ ÄÁÅ×À̳ʿ¡ ÀԷµǾî ÀÖ´Â ¿ø¼ÒµéÀº ¹Ì¸® sort µÇ¾î ÀÖ¾î¾ß ÇÑ´Ù.

#include <algorithm>
#include <vector>

int main()
{
    vector<int> V1, V2;

    V1.push_back(1);
    V1.push_back(2);
    V1.push_back(3);
    V1.push_back(4);
    V1.push_back(7);

    V2.push_back(0);
    V2.push_back(1);
    V2.push_back(7);
    V2.push_back(8);
    V2.push_back(9);


    set_union(V1.begin(), V1.end(), V2.begin(), V2.end(), ostream_iterator<int>(cout, " "));
    cout << endl;
    // 0 1 2 3 4 7 8 9 

    set_intersection(V1.begin(), V1.end(), V2.begin(), V2.end(), ostream_iterator<int>(cout, " "));
    cout << endl;
    // 1 7 ÀÌ Ãâ·ÂµÈ´Ù. 

    set_difference(V1.begin(), V1.end(), V2.begin(), V2.end(), ostream_iterator<int>(cout, " "));
    cout << endl;
    // 2 3 4 ÀÌ Ãâ·ÂµÈ´Ù. 
}
				


2.4절. Generalized numeric algorithms

À̹ø¿¡´Â ¼öÄ¡¾Ë°í¸®Áò¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ. ÀÌµé ¼öÄ¡ ¾Ë°í¸®ÁòÀ» »ç¿ëÇϱâ À§Çؼ­´Â numeric ¸¦ include ½ÃÄÑ¾ß ÇÑ´Ù.


2.4.1절. accumulate

ÄÁÅ×À̳ÊÀÇ ¸ðµç ¿ø¼Ò¸¦ ´õÇϱâ À§Çؼ­ »ç¿ëÇÑ´Ù.

template <class InputIterator, class T>
T accumulate(InputIterator first, InputIterator last, T init);

template <class InputIterator, class T, class BinaryFunction>
T accumulate(InputIterator first, InputIterator last, T init,
             BinaryFunction binary_op);
				
ù¹øÂ°¿Í µÎ¹øÂ° ÀÎÀÚ´Â ¾Ë°í¸®ÁòÀ» Àû¿ëÇÒ ¿ø¼ÒÀÇ ¹üÀ§¸¦ ÁöÁ¤Çϱâ À§ÇÑ ÀÌÅÍ·¹ÀÌÅÍ À̸ç, ¼¼¹øÂ° ¾Æ±Ô¸ÕÆ®´Â ÃʱⰪÀÌ´Ù. ¶ÇÇÑ ´Ù¸¥ ¸¹Àº ¾Ë°í¸®Áò°ú ¸¶Âù°¡Áö·Î ÇÔ¼ö °´Ã¼¸¦ ÀÌ¿ëÇØ¼­ ¾Ë°í¸®ÁòÀÇ ¿¬»ê¹æ½ÄÀ» º¯°æ½Ãų¼öµµ ÀÖ´Ù.
#include <numeric>
#include <vector>

int mysum(int a, int b)
{
    return a * b;
}

int main()
{
    vector<int> V;

    V.push_back(1);
    V.push_back(2);
    V.push_back(3);
    V.push_back(4);
    V.push_back(5);
    V.push_back(6);
    V.push_back(7);

    cout << accumulate(V.begin(), V.end(), 0) << endl;
    // 120
    cout << accumulate(V.begin(), V.end(), 1, mysum) << endl;
    // 5040
}
				
2¹øÂ° accumulate ¸¦ Àû¿ë½Ãų¶§´Â mysum À̶ó´Â ÇÔ¼ö °´Ã¼¸¦ ÀÌ¿ëÇØ¼­ ±âÁ¸ÀÇ '+' ¿¬»êÀ» '*' ¿¬»êÀ» Çϵµ·Ï º¯°æÇßÀ½À» ¾Ë¼ö ÀÖ´Ù.


2.4.2절. partical_sum

partical_sum Àº x0, x0 + x1, x0 + x1 + x3 °ú °°Àº ¿¬»êÀ» ÇÒ¶§ »ç¿ëÇÑ´Ù.

template <class InputIterator, class OutputIterator>
OutputIterator partial_sum(InputIterator first, InputIterator last,
                           OutputIterator result);

template <class InputIterator, class OutputIterator, class BinaryOperation>
OutputIterator partial_sum(InputIterator first, InputIterator last,
                           OutputIterator result, BinaryOperation binary_op);
				
ù¹øÂ°¿Í µÎ¹øÂ° ¾Æ±Ô¸ÕÆ®´Â ÄÁÅ×À̳ʿ¡¼­ ¾Ë°í¸®ÁòÀ» Àû¿ëÇÒ ±¸°£ÀÇ iterator °ªÀÌ´Ù. ´Ù¸¥ ¾Ë°í¸®Áò°ú ¸¶Âù°¡Áö·Î ÇÔ¼ö°´Ã¼¸¦ ÀÌ¿ëÇØ¼­ ¾Ë°í¸®ÁòÀÇ ¿¬»êÀ» º¯°æÇÒ¼ö ÀÖ´Ù.
#include <numeric>
#include <vector>
#include <algorithm>

int mysum(int a, int b)
{
    return a * b;
}

int main()
{
    vector<int> V;

    V.push_back(1);
    V.push_back(2);
    V.push_back(3);
    V.push_back(4);
    V.push_back(5);

    partial_sum(V.begin(), V.end(), ostream_iterator<int>(cout, " "));
    cout << endl;
    
    partial_sum(V.begin(), V.end(), ostream_iterator<int>(cout, " "), mysum);
    cout << endl;
}
				
ù¹øÂ° partial_sum Àº 1, 1+2, 1+2+3, 1+2+3+4 .. ÀÇ ¿¬»êÀ» ¼öÇàÇÒ°ÍÀÌ´Ù. ¹Ý¸é µÎ¹øÂ° ¿¬»êÀº ÇÔ¼ö°´Ã¼¿¡ ÀÇÇØ¼­ 1, 1*2, 1*2*3, 1*2*3 .. ÀÇ ¿¬»êÀ» ¼öÇàÇÏ°Ô µÉ°ÍÀÌ´Ù.


2.4.3절. adjacent_difference

À̰ÍÀº x0, x1 - x0, x2 - x1.. °ú °°ÀÌ ÀÎÁ¢ÇÑ µÎ¿ø¼ÒÀÇ Â÷¸¦ ±¸ÇÑ´Ù.

template <class InputIterator, class OutputIterator>
OutputIterator adjacent_difference(InputIterator first, InputIterator last, 
                                   OutputIterator result);

template <class InputIterator, class OutputIterator, class BinaryFunction>
OutputIterator adjacent_difference(InputIterator first, InputIterator last,
                                   OutputIterator result,
                                   BinaryFunction binary_op);
				
¿ª½Ã ±¸°£À» Á¤Çϱâ À§ÇÑ 2°³ÀÇ iterator °¡ »ç¿ëµÇ¸ç, ¾Ë°í¸®ÁòÀÇ ¿¬»êÀ» º¯°æÇϱâ À§ÇÑ ÇÔ¼ö°´Ã¼°¡ »ç¿ëµÇ±âµµ ÇÑ´Ù.
	
#include <numeric>
#include <vector>

int mysum(int a, int b)
{
    return a * b;
}

int main()
{
    vector<int> V;

    V.push_back(1);
    V.push_back(2);
    V.push_back(3);
    V.push_back(4);
    V.push_back(5);

    adjacent_difference(V.begin(), V.end(), ostream_iterator<int>(cout, " "));
    cout << endl;
    adjacent_difference(V.begin(), V.end(), ostream_iterator<int>(cout, " "), mysum);
    cout << endl;
}
				


2.4.4절. inner_product

À̰ÍÀº µÎ°³ÀÇ ÄÁÅ×À̳ÊÀÇ ¿ø¼ÒµéÀÇ ³»ÀûÀ» ±¸ÇϰíÀÚ ÇÒ¶§ »ç¿ëµÈ´Ù. Áï A ¿Í B ÄÁÅ×À̳ÊÀÇ ³»ÀûÀ» ±¸ÇÑ´Ù¸é A0 X B0 + A1 X B1 + ... An X Bn °ø½ÄÀ» µû¸£°Ô µÉ°ÍÀÌ´Ù.

Inner_product is an overloaded name; there are actually two inner_product functions. 
template <class InputIterator1, class InputIterator2, class T>
T inner_product(InputIterator1 first1, InputIterator1 last1,
                InputIterator2 first2, T init);

template <class InputIterator1, class InputIterator2, class T,
          class BinaryFunction1, class BinaryFunction2>
T inner_product(InputIterator1 first1, InputIterator1 last1,
                InputIterator2 first2, T init, BinaryFunction1 binary_op1,
                BinaryFunction2 binary_op2);
				
#include <numeric>
#include <vector>
#include <algorithm>

int mysum(int a, int b)
{
    return a * b;
}

int main()
{
    vector<int> V1;
    vector<int> V2;

    V1.push_back(1);
    V1.push_back(2);
    V1.push_back(3);
    V1.push_back(4);

    V2.push_back(5);
    V2.push_back(6);
    V2.push_back(7);
    V2.push_back(8);
    V2.push_back(9);

    cout << inner_product(V1.begin(), V1.end(), V2.begin(), 0) << endl;
}
				
À§ÀÇ °á°ú°ªÀº 1*5+2*6+3*7+4*8 = 70 ÀÌ µÉ°ÍÀÌ´Ù.

EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.