|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
STL(5) - algorithm
Áö±Ý±îÁö STL ÀÇ ¿©·¯°¡Áö ±â´É¿¡ ´ëÇØ¼ ¾Ë¾Æº¸¾Ò´Âµ¥, ÀÌ·¯ÇÑ ±â´ÉµéÀº
°á±¹ STL À» ÀÌ¿ëÇÑ ÀڷᱸÁ¶·Î½áÀÇ ±â´É¿¡ ÃÐÁ¡ÀÌ ¸ÂÃß¾îÁ® ÀÖÀ½À» ¾Ë¼ö
ÀÖ´Ù. STLÀº ÀÌ·¯ÇÑ ÀڷᱸÁ¶¸¦ ½±°í À¯¿¬ÇÏ°Ô ±¸ÇöÇØÁÖ±â À§ÇÑ µµ±¸¶ó°í
ÇÒ¼ö ÀÖÀ»°ÍÀÌ´Ù.
ÀڷᱸÁ¶°¡ »ç¿ëµÇ¸é ºüÁöÁö ¾Ê°í µû¶ó´Ù´Ï´Â°Ô Àִµ¥, ¹Ù·Î
¾Ë°í¸®Áò µéÀÌ´Ù. (¾Æ¸¶µµ °¡Àå ¸¹ÀÌ »ç¿ëµÇ´Â°Ô sort, search °ú °°Àº
¾Ë°í¸®ÁòµéÀϰÍÀÌ´Ù.)
STL ¿¡¼´Â ¿©·¯°¡Áö ÄÁÅ×À̳ʵé·Î ±¸¼ºµÈ ÀڷᱸÁ¶ÀÇ ¿¬»êÀ» À§ÇÑ
´Ù¾çÇÑ ¾Ë°í¸®ÁòÀ» Á¦°øÇÑ´Ù.
¾Ë°í¸®ÁòÀ» »ç¿ëÇϱâ À§Çؼ´Â ´ÙÀ½°ú °°ÀÌ Çì´õÆÄÀÏÀ» ¼±¾ðÇØ
ÁÖ¾î¾ß ÇÑ´Ù.
STL¿¡¼ Á¦°øÇÏ´Â ¾Ë°í¸®ÁòµéÀº ±× Ư¼º¿¡ µû¶ó¼ ¸î°¡Áö Á¾·ù·Î
ºÐ·ùÇÒ¼ö ÀÖ´Ù. "Non-mutating algorithms", "Mutating algorithms",
"Sorting algorithms", Generalized numeric algorithms" µîÀÌ´Ù.
ÀÌÁ¦ ºÎÅÍ ÀÌ·¯ÇÑ ºÐ·ùº°·Î °¢°¢ÀÇ ºÐ·ù¿¡ Æ÷ÇÔµÈ ¾Ë°í¸®ÁòÀ»
¼³¸íÇϵµ·ÏÇϰڴÙ. ±×·¯³ª ¿ö³«¿¡ ¸¹Àº ¾Ë°í¸®ÁòÀÌ Á¸ÀçÇϰí (´ë·« 50¿©°¡Áö)
ÀÌµé ¾Ë°í¸®ÁòÁß¿¡´Â °ÅÀÇ »ç¿ëµÇ¾îÁöÁö ¾Ê´Â ¾Ë°í¸®Áòµéµµ ÀÖÀ¸¹Ç·Î,
ÀÚÁÖ »ç¿ëµÈ´Ù°í »ý°¢µÇ´Â ¾Ë°í¸®Áòµé¸¸À» ¼³¸íÇϵµ·Ï ÇÒ°ÍÀÌ´Ù.
³ª¸ÓÁö ¾Ë°í¸®Áò¿¡ ´ëÇÑ Á¤º¸¸¦ ¾Ë±â¸¦ ¿øÇÑ´Ù¸é
SGI STL Ȩ ¹®¼¸¦ Âü°íÇÏ±æ ¹Ù¶õ´Ù.
mutating Àº "º¯È", "º¯°æ" ÀÇ ¶æÀ» °¡Áø´Ù. None-mutating algorithms
¿¡ Æ÷ÇԵǴ ¾Ë°í¸®ÁòµéÀº ÄÁÅ×À̳ʵéÀÇ ¿ø¼Ò¿¡ ´ëÇØ¼ None-mutating
Áï ÄÁÅ×À̳ʸ¦ º¯°æ½ÃŰÁö ¾Ê´Â Ư¼ºÀ» °¡Áö°í ÀÖ´Ù.
¿¹¸¦µé¾î¼ search ³ª, ¿ø¼ÒÀÇ °¹¼ö¸¦ ¼¼´Â count µîÀÇ ¾Ë°í¸®ÁòÀº
ÄÁÅ×À̳ʿ¡¼ ÇÊ¿äÇÑ ¿ø¼Ò¸¦ ã°Å³ª, °è¼ö¸¦ ÇÏ´Â ÀÏÀ» ÇÒ»ÓÀ¸·Î,
ÄÁÅ×À̳ʸ¦ º¯°æ(¿ø¼Ò¸¦ »èÁ¦Çϰųª, À§Ä¡¸¦ º¯°æ½ÃŰ°Å³ª)ÇÏ´Â
ÀÏÀ» ¼öÇàÇÏÁö ¾ÊÀ»°ÍÀÌ´Ù. ±×·±ÀÌÀ¯·Î ÀÌ·¯ÇÑ ¾Ë°í¸®ÁòµéÀ»
None-mutating(º¯°æºÒ°¡) ¾Ë°í¸®ÁòÀ̶ó°í ºÎ¸¥´Ù.
(¸»Àº ¹«Áö º¹ÀâÇѵ¥ °³³äÀº ¹«Áö °£´ÜÇÏ´Ù´Â°É ¾Ë¼ö ÀÖÀ»°ÍÀÌ´Ù.)
¾Æ¸¶µµ °¡À帹ÀÌ »ç¿ëµÇ´Â ¾Ë°í¸®ÁòÀÏ °ÍÀÌ´Ù. ÄÁÅ×À̳ʿ¡¼
ÀÏÁ¤ÇÑ ¹üÀ§ÀÇ ¿ø¼Òµé»çÀÌ¿¡¼ ¿øÇÏ´Â °ªÀ» ã´Â´Ù. ÀÌ ¹üÀ§´Â
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;
}
|
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;
}
|
À̰͵éÀº º¯°æ°¡´ÉÇÑ ¾Ë°í¸®Áòµé·Î½á, ÄÁÅ×À̳ÊÀÇ ¿ø¼Ò¸¦ ¼öÁ¤ÇÒ¼ö ÀÖ´Ù.
ÄÁÅ×ÀÌ³Ê ¿ø¼Ò¸¦ º¹»çÇϰųª, ±³Ã¼, »èÁ¦ ÇϴµîÀÇ ÀÛ¾÷À» ¼öÇàÇÑ´Ù.
ÀÌ·¯ÇÑ ÀÛ¾÷ ¼öÇàÁß¿¡ ¿ø¼ÒÀÇ ³»¿ëÀÌ º¯°æµÇ¹Ç·Î Mutating ¾Ë°í¸®ÁòÀ̶ó°í ÇÑ´Ù.
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 Çϳª¸¸ µé¾î°¡°Ô µÉ°ÍÀÌ´Ù.
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;
}
|
ÄÁÅ×À̳ÊÀÇ ¿ø¼Ò¸¦ µÚ¹Ù²Û´Ù. Áï ù¹øÂ° ¿ø¼Ò´Â ¸¶Áö¸·À¸·Î, ¸¶Áö¸·¿ø¼Ò´Â ù¹øÂ°·Î
±³È¯ÇÏ°Ô µÈ´Ù. ÀÌ·¯ÇÑ °úÁ¤ÀÌ ¾Æ±Ô¸ÕÆ®·Î ÁÖ¾îÁø 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;
}
|
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 ÀÌ Ãâ·ÂµÉ°ÍÀÌ´Ù.
}
|
²Ï Àç¹ÌÀÖ´Â ¾Ë°í¸®ÁòÀÌ´Ù. ÄÁÅ×À̳ʿ¡ Æ÷ÇÔµÈ ¿ø¼Ò¸¦ ·£´ýÇÏ°Ô À§Ä¡¸¦ Àç¹è¿
ÇØÁÖ´Â ÀÏÀ»ÇÑ´Ù.
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;
}
|
À̰ÍÀº ÄÁÅ×À̳ÊÁß¿¡ Áߺ¹µÈ ¿ä¼Ò¸¦ ¾ø¾ÚÀ¸·Î ¿ÀÁ÷ À¯ÀÏÇÑ ¿ä¼Òµé¸¸À» °¡Áöµµ·Ï
¸¸µé¾îÁØ´Ù.
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 ÀÌ Ãâ·ÂµÈ´Ù.
}
|
Á¦¸ñ¿¡ ÇöȤµÇÁö ¸»±â¹Ù¶õ´Ù. ÄÁÅ×À̳ʿ¡ Æ÷ÇÔµÈ ¿ø¼Ò¸¦ Á¤·ÄÇÏ´Â ±×·± ¾Ë°í¸®ÁòµéÀ»
¶æÇÏ´Â°Ô ¾Æ´Ï´Ù. ¿©±â¿¡¼ ¸»ÇÏ´Â Sorting À̶õ ¿ø¼Ò°¡ ¹Ì¸® Á¤·ÄµÇ¾îÀÖ´Â À» ¶æÇÑ´Ù.
¿©±â¿¡¼ ¼Ò°³µÉ ¾Ë°í¸®ÁòµéÀ» Á¦´ë·Î »ç¿ëÇϱâ À§Çؼ´Â °¢ ÄÁÅ×À̳ÊÀÇ ¿ø¼Ò°¡
¹Ì¸® ¼ÒÆÃµÇ¾î ÀÖ¾î¾ß¸¸ Á¦´ë·ÎµÈ °á°ú¸¦ ¾òÀ»¼ö Àֱ⠶§¹®ÀÌ´Ù.(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 À¸·Î¸¸ ¹Ù²ãÁÖ¸é µÈ´Ù.
À̸§¿¡¼ ¾Ë¼ö ÀÖµíÀÌ À̰͵éÀº ÄÁÅ×À̳ʿ¡¼ ¿øÇÏ´Â ¿ä¼Ò¿Í ¿¬¼ÓÀûÀ¸·Î ÀÏÄ¡ÇÏ´Â
ù¹øÂ° À§Ä¡¿Í ¸¶Áö¸· À§Ä¡¸¦
¾Ë¾Æ³»±â À§Çؼ »ç¿ëÇÑ´Ù. 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°³ÀÇ ÄÁÅ×À̳ÊÀÇ ¿ø¼Ò¸¦ °áÇÕÇÑ´Ù. ÄÁÅ×À̳ÊÀÇ ¿ø¼ÒµéÀº °áÇÕµÇ¸é¼ ÀÚµ¿ÀûÀ¸·Î 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 ¸¦
Á¤ÀÇÇÏ¸é µÈ´Ù. Á¤ÀÇ ¹æ¹ýÀÎ ÀÌÀü¿¡ ÀÌ¹Ì ¼³¸íÇßÀ½À¸·Î ±×³É ³Ñ¾î°¡µµ·Ï ÇϰڴÙ.
°¢°¢ ÇÕÁýÇÕ, ±³ÁýÇÕ, Â÷ÁýÇÕÀ» ±¸ÇöÇÏ´Â ¾Ë°í¸®ÁòÀÌ´Ù. ¶§¿¡ µû¶ó¼ ¸Å¿ì À¯¿ëÇϰÔ
»ç¿ëÇÒ¼ö ÀÖÀ»°ÍÀÌ´Ù.
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 ÀÌ Ãâ·ÂµÈ´Ù.
}
|
À̹ø¿¡´Â ¼öÄ¡¾Ë°í¸®Áò¿¡ ´ëÇØ¼ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ. ÀÌµé ¼öÄ¡
¾Ë°í¸®ÁòÀ» »ç¿ëÇϱâ À§Çؼ´Â numeric ¸¦
include ½ÃÄÑ¾ß ÇÑ´Ù.
ÄÁÅ×À̳ÊÀÇ ¸ðµç ¿ø¼Ò¸¦ ´õÇϱâ À§Çؼ »ç¿ëÇÑ´Ù.
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 À̶ó´Â ÇÔ¼ö °´Ã¼¸¦
ÀÌ¿ëÇØ¼ ±âÁ¸ÀÇ '+' ¿¬»êÀ» '*' ¿¬»êÀ» Çϵµ·Ï º¯°æÇßÀ½À»
¾Ë¼ö ÀÖ´Ù.
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 .. ÀÇ ¿¬»êÀ» ¼öÇàÇÏ°Ô µÉ°ÍÀÌ´Ù.
À̰ÍÀº 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;
}
|
À̰ÍÀº µÎ°³ÀÇ ÄÁÅ×À̳ÊÀÇ ¿ø¼ÒµéÀÇ ³»ÀûÀ» ±¸ÇϰíÀÚ
ÇÒ¶§ »ç¿ëµÈ´Ù. Áï 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 ÀÌ µÉ°ÍÀÌ´Ù.
|
|