Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
STL References 17. STL ReferencesSTL¿¡ °üÇÑ ´ÙÀ½ »çÀÌÆ®µéÀ» ¹æ¹®Çغ¸¶ó :
STL tutorials:
Main STL sites:
17.1. STL °³¿äSTLÀº ÇÁ·Î±×·¡¸Ó¿¡°Ô ¸î°¡Áö À¯¿ëÇÑ µ¥ÀÌÅͱ¸Á¶¿Í ¾Ë°í¸®ÁòÀ» Á¦°øÇÑ´Ù.
ÀÌ´Â ´ÙÀ½°ú °°Àº °ÍµéÀÌ ÀÖ´Ù.
ÄÁÅ×À̳Ê. µÎ °¡Áö ŸÀÔÀÌ ÀÖ´Ù :
¼øÂ÷Àû (Sequential). ¿©±â¿¡´Â vector, list, deque µîÀÌ ÀÖ´Ù.
Á¤·ÄµÈ Á¶ÇÕ (Associative). ¿©±â¿¡´Â set, map, multiset, multimap ÀÌ ÀÖ´Ù.
Iterator. ÄÁÅ×À̳ÊÀÇ ³»¿ëÀ» »ìÆìº¼ ¼ö ÀÖ°Ô ÇØÁÖ´Â Æ÷ÀÎÅÍ °°Àº °ÍµéÀÌ´Ù.
ÀϹÝÀûÀÎ (generic) ¾Ë°í¸®Áòµé. STLÀº ÄÁÅ×ÀÌ³Ê Å¸ÀÔ¿¡ ´ëÇØ µ¿ÀÛÇÏ´Â
¿©·¯°¡Áö È¿°úÀûÀ¸·Î ±¸ÇöµÈ Ç¥ÁØ ¾Ë°í¸®Áòµé
(¿¹¸¦µé¾î find, sort, merge µî)ÀÌ ÀÖ´Ù.
(¸î¸î containerµéÀº ÀÌ Áß ÀϺθ¦ Ưº°ÇÑ ¸ñÀûÀ¸·Î ¸â¹öÇÔ¼ö·Î °®°í ÀÖ´Ù)
Function obejct. function object´Â operator ()ÀÇ Á¤ÀǸ¦ Á¦°øÇÏ´Â classÀÇ instanceÀÌ´Ù.
ÀÌ´Â ÀÌ objectµéÀ» ÇÔ¼ö °°ÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù.
Adaptors. STLÀº ´ÙÀ½°ú °°Àº °ÍµéÀ» Á¦°øÇÑ´Ù.
Allocators. ¸ðµç STL ÄÁÅ×ÀÌ³Ê class´Â ÇÁ·Î±×·¥ÀÌ »ç¿ëÇÏ´Â ¸Þ¸ð¸® Á¤º¸¸¦ °®°í ÀÖ±â À§ÇÑ
allocator class¸¦ »ç¿ëÇÑ´Ù. ÇÏÁö¸¸ ³ª´Â ÀÌ ºÎºÐÀº »ý·«ÇÒ °ÍÀÌ´Ù.
¾ÕÀ¸·Î vector, list, set ±×¸®°í map ÄÁÅ×À̳ÊÀÇ »ç¿ë¹ýÀ» »ìÆìº¼ °ÍÀÌ´Ù.
À̵éÀ» »ç¿ëÇϱâ À§Çؼ´Â ³»°¡ STL iterator¿¡ ´ëÇØ ¸»ÇÒ ¼ö ÀÖµµ·Ï
iterator¸¦ ¾µ ÁÙ ¾Ë¾Æ¾ß ÇÒ °ÍÀÌ´Ù. ¶Ç set°ú map ÄÁÅ×À̳ʸ¦ »ç¿ëÇÑ´Ù´Â °ÍÀº
³»°¡ function object¿¡ ´ëÇØ ¹º°¡ ¼³¸íÇÒ ¼ö ÀÖµµ·Ï °£´ÜÇÑ function object°¡
ÀÖ¾î¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù.
STLÀÌ Áö¿øÇÏ´Â ¾Ë°í¸®Áò¿¡ ´ëÇØ¼´Â °£´ÜÈ÷ ¼³¸íÇÒ °ÍÀ̰í, adoptor´Â
¾ð±ÞÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù.
¸î¸î ÇÔ¼ö ÀÎÀÚÀÇ Å¸ÀÔ¿¡ ´ëÇØ¼ À̸§ÀÌ ¹Ù²ð ¼ö ÀÖ´Ù. ¿¹¸¦µé¾î ´ëºÎºÐÀÇ int
ŸÀÔ ÀÎÀÚµéÀº ½ÇÁ¦·Î´Â size_typeÀ̶ó´Â typeÀ» °®°í À̰ÍÀÌ ÀûÀýÇÑ
±âº» ŸÀÔÀ¸·Î tyepdefµÇ´Â ÇüÅ¿¡ ÀÇÇØ ¾²ÀδÙ. ¸¸¾à ¿©·¯ ÇÔ¼öµéÀÇ ½ÇÁ¦
ÀÎÀÚ Å¸ÀÔÀ» ¾Ë°í½Í´Ù¸é ÀÛ¾÷ÇÏ´Â °Í¿¡ ´ëÇÑ ¹®¼³ª Çì´õÆÄÀÏÀ» Âü°íÇØ¶ó.
STL¿¡¼ Á¦°øµÇ´Â ¸î°¡Áö À¯Æ¿¸®Æ¼ classµéÀÌ Àִµ¥, ÀÌ Áß Á¦ÀÏ Áß¿äÇÑ °ÍÀº
pair classÀÌ´Ù. ÀÌ´Â ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾîÀÖ´Ù.
template<class T1, class T2>
class pair {
public:
T1 first;
T2 second;
pair (const T1& a, const T2& b) : first (a), second (b) {}
};
±×¸®°í ½±°Ô pair¸¦ ¸¸µéµµ·Ï ´ÙÀ½°ú °°Àº make_pair ÇÔ¼ö°¡ Á¦°øµÈ´Ù :
pair<T1,T2> make_pair (const T1& f, const T2&,s)
¶ÇÇÑ ==¿Í < ¿¬»êÀÚµµ ÀÖ´Ù. ÀÌ template class¿¡´Â º¹ÀâÇÑ °ÍÀÌ ¾ø°í
±×³É »ç¿ëÇÏ¸é µÈ´Ù. À̸¦ ÀÌ¿ëÇϱâ À§Çؼ´Â #include ·Î <utility>¸¦
includeÇÏ¸é µÈ´Ù. pair´Â ¿©·¯°÷¿¡¼ ¾²ÀÏ ¼ö Àִµ¥, ƯÈ÷ set°ú map class¿¡¼
¸¹ÀÌ ³ªÅ¸³´Ù.
17.2. Çì´õ ÆÄÀÏSTLÀ» »ç¿ëÇϱâ À§Çؼ´Â ÀûÀýÇÏ°Ô Çì´õÆÄÀÏÀ» #include ÇØÁÖ¾î¾ß ÇÑ´Ù.
¸¸¾à ÄÄÆÄÀÏ·¯°¡ Ç¥ÁØ¿¡ ¸ÂÁö ¾Ê´Â´Ù¸é ¾à°£ ´Ù¸¦ ¼öµµ ÀÖÁö¸¸,
Ç¥ÁØ¿¡ ¸Â´Â ÄÄÆÄÀÏ·¯ (g++ °°Àº)´Â ´ÙÀ½°ú °°ÀÌ ÇÏ¸é µÈ´Ù :
Ç¥ÁØ C++ ¶óÀ̺귯¸®´Â .h ¸¦ µÚ¿¡ ºÙÀÌÁö ¾Ê´Â ´Ù´Â °Í¿¡
ÁÖÀÇÇØ¶ó. ¸¸¾à ¿¾¹öÀüÀÇ È¤Àº ÁÁÁö ¾ÊÀº ÄÄÆÄÀÏ·¯¸¦ »ç¿ëÇϴµ¥, À§¿Í °°ÀÌ ÇØ¼ include°¡
µÇÁö ¾Ê´Â´Ù¸é .h ¸¦ ºÙ¿©¼ ½ÃµµÇغ¸¾Æ¶ó.
ÇÏÁö¸¸ ±×º¸´Ù´Â »õ·Î¿î ÄÄÆÄÀÏ·¯¸¦ ±¸ÇÏ´Â °Ô ´õ ³ªÀ» °ÍÀÌ´Ù.
17.3. ÄÁÅ×ÀÌ³Ê class ÀÎÅÍÆäÀ̽ºÄÁÅ×ÀÌ³Ê classµéÀº ¼·Î °°Àº À̸§À» °®´Â ¸â¹öÇÔ¼ö¸¦ ¸¹ÀÌ °®´Â´Ù.
ÀÌ ÇÔ¼öµéÀº ¸ðµç class¿¡ ´ëÇØ ¶È°°Àº (ȤÀº ¸Å¿ì ºñ½ÁÇÑ) ÀÎÅÍÆäÀ̽º¸¦
Á¦°øÇÑ´Ù (±×·¯³ª ¹°·Ð ±× ³»ºÎ ±¸ÇöÀº ´Ù¸¦ °ÍÀÌ´Ù). ¾Æ·¡ÀÇ Ç¥´Â
¿ì¸®°¡ »ìÆìº¼ ÇÔ¼öµéÀ» ³ª¿ÇÑ °ÍÀÌ´Ù.
º°Ç¥´Â ±× ÄÁÅ×ÀÌ³Ê Å¸ÀÔÀÌ ±× À̸§ÀÇ ¸â¹ö ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù´Â °ÍÀÌ´Ù.
표 2. ÄÁÅ×ÀÌ³Ê Class ÀÎÅÍÆäÀ̽º
¿¬»êÀÚ/ÇÔ¼ö¸í ¸ñÀû vector list set map == ºñ±³ * * * * < ºñ±³ * * * * begin iterator * * * * end iterator * * * * size ¿ø¼ÒÀÇ ¼ö * * * * empty ºñ¾ú´ÂÁö * * * * front ù¹øÂ° ¿ø¼Ò * * back ¸¶Áö¸· ¿ø¼Ò * * [ ] ¿ø¼Ò Á¢±Ù ¹× º¯°æ * * insert ¿ø¼Ò(µé) Ãß°¡ * * * * push_back ¸Ç µÚ¿¡ ¿ø¼Ò Ãß°¡ * * push_front ¸Ç ¾Õ¿¡ ¿ø¼Ò Ãß°¡ * erase ¿ø¼Ò(µé) »èÁ¦ * * * * pop_back ¸Ç µÚ ¿ø¼Ò »èÁ¦ * * pop_front ¸Ç ¾Õ ¿ø¼Ò »èÁ¦ *
¸¸¾à ¾Æ·¡ÀÇ ³»¿ëÁß Àǹ®°¡´Â ºÎºÐÀÌ ÀÖÀ¸¸é (¾Æ¸¶µµ ÀÕÀ» °ÍÀÌ´Ù),
Á¶±×¸¸ Å×½ºÆ® ÇÁ·Î±×·¥À» Çϳª Â¥¼ ¾î¶»°Ô µ¹¾Æ°¡´Â Áö ¾Ë¾Æº¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
17.4. º¤ÅÍ : Vectorsº¤ÅÍ´Â C++ÀÇ ¹è¿°ú ºñ½ÁÇÑ, ÇÏÁö¸¸ À̸¦ ¹ßÀü½ÃŲ ÄÁÅ×À̳ÊÀÌ´Ù.
ƯÈ÷, º¤ÅÍ´Â ¼±¾ð½Ã¿¡ ¾ó¸¶³ª º¤ÅͰ¡ Ä¿¾ßÇÒÁö¸¦ ¾Ë Çʿ䰡 ¾ø°í,
push_back
ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© ¾ðÁ¦³ª »õ·Î¿î ¿ø¼Ò¸¦ Ãß°¡ÇÒ ¼ö ÀÖ´Ù.
( »ç½Ç insert
ÇÔ¼ö°¡ ¾îµð¿¡µç »õ ¿ø¼ÒµéÀ» ³ÖÀ» ¼ö ÀÖ°Ô ÇØÁÖÁö¸¸, ÀÌ´Â ¸Å¿ì ºñÈ¿À²ÀûÀÌ´Ù.
¸¸¾à À̸¦ ÀÚÁÖ ÇØ¾ßÇÑ´Ù¸é list¸¦ ´ë½Å »ç¿ëÇÏ´Â °ÍÀ» °í·ÁÇØº¸¾Æ¶ó. )
17.4.1. º¤ÅÍ ¸¸µé±âº¤ÅÍ ´Â class templateÀ̹ǷÎ, ¼±¾ð½Ã¿¡ º¤ÅͰ¡ °®°Ô µÉ
°´Ã¼ÀÇ Å¸ÀÔÀ» ¼±¾ðÇØÁÖ¾î¾ß ÇÑ´Ù. ¿¹¸¦µé¾î ´ÙÀ½°ú °°´Ù.
vector<int> v1;
vector<string> v2;
vector<FiniteAutomaton> v3;
À§ ³»¿ëÀº v1À» int °ªÀ» °®´Â º¤ÅÍ·Î, v2¸¦ stringÀ» °®´Â º¤ÅÍ·Î, v3¸¦
FiniteAutomaton (¾Æ¸¶µµ ¹Ì¸® ÀÌ·± ŸÀÔÀÌ ¼±¾ðµÇ¾úÀ» °ÍÀÌ´Ù) ¸¦ °®°í ÀÖ´Â
º¤ÅÍ·Î ¼±¾ðÇÑ´Ù.
ÀÌ ¼±¾ðµéÀº º¤ÅÍÀÇ Å©±â¿¡ ´ëÇØ ÀüÇô ¾Ë·ÁÁÖÁö ¾Ê°í
( ±¸Çö¿¡ µû¶ó ±âº» º¤ÅÍ »çÀÌÁî°¡ ÀÖÀ» °ÍÀÌ´Ù. )
, Çʿ信 µû¶ó ¾ó¸¶µçÁö ´Ã·Á¼ ¾µ ¼ö ÀÖ´Ù.
±×·¯³ª ´ÙÀ½°ú °°ÀÌ ¼±¾ðÇÔÀ¸·Î½á Ãʱâ Å©±â¸¦ Á¤ÇØÁÙ ¼öµµ ÀÖ´Ù.
ÀÌ´Â v4°¡ ¹®ÀÚ (char)ÀÇ º¤ÅͰ¡ µÇ°í, óÀ½¿¡´Â 26°³ÀÇ ±ÛÀÚ¸¦ °¡Áú ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù.
¶ÇÇÑ, º¤ÅÍ ¾È¿¡ µé¾î°¡´Â ¼öµéÀ» ÃʱâÈ ÇÏ´Â ¹æ¹ýµµ Àִµ¥, ÀÌ´Â ´ÙÀ½°ú °°´Ù.
vector<float> v5 (100,1.0);
À§ ¼±¾ðÀº v5 °¡ 100°³ÀÇ 1.0À¸·Î ÃʱâÈ µÈ ½Ç¼ö°ªÀ»
°®´Â º¤ÅÍÀÓÀ» ¼±¾ðÇÑ´Ù.
17.4.2. º¤Å͸¦ üũÇϱâÇѹø º¤Å͸¦ ¸¸µç ÈÄ¿¡´Â, size ÇÔ¼ö¸¦ ½á¼ ÇöÀç
º¤ÅÍÀÇ Å©±â¸¦ ¾Ë¾Æ³¾ ¼ö ÀÖ´Ù.
ÀÌ ÇÔ¼ö´Â ¾Æ¹« ÀÎÀÚ ¾øÀÌ º¤ÅÍ¿¡ µé¾îÀÖ´Â ¿ø¼Ò ¼ö¸¦ ³ªÅ¸³»´Â integer¸¦ ¸®ÅÏÇÑ´Ù.
( ¾ö¹ÐÇÏ°Ô ¸»ÇÏÀÚ¸é
size_type ŸÀÔÀÌ ¸®ÅϵÇÁö¸¸,
À̰ÍÀÌ ¹Ù·Î integer·Î ¹Ù²î¾îÁø´Ù )
±×·¸´Ù¸é ´ÙÀ½ÀÇ ÀÛÀº ÇÁ·Î±×·¥À¸·Î ¹«¾ùÀÌ Ãâ·ÂµÉ±î?
<vector-size.cpp>=
#include <iostream>
#include <vector>
using namespace std;
int main ()
{
vector<int> v1;
vector<int> v2 (10);
vector<int> v3 (10,7);
cout << "v1.size() returns " << v1.size() << endl;
cout << "v2.size() returns " << v2.size() << endl;
cout << "v3.size() returns " << v3.size() << endl;
}
º¤ÅͰ¡ ºñ¾ú´ÂÁö¸¦ üũÇϱâ À§Çؼ´Â, empty ÇÔ¼ö¸¦ ¾²¸é µÈ´Ù.
À̰͵µ ¿ª½Ã ¾Æ¹« ÀÎÀÚ ¾øÀÌ boolean °ªÀ» ¸®ÅÏÇϴµ¥, ºñ¾îÀÖÀ¸¸é true¸¦,
ºñ¾îÀÖÁö ¾ÊÀ¸¸é false¸¦ ¸®ÅÏÇÑ´Ù.
±×·¸´Ù¸é ´ÙÀ½ÀÇ ÇÁ·Î±×·¥Àº ¹«¾ùÀ» ÇÁ¸°Æ®ÇÒ±î (true´Â 1·Î, false´Â 0À¸·Î ÇÁ¸°Æ®µÈ´Ù)?
<vector-empty.cpp>=
#include <iostream>
#include <vector>
using namespace std;
int main ()
{
vector<int> v1;
vector<int> v2 (10);
vector<int> v3 (10,7);
cout << "v1.empty() has value " << v1.empty() << endl;
cout << "v2.empty() has value " << v2.empty() << endl;
cout << "v3.empty() has value " << v3.empty() << endl;
}
17.4.3. º¤ÅÍÀÇ ¿ø¼Ò¿¡ Á¢±ÙÇϱ⺤ÅÍÀÇ ¿ø¼Ò´Â []¿¬»êÀÚ¸¦ »ç¿ëÇØ¼ Á¢±ÙÇÒ ¼ö ÀÖ´Ù. µû¶ó¼ ¸ðµç
¿ø¼Ò¸¦ ÇÁ¸°Æ®ÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ ÇÏ¸é µÈ´Ù.
vector<int> v;
// ...
for (int i=0; i<v.size(); i++)
cout << v[i];
(ÀÌ´Â ¿ø·¡ÀÇ ¹è¿À» »ç¿ëÇÏ´Â °Í°ú ¸Å¿ì ºñ½ÁÇÏ´Ù).
¶ÇÇÑ, [] ¿¬»êÀÚ´Â º¤ÅÍ ¿ø¼ÒÀÇ °ªÀ» ¹Ù²Ù±â À§Çؼµµ ¾²ÀÏ ¼ö ÀÖ´Ù.
vector<int> v;
// ...
for (int i=0; i<v.size(); i++)
v[i] = 2*i;
front ÇÔ¼ö´Â º¤ÅÍÀÇ Ã¹¹øÂ° ¿ø¼Ò¸¦ ¸®ÅÏÇÑ´Ù.
vector<char> v(10,'a');
// ...
char ch = v.front();
¶ÇÇÑ, front¸¦ ÀÌ¿ëÇØ¼ ù¹øÂ° ¿ø¼ÒÀÇ °ªÀ» ¹Ù²Ü ¼öµµ ÀÖ´Ù.
vector<char> v(10,'a');
// ...
v.front() = 'b';
back ÇÔ¼ö´Â front¿Í °°Àº ¿ªÇÒÀ» ÇÏÁö¸¸, º¤ÅÍÀÇ ¸Ç ¸¶Áö¸· ¿ø¼Ò¸¦ ¸®ÅÏÇÏ´Â °ÍÀÌ
´Ù¸£´Ù.
vector<char> v(10,'z');
// ...
char last = v.back();
v.back() = 'a';
[]¸¦ »ç¿ëÇÏ´Â °£´ÜÇÑ ¿¹Á¦¸¦ º¸ÀÚ.
<vector-access.cpp>=
#include <vector>
#include <iostream>
using namespace std;
int main ()
{
vector<int> v1 (5);
int x;
cout << "Enter 5 integers (seperated by spaces):" << endl;
for (int i=0; i<5; i++)
cin >> v1[i];
cout << "You entered:" << endl;
for (int i=0; i<5; i++)
cout << v1[i] << ' ';
cout << endl;
}
17.4.4. º¤ÅÍÀÇ ¿ø¼Ò¸¦ Ãß°¡ / »èÁ¦ÇϱâÀ§¿¡ ¾ð±ÞµÈ [] ¿Ü¿¡µµ, º¤ÅÍÀÇ ¿ø¼Ò¿¡ Á¢±ÙÇϰųª ¹Ù²Ü ¼ö ÀÖ´Â ¹æ¹ýÀÌ ¸î°¡Áö ´õ ÀÖ´Ù.
push_backÀº »õ·Î¿î ¿ø¼Ò¸¦ º¤ÅÍÀÇ ³¡¿¡ ´õÇÒ °ÍÀÌ´Ù.
pop_backÀº º¤ÅÍÀÇ ³¡¿¡¼ ¿ø¼Ò¸¦ Çϳª ¾ø¾Ù °ÍÀÌ´Ù.
insert ´Â Çϳª ¶Ç´Â ¿©·¯°³ÀÇ ¿ø¼Ò¸¦ º¤ÅÍÀÇ ¿øÇÏ´Â À§Ä¡¿¡ »ðÀÔÇÒ °ÍÀÌ´Ù.
erase´Â Çϳª ¶Ç´Â ¿©·¯°³ÀÇ ¿ø¼Ò¸¦ ¿øÇÏ´Â À§Ä¡¿¡¼ ¾ø¾Ù °ÍÀÌ´Ù.
±×·±µ¥ insert³ª erase´Â º¤ÅÍ¿¡¼ ¿À¹öÇìµå°¡ Å« ¿¬»êÀÓ¿¡ ÁÖÀÇÇ϶ó. ¸¸¾à insert³ª erase¸¦
½á¾ßÇÑ´Ù¸é, º¤ÅÍ ´ë½Å list µ¥ÀÌÅͱ¸Á¶¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ´õ È¿À²ÀûÀÏ °ÍÀÌ´Ù.
<vector-mod.cpp>=
#include <iostream>
#include <vector>
using namespace std;
int main ()
{
vector<int> v;
for (int i=0; i<10; i++) v.push_back(i);
cout << "Vector initialised to:" << endl;
for (int i=0; i<10; i++) cout << v[i] << ' ' ;
cout << endl;
for (int i=0; i<3; i++) v.pop_back();
cout << "Vector length now: " << v.size() << endl;
cout << "It contains:" << endl;
for (int i=0; i<v.size(); i++) cout << v[i] << ' ';
cout << endl;
int a1[5];
for (int i=0; i<5; i++) a1[i] = 100;
v.insert(& v[3], & a1[0],& a1[3]);
cout << "Vector now contains:" << endl;
for (int i=0; i<v.size(); i++) cout << v[i] << ' ';
cout << endl;
v.erase(& v[4],& v[7]);
cout << "Vector now contains:" << endl;
for (int i=0; i<v.size(); i++) cout << v[i] << ' ';
cout << endl;
}
À§ÀÇ ¿¹¿¡¼´Â º¤ÅÍ v°¡ ¼±¾ðµÈ ÈÄ, push_backÀ» »ç¿ëÇÏ¿© ÃʱâÈ µÇ¾ú´Ù.
±×¸®°í pop_backÀ¸·Î µÚÀÇ ¸î ¿ø¼Ò°¡ ¾ø¾îÁ³°í,
¹è¿ÀÌ Çϳª ¸¸µé¾îÁ®¼ ±× ³»¿ëÀÌ insert¸¦ »ç¿ëÇØ¼ v¿¡ »ðÀԵǾú´Ù.
¸¶Áö¸·À¸·Î ¸î¸î ¿ø¼ÒµéÀ» Áö¿ì±â À§ÇØ erase°¡ »ç¿ëµÇ¾ú´Ù.
À§¿¡ »ç¿ëµÈ ÇÔ¼öµéÀº ´ÙÀ½°ú °°Àº ÀÎÀÚµéÀ» ¹Þ´Â´Ù.
push_back : vector¿¡ µé¾î°¡´Â °Í°ú °°Àº ŸÀÔÀÇ ÀÎÀÚ¸¦ Çϳª ¹Þ´Â´Ù.
pop_back : ÀÎÀÚ¸¦ ¹ÞÁö ¾Ê´Â´Ù. ±×¸®°í ºó º¤ÅÍ¿¡ ´ëÇØ pop_backÀ» ÇÏ¸é ¾ÈµÈ´Ù.
insert ´Â ¼¼ °¡Áö ÇüÅ·Π¾²ÀδÙ.
insert (pos, T& x) : ¿ø¼Ò x Çϳª¸¦ pos°¡ °¡¸®Å°´Â À§Ä¡¿¡ »ðÀÔÇÑ´Ù.
insert (pos, start, end) : ´Ù¸¥ ÄÁÅ×ÀÌ³Ê ¾ÈÀÇ ³»¿ëÀ» pos°¡ °¡¸®Å°´Â À§Ä¡¿¡ »ðÀÔÇÑ´Ù.
»ðÀԵǴ ¿ø¼ÒµéÀº start¿¡¼ ½ÃÀÛÇØ¼, end¸¦ ¸¸³¯ ¶§±îÁö (end°¡ °¡¸®Å°´Â °ÍÀº µé¾î°¡Áö ¾Ê´Â´Ù) ÀÌ´Ù.
insert (pos, int rep, T& x) : rep °³ÀÇ x°ªÀ» pos À§Ä¡¿¡ »ðÀÔÇÑ´Ù. (°°Àº °ªÀ» ¿©·¯¹ø »ðÀÔ)
À§ÀÇ Äڵ忡 ³ª¿ÍÀÖµíÀÌ, pos°¡ °¡¸®Å°´Â Æ÷Áö¼Ç °ªÀº ¿ø¼Ò°¡ »ðÀ﵃ °÷ÀÇ ÁÖ¼Ò¿©¾ß ÇÑ´Ù.
¸¶Âù°¡Áö·Î start¿Í endµµ ÁÖ¼Ò°ªÀ̾î¾ß ÇÑ´Ù. (»ç½Ç À̰ÍÀº À̵éÀÌ iteratorÀ̱⠶§¹®ÀÌ´Ù.
ÀÌ¿¡ ´ëÇØ¼´Â ´ÙÀ½ Àå¿¡¼ ´õ »ìÆìº¼ °ÍÀÌ´Ù.)
17.4.5. Vector Iteratorº¤ÅÍ vÀÇ ¿ø¼ÒµéÀ» Â÷·Ê´ë·Î º¸´Â °¡Àå ½¬¿î ¹æ¹ýÀº À§¿¡ ÇÑ ¹æ¹ý°°ÀÌ ÇÏ´Â °ÍÀÌ´Ù.
for (int i=0; i<v.size(); i++) { ... v[i] ... }
¶Ç´Ù¸¥ ¹æ¹ýÀº ¹Ù·Î iterator¸¦ ÀÌ¿ëÇÏ´Â °ÍÀÌ´Ù. iterator´Â ÄÁÅ×À̳ÊÀÇ Æ÷ÀÎÅͶó°í »ý°¢Çϸé
µÈ´Ù. µû¶ó¼ À̸¦ Áõ°¡½ÃŰ¸é¼ ¿ø¼Ò¸¦ Çϳª¾¿ Á¢±ÙÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù.
º¤ÅͰ¡ ¾Æ´Ñ ÄÁÅ×À̳ÊÀÇ °æ¿ì´Â iterator°¡ ¿ø¼Ò¸¦ Â÷·Ê´ë·Î Á¢±ÙÇÒ ¼ö ÀÖ´Â À¯ÀÏÇÑ ¹æ¹ýÀÌ´Ù.
type TÀÇ ¿ø¼Ò¸¦ °®°í ÀÖ´Â º¤ÅÍÀÇ °æ¿ì :
iterator´Â ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÈ´Ù.
ÀÌ·¯ÇÑ iterator´Â begin ()À̳ª end ()°°Àº ÇÔ¼ö¿¡ ÀÇÇØ ¸®ÅϵǴ °ªÀ¸·Î ¸¸µé¾îÁø´Ù.
°°Àº ŸÀÔÀÇ iteratorµéÀº == ³ª != ·Î ºñ±³°¡´ÉÇϰí, ++À» ÀÌ¿ëÇÑ Áõ°¡³ª *¸¦ ÀÌ¿ëÇÑ
ÂüÁ¶ µîÀÌ °¡´ÉÇÏ´Ù.
[ ÀÌ ¿Ü¿¡µµ º¤ÅÍ iterator´Â ´õ ¸¹Àº ¿¬»êÀÚ¸¦ °®°í ÀÖ´Ù. ÀÌ¿¡ ´ëÇØ¼´Â ´ÙÀ½ ÀåÀ» Âü°íÇØ¶ó ].
´ÙÀ½Àº iterator¸¦ ¾î¶»°Ô º¤ÅÍ¿Í »ç¿ëÇÏ´Â Áö¿¡ ´ëÇÑ ¿¹Á¦ÀÌ´Ù.
<vector-iterator.cpp>=
#include <iostream>
#include <vector>
using namespace std;
int main ()
{
vector<int> v (10);
int j = 1;
vector<int>::iterator i;
// v¸¦ 1¿¡¼ 10±îÁöÀÇ Á¤¼ö·Î ä¿î´Ù.
i = v.begin();
while (i != v.end())
{
*i = j;
j++;
i++;
}
// vÀÇ °¢ ¿ø¼Ò¸¦ Á¦°öÇÑ´Ù.
for (i=v.begin(); i!=v.end(); i++) *i = (*i) * (*i);
// vÀÇ ³»¿ëÀ» Ãâ·ÂÇÑ´Ù.
cout << "The vector v contains: ";
for (i=v.begin(); i!=v.end(); i++) cout << *i << ' ';
cout << endl;
}
*i °¡ µîÈ£ÀÇ ¿ÞÂÊ (LHS)¿¡¼´Â °ªÀ» º¯°æÇϱâ À§ÇØ, ¿À¸¥ÂÊ (RHS)¿¡¼´Â °ªÀ» ÂüÁ¶Çϱâ À§ÇØ
¾²ÀÎ °Í¿¡ ÁÖ¸ñÇØ¶ó.
17.4.6. º¤ÅÍÀÇ ºñ±³µÎ °³ÀÇ º¤Å͸¦ ==¿Í <¸¦ ÀÌ¿ëÇØ¼ ºñ±³ÇÒ ¼ö ÀÖ´Ù. ==´Â ¾ç ÂÊÀÇ º¤ÅͰ¡ °°Àº ¼öÀÇ
¿ø¼Ò¸¦ °®°í ´ëÀÀµÇ´Â °¢¿ø¼ÒµéÀÌ ¸ðµÎ °°À» ¶§ true¸¦ ¸®ÅÏÇÒ °ÍÀÌ´Ù.
<Àº µÎ º¤ÅÍÀÇ ¿ø¼ÒµéÀ» Â÷·Ê´ë·Î »çÀü¼ø¼ (lexicographical order)´ë·Î ºñ±³ÇÑ´Ù.
¿¹¸¦µé¾î v1°ú v2¸¦ ºñ±³ÇÑ´Ù°í ÇØº¸ÀÚ (v1 < v2).
i=0À̶ó ÇÒ ¶§, v1[i] < v2[i] À̸é true¸¦ ¸®ÅÏÇϰí, v1[i] >
v2[i] À̸é false¸¦ ¸®ÅÏÇÑ´Ù. ¸¸¾à µÑÀÌ °°À¸¸é i¸¦ Áõ°¡½ÃŲ´Ù (Áï, ´ÙÀ½ ¿ø¼Ò·Î ³Ñ¾î°£´Ù). ¸¸¾à v1ÀÇ ³¡ÀÌ v2°¡ ³¡³ª±â Àü¿¡ ³ªÅ¸³µ´Ù¸é (Áï, v1ÀÇ ¿ø¼ÒÀÇ °³¼ö°¡ ´õ ÀÛ°í,
v1ÀÌ v2ÀÇ ¾ÕºÎºÐ°ú ³»¿ëÀÌ °°À» ¶§) true¸¦ ¸®ÅÏÇϰí, ±×·¸Áö ¾ÊÀ¸¸é false¸¦ ¸®ÅÏÇÑ´Ù.
´ÙÀ½ÀÇ ¿¹¸¦ º¸ÀÚ.
(1,2,3,4) < (5,6,7,8,9,10) ´Â false.
(1,2,3) < (1,2,3,4) ´Â true
(1,2,3,4) < (1,2,3) ´Â false
(0,1,2,3) < (1,2,3) ´Â true
¾Æ·¡ÀÇ ÄÚµå´Â À§¿¡¼ ¼¼¹øÂ° ¿¹¸¦ º¸¿©ÁØ´Ù.
<vector-comp.cpp>=
#include <vector>
#include <iostream>
using namespace std;
int main ()
{
vector<int> v1;
vector<int> v2;
for (int i=0; i<4; i++) v1.push_back(i+1);
for (int i=0; i<3; i++) v2.push_back(i+1);
cout << "v1: ";
for (int i=0; i<v1.size(); i++) cout << v1[i] << ' ';
cout << endl;
cout << "v2: ";
for (int i=0; i<v2.size(); i++) cout << v2[i] << ' ';
cout << endl;
cout << "v1 < v2 is: " << (v1<v2 ? "true" : "false") << endl;
}
<= ¿Í >= ¿ª½Ã ¿¹»óÇÏ´Â ´ë·Î µ¿ÀÛÇÒ °ÍÀÌ´Ù.
17.5. Iterator ¿Í STL17절 ÀåÀ» ºÁ¶ó.
17.6. ¸®½ºÆ®17절 ÀåÀ» ºÁ¶ó.
17.7. ÁýÇÕ (Set)set ÄÁÅ×ÀÌ³Ê Å¸ÀÔÀº º¤ÅͰ°ÀÌ À妽º¸¦ ÅëÇØ ¿ø¼Ò¿¡ Á¢±ÙÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó, ¿ø¼Ò¸¦ Á÷Á¢ ÀúÀåÇϰí
»¬ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù. set ÄÁÅ×À̳ʴ ¼·Î ´Ù¸¥ ¿ø¼Òµé¸¸À» °®´Â ¼öÇÐÀûÀÎ ÁýÇÕ°ú °°ÀÌ µ¿ÀÛÇÑ´Ù.
±×·¯³ª, ¼öÇÐÀûÀÎ ÁýÇÕ°ú´Â ´Ù¸£°Ô, ÁýÇÕ ¾ÈÀÇ ¿ø¼ÒµéÀº (»ç¿ëÀÚ°¡ ÁöÁ¤ÇÏ´Â) ¾î¶² ¼ø¼ ´ë·Î
ÀúÀåµÇ°Ô µÈ´Ù. ½ÇÁ¦·Î À̰ÍÀº set ÄÁÅ×À̳ʷΠ¼öÇÐÀûÀÎ ÁýÇÕÀ» ±¸ÇöÇÏ´Â µ¥ ÀÖ¾î ÀÛÀº Á¦ÇÑÀÏ
»ÓÀ̰í, ÀÌ·¸°Ô ÇÔÀ¸·Î½á ¼ø¼°¡ ¾ø´Â °Íº¸´Ù ¸¹Àº ¿¬»ê¿¡¼ ´õ È¿À²ÀûÀÌ µÉ ¼ö ÀÖ´Ù.
17.7.1. SetÀ» ¸¸µé±âset ÄÁÅ×À̳ʸ¦ ¸¸µé±â À§Çؼ´Â µÎ °¡Áö template ÀÎÀÚ°¡ ÇÊ¿äÇÏ´Ù - ÀÌ´Â setÀÌ °®°Ô µÉ
¿ø¼ÒµéÀÇ Å¸ÀÔ°ú µÎ ¿ø¼Ò¸¦ ºñ±³ÇÒ ¼ö ÀÖ´Â ºñ±³ÇÔ¼ö function objectÀÇ Å¸ÀÔÀÌ´Ù.
(set < T > s ¿Í °°Àº ¼±¾ðµµ °¡´ÉÇØ¾ßÇÑ´Ù.
ÀÌ´Â µÎ¹øÂ° ÀÎÀڷμ µðÆúÆ® template ÀÎÀÚÀÎ less < T >¸¦ »ç¿ëÇÑ´Ù.
ÇÏÁö¸¸ ¸¹Àº C++ ÄÄÆÄÀÏ·¯ (g++Æ÷ÇÔ)°¡ ±âº» template ÀÎÀÚ¸¦ Áö¿øÇÏÁö ¸øÇϰí ÀÖ´Ù.)
°£´ÜÇÑ Å¸ÀÔ T ¿¡ ´ëÇØ¼´Â less < T > function object¸¦ ¾µ ¼öµµ ÀÖ´Ù.
( "function object"°¡ ¹«¾ùÀΰ¡ ÇÏ´Â °í¹ÎÀº ÇÒÇÊ¿ä ¾ø´Ù.)
¿¹¸¦µé¾î ¾Æ·¡¿Í °°ÀÌ ¼±¾ðÇÏ¸é µÈ´Ù.
set<int> s1;
set<double> s2;
set<char> s3;
set<string> s4;
( ¼±¾ðÇÒ ¶§ µÚÂÊÀÇ > µÎ °³°¡ space·Î ¶ç¾îÁ® ÀÖÀ½¿¡ ÁÖÀÇÇ϶ó. ÀÌ´Â compiler°¡ >¸¦
½¬ÇÁÆ® ¿¬»êÀÚ (>>) ¿Í ±¸º°Çϱâ À§ÇØ ²À ÇÊ¿äÇÑ °ÍÀÌ´Ù.)
°¢°¢ÀÇ °æ¿ì function objectµéÀº °¢°¢ÀÇ Å¸ÀÔ¿¡ ¸Â°Ô <¸¦ »ç¿ëÇÒ °ÍÀÌ´Ù.
(ÀÌ´Â °¢°¢
int, double, char, string ŸÀÔÀÌ´Ù. )
¾Æ·¡ÀÇ ÄÚµå´Â Á¤¼ö (int)ÀÇ setÀ» ¼±¾ðÇϰí, insert
¸Þ½îµå¸¦ »ç¿ëÇÏ¿© Á¤¼ö¸¦ ¸î°³ Ãß°¡ÇÑ´Ù.
±×¸®°í setÀ» Â÷·Ê´ë·Î º¸¸é¼ ¿ø¼ÒµéÀ» Ãâ·ÂÇÑ´Ù.
Àç¹ÌÀÖ´Â °ÍÀº Ãß°¡ÇÏ´Â ¼ø¼°¡ ¾î¶² ¼ø¼À̵çÁö setÀÇ ³»¿ëÀº Á¤·ÄµÈ »óÅ·ΠÃâ·ÂµÈ´Ù´Â
°ÍÀÌ´Ù.
<set-construct1.cpp>=
#include <iostream>
#include <set>
using namespace std;
int main ()
{
set<int> s;
set<int>::iterator i;
s.insert(4);
s.insert(0);
s.insert(-9);
s.insert(7);
s.insert(-2);
s.insert(4);
s.insert(2);
cout << "The set contains the elements: ";
for (i=s.begin(); i!=s.end(); i++) cout << *i << ' ';
cout << endl;
}
4°¡ µÎ¹ø Ãß°¡µÇ¾úÀ½¿¡µµ ºÒ±¸Çϰí, Çѹø¹Û¿¡ ³ª¿ÀÁö ¾Ê´Â °Í¿¡ ÁÖÀÇÇØ¶ó.
ÀÌ´Â ÁýÇÕÀ̱⠶§¹®¿¡ ´ç¿¬ÇÑ °ÍÀÌ´Ù.
17.7.2. Function Objects¶õ ¹«¾ùÀΰ¡?C++ÀÇ ¸ÚÁø Ư¡ Áß Çϳª´Â ¿¬»êÀÚÀÇ ¿À¹ö·ÎµùÀÌ´Ù. µû¶ó¼ »õ·Î ¸¸µé¾îÁø class¿¡ ´ëÇØ
+ °¡ ¾î¶² Àǹ̵çÁö °®µµ·Ï ÇÒ ¼ö ÀÖ´Ù. ±×·±µ¥, C++¿¡¼ ¿À¹ö·Îµå ÇÒ ¼ö ÀÖ´Â ¿¬»êÀÚ Áß
ÇÔ¼ö È£Ãâ ¿¬»êÀÚÀÎ ()°¡ ÀÖ°í, ÀÌ´Â classÀÇ ÀνºÅϽº°¡ ÇÔ¼ö¿Í °°ÀÌ µ¿ÀÛÇÒ ¼ö ÀÖµµ·Ï
ÇØÁÙ ¼ö ÀÖ´Ù. À̰ÍÀÌ function objectÀÌ´Ù.
°£´ÜÇÑ ¿¹Á¦¸¦ º¸ÀÚ.
<function-object.cpp>=
#include <iostream>
using namespace std;
template<class T>
class square {
public:
T operator ()(T x) { return x*x; }
};
// ÀÌ´Â *°¡ Á¤ÀǵǴ ¾î¶² T¿¡ ´ëÇØ¼µçÁö ¾²ÀÏ ¼ö ÀÖ´Ù.
int main ()
{
// function object¸¦ ¸¸µç´Ù.
square<double> f1;
square<int> f2;
// À̸¦ »ç¿ëÇÑ´Ù.
cout << "5.1^2 = " << f1 (5.1) << endl;
cout << "100^2 = " << f2 (100) << endl;
// ¾Æ·¡ÀÇ ³»¿ëÀº ÄÄÆÄÀÏ ¿¡·¯¸¦ Ãâ·ÂÇÒ °ÍÀÌ´Ù.
// cout << "100.1^2 = " << f2 (100.1) << endl;
}
function object´Â STLÀÇ ¸î¸î ºÎºÐ, ƯÈ÷ set°ú map¿¡¼ ¸¹ÀÌ ¾²ÀδÙ.
function object°¡ ÇÊ¿äÇÑ °æ¿ì¸¦ »ý°¢Çغ¸ÀÚ.
¾Æ·¡ÀÇ ³»¿ëÀ» ¸¸Á·ÇÏ´Â comp ¶ó´Â °ÍÀ» »ý°¢Çغ¸ÀÚ.
¸¸¾à comp (x,y), comp (y,z)°¡ trueÀ̸é, comp (x,z)µµ ¿ª½Ã trueÀÌ´Ù.
comp (x,x)´Â ¾ðÁ¦³ª falseÀÌ´Ù.
¾î¶² x,y¿¡ ´ëÇØ comp (x,y)¿Í comp (y,x)°¡ falseÀ̸é x¿Í y´Â °°Àº °´Ã¼ÀÌ´Ù.
ÀÌ´Â ¼ýÀÚ¿¡¼ ¹Ì¸¸ °ü°è ( < )¸¦ ³ªÅ¸³½´Ù.
À§¿¡¼ ¾²ÀÎ less < T > function object ´Â type T¿¡ ´ëÇØ < ¿¬»êÀÚ·Î Á¤ÀǵǾî
ÀÖ´Ù. Áï, ´ÙÀ½°ú °°´Ù.
template<class T>
struct less {
bool operator ()(T x, T y) { return x<y; }
}
(ÁøÂ¥ Á¤ÀÇ´Â ·¹ÆÛ·±½º¸¦ »ç¿ëÇϰí, ÀûÀýÇÑ const ¼±¾ðÀ» »ç¿ëÇϸç binary_function template class¸¦ »ó¼Ó¹Þ´Â´Ù.)
ÀÌ´Â ¸¸¾à T°¡ < ¿¬»êÀÚ¸¦ ±× ŸÀÔ¿¡ ´ëÇØ Á¤ÀÇÇØ³õ¾Ò´Ù¸é,
T ŸÀÔÀÇ ÁýÇÕÀ» ¼±¾ðÇÒ ¶§, ºñ±³¸¦ À§ÇÑ °ÍÀ¸·Î less < T > ¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â
°ÍÀÌ´Ù.
¸¸¾à < ¿¬»êÀÚ°¡ ÇϰíÀÚ ÇÏ´Â °Í°ú ¸ÂÁö ¾ÊÀ» ¼öµµ ÀÖ´Ù. ÀÌ·² ¶§´Â ´Ù¸¥ ¿¹°¡ ÀÖ´Ù.
ÀÌ´Â < ¿¬»êÀÚ¸¦ ÀÌ¿ëÇÏ¿© °£´ÜÇÑ class¸¦ ¸¸µé°í, ´Ù¸¥ ¹æ½ÄÀÇ ºñ±³¸¦ ÇÏ´Â
function object¸¦ ¸¸µç´Ù. ¿À¹ö·Îµù µÈ <¿Í () ¿¬»êÀÚ°¡ STL°ú Àß µ¹¾Æ°¡±â À§Çؼ´Â
const ¸¦ Àû´çÈ÷ ½áÁà¾ß ÇÑ´Ù´Â °Í¿¡ ÁÖÀÇÇ϶ó.
<set-construct2.cpp>=
#include <iostream>
#include <set>
using namespace std;
// ÀÌ class´Â µÎ °³ÀÇ ¸â¹ö º¯¼ö¸¦ °®´Â´Ù.
// ¿À¹ö·ÎµùµÈ <Àº ¸â¹ö f1°ªÀ» °®°í µÎ class¸¦ ºñ±³ÇÑ´Ù.
class myClass {
private:
int f1;
char f2;
public:
myClass (int a, char b) : f1 (a), f2 (b) {}
int field1 () const { return f1; }
char field2 () const { return f2; }
bool operator< (myClass y) const
{ return (f1<y.field1()); }
};
// ÀÌ function object´Â ¸â¹ö f2ÀÇ °ªÀ» ±âÃÊ·Î
// myClass ŸÀÔÀÇ °´Ã¼µéÀ» ºñ±³ÇÑ´Ù.
class comp_myClass {
public:
bool operator ()(myClass c1, myClass c2) const
{ return (c1.field2() < c2.field2()); }
};
int main ()
{
set<myClass> s1;
set<myClass>::iterator i;
set<myClass, comp_myClass> s2;
set<myClass, comp_myClass>::iterator j;
s1.insert(myClass(1,'a'));
s2.insert(myClass(1,'a'));
s1.insert(myClass(1,'b'));
s2.insert(myClass(1,'b'));
s1.insert(myClass(2,'a'));
s2.insert(myClass(2,'a'));
cout << "Set s1 contains: ";
for (i=s1.begin(); i!=s1.end(); i++)
{
cout << "(" << (*i).field1() << ","
<< (*i).field2() << ")" << ' ';
}
cout << endl;
cout << "Set s2 contains: ";
for (j=s2.begin(); j!=s2.end(); j++)
{
cout << "(" << (*j).field1() << ","
<< (*j).field2() << ")" << ' ';
}
cout << endl;
}
(1,a)¿Í (2,a)¸¦ °¡Áø ÁýÇÕ s1Àº f1À» ±âÁØÀ¸·Î ºñ±³¸¦ ÇÑ´Ù. µû¶ó¼ (1,a)¿Í (1,b)´Â
°°Àº ¿ø¼Ò·Î Ãë±ÞµÈ´Ù. (1,a)¿Í (1,b)¸¦ °¡Áø ÁýÇÕ s2´Â f2¸¦ ±âÁØÀ¸·Î ºñ±³¸¦ Çϱ⠶§¹®¿¡
(1,a)¿Í (2,a)°¡ °°Àº ¿ø¼Ò·Î Ãë±ÞµÈ´Ù.
17.7.3. Ãâ·ÂÇϱâÀ§ÀÇ ¿¹¿¡¼ ÁýÇÕÀÇ ³»¿ëÀ» Ãâ·ÂÇÏ´Â °ÍÀº º°·Î ÁÁÁö ¾Ê´Ù.
¾Æ·¡ÀÇ Çì´õÆÄÀÏÀº operator<< À» ¿À¹ö·ÎµùÇÏ´Â
°£´ÜÇÑ Ç¥ÇöÀ» °®°í ÀÖ´Ù.
ÀÌ´Â °£´ÜÇÑ ¿ø¼Ò ŸÀÔÀ» °®´Â ÀÛÀº ÁýÇÕ¿¡¼´Â Àß µ¿ÀÛÇÑ´Ù.
<printset.h>=
#ifndef _PRINTSET_H
#define _PRINTSET_H
#include <iostream>
#include <set>
template<class T, class Comp>
std::ostream& operator<< (std::ostream& os, const std::set<T,Comp>& s)
{
std::set<T,Comp>::iterator iter = s.begin();
int sz = s.size();
int cnt = 0;
os << "{";
while (cnt < sz-1)
{
os << *iter << ",";
iter++;
cnt++;
}
if (sz != 0) os << *iter;
os << "}";
return os;
}
#endif
¿©±â¼ Ãâ·ÂÀ» À§ÇØ »ç¿ëÇÑ << ¿ë¹ýÀº ÁýÇÕÀÇ ¿ø¼ÒµéÀÌ << ¿¬»êÀÚ¸¦ »ç¿ëÇÒ ¼ö
ÀÖµµ·Ï Á¤ÀǵǾîÀÖ´Ù°í °¡Á¤ÇÑ °ÍÀÌ´Ù.
±×·¡¼ À̸¦ ÄÞ¸¶ (,)·Î ±¸ºÐÇÏ°í ´ë°ýÈ£·Î µÑ·¯½Î¼ Ãâ·ÂµÇµµ·Ï ÇÑ °ÍÀÌ´Ù.
ÀÌ´Â ´ÙÀ½ ¿¹¿¡¼µµ »ç¿ëµÉ °ÍÀÌ´Ù.
17.7.4. ¿ø¼ÒÀÇ ¼ö ±¸ÇϱâÁýÇÕÀÌ °øÁýÇÕÀÎÁö´Â empty () ¸Þ½îµå¸¦ »ç¿ëÇÏ¿© ¾Ë ¼ö ÀÖ´Ù. ÁýÇÕ¿¡ ¸î°³ÀÇ ¿ø¼Ò°¡
µé¾îÀÖ´ÂÁö´Â size () ¸Þ½îµå¸¦ »ç¿ëÇÏ¿© ¾Ë ¼ö ÀÖ´Ù.
À̵éÀº ÀÎÀÚ¾øÀÌ ºÒ·Á¼ °¢°¢ true ³ª false ȤÀº Á¤¼ö (int)¸¦ ¸®ÅÏÇÑ´Ù.
<set-size.cpp>=
#include <iostream>
#include <set>
#include "printset.h"
using namespace std;
int main ()
{
set<int> s;
cout << "The set s is "
<< (s.empty() ? "empty." : "non-empty.") << endl;
cout << "It has " << s.size() << "elements." << endl;
cout << "Now adding some elements... " << endl;
s.insert(1);
s.insert(6);
s.insert(7);
s.insert(-7);
s.insert(5);
s.insert(2);
s.insert(1);
s.insert(6);
cout << "The set s is now
<< (s.empty() ? "empty." : "non-empty.") << endl;
cout << "It has " << s.size() << "elements." << endl;
cout << "s = " << s << endl;
}
17.7.5. ÁýÇÕÀÌ ¼·Î °°ÀºÁö °Ë»çÇϱâµÎ ÁýÇÕÀÌ ¼·Î °°ÀºÁö´Â == ¿¬»êÀÚ¸¦ »ç¿ëÇÏ¿© °Ë»çÇÒ ¼ö ÀÖ´Ù. ÀÌ´Â
T::operator== ¸¦ »ç¿ëÇÏ¿© °¢ ¿ø¼Ò¸¦ Â÷·Ê´ë·Î °Ë»çÇÔÀ¸·Î½á ÀÌ·ç¾îÁø´Ù.
<set-equality.cpp>=
#include <iostream>
#include <set>
#include "printset.h"
using namespace std;
int main ()
{
set<int> s1, s2 ,s3;
for (int i=0; i<10; i++)
{
s1.insert(i);
s2.insert(2*i);
s3.insert(i);
}
cout << "s1 = " << s1 << endl;
cout << "s2 = " << s2 << endl;
cout << "s3 = " << s3 << endl;
cout << "s1==s2 is: " << (s1==s2 ? true. : false.) << endl;
cout << "s1==s3 is: " << (s1==s3 ? true. : false.) << endl;
}
¶ÇÇÑ, µÎ ÁýÇÕÀ» <À¸·Î ºñ±³ÇÏ´Â °Íµµ °¡´ÉÇÏ´Ù. s1 < s2 ´Â s1ÀÌ »çÀü¼ø¼·Î (lexicographically) s2º¸´Ù ÀÛÀ¸¸é true, ±×·¸Áö ¾ÊÀ¸¸é falseÀÌ´Ù.
17.7.6. ¿ø¼Ò¸¦ Ãß°¡Çϰųª »èÁ¦ÇϱâÁýÇÕ¿¡ ¿ø¼Ò¸¦ Ãß°¡ÇÏ´Â °ÍÀº insert ¸Þ½îµå (À§¿¡ »ç¿ëÇÑ °Í°ú °°ÀÌ)¸¦, »èÁ¦ÇÏ´Â °ÍÀº erase ¸Þ½îµå¸¦ ÅëÇØ ÀÌ·ç¾îÁø´Ù.
ŸÀÔ TÀÇ ¿ø¼ÒµéÀ» °®°í ÀÖ´Â ÁýÇÕÀÇ °æ¿ì, ´ÙÀ½°ú °°ÀÌ ÀÌ·ç¾îÁø´Ù :
pair < iterator, bool> insert (T& x) .
À̴ ǥÁØ insert ÇÔ¼öÀÌ´Ù. ¸®ÅϰªÀº ¹«½ÃÇÒ¼öµµ ÀÖ°í, ¼º°øÀûÀ¸·Î Ãß°¡Çß´ÂÁö¸¦ ¾Ë±â À§ÇØ
»ç¿ëÇÒ ¼öµµ ÀÖ´Ù (°°Àº ¿ø¼Ò°¡ ÀÌ¹Ì ÁýÇÕ¿¡ ÀÖÀ» °æ¿ì ½ÇÆÐÇÑ´Ù).
¸¸¾à Ãß°¡°¡ ¼º°øÇß´Ù¸é, bool °ªÀº trueÀ̰í,
iterator´Â ±Ý¹æ Ãß°¡µÈ ¿ø¼Ò¸¦ °¡¸®Å°°Ô µÉ °ÍÀÌ´Ù.
¸¸¾à ¿ø¼Ò°¡ ÀÌ¹Ì Á¸ÀçÇÏ´Â °ÍÀ̶ó¸é, bool °ªÀº falseÀ̰í, iterator´Â ÀÌ¹Ì ÀÖ´Â °ªÀÌ
µ¿ÀÏÇÑ ¿ø¼Ò¸¦ °¡¸®Å°°Ô µÉ °ÍÀÌ´Ù.
iterator insert (iterator position, T& x) .
ÀÌ insert ÇÔ¼ö´Â ÀÎÀڷμ Ãß°¡ÇϰíÀÚ ÇÏ´Â ¿ø¼Ò ¿Ü¿¡ iterator¸¦ ¹Þ´Âµ¥, ÀÌ´Â
Ãß°¡ÇÒ À§Ä¡¸¦ ã±â ½ÃÀÛÇÒ iteratorÀÌ´Ù. ¸®ÅϵǴ iterator´Â À§¿Í ¸¶Âù°¡Áö·Î
»õ·Î Ãß°¡µÈ ¿ø¼Ò³ª ÀÌ¹Ì Á¸ÀçÇÏ´Â °°Àº °ªÀÇ ¿ø¼ÒÀÌ´Ù.
int erase (T& x) .
ÀÌ eraseÇÔ¼ö´Â Áö¿ì°íÀÚ ÇÏ´Â ¿ø¼Ò¸¦ ÀÎÀÚ·Î ¹Þ¾Æ ¸¸¾à ±× ¿ø¼Ò°¡ Á¸ÀçÇϸé Áö¿ì°í¼ 1À»
¸®ÅÏÇϰí, ¾øÀ¸¸é 0À» ¸®ÅÏÇÑ´Ù.
void erase (iterator position) .
ÀÌ eraseÇÔ¼ö´Â ƯÁ¤ ¿ø¼Ò¸¦ °¡¸®Å°´Â iterator¸¦ ÀÎÀÚ·Î ¹Þ¾Æ ±× ¿ø¼Ò¸¦ Áö¿î´Ù.
void erase (iterator first, iterator last) .
ÀÌ eraseÇÔ¼ö´Â µÎ iterator¸¦ ÀÎÀÚ·Î ¹Þ¾Æ [first,last] ¹üÀ§ÀÇ ¸ðµç ¿ø¼Ò¸¦ Áö¿î´Ù.
¾Æ·¡ÀÇ ¿¹´Â À§ ÇÔ¼öµéÀÇ »ç¿ë¹ýÀ» º¸¿©ÁØ´Ù.
<set-add-delete.cpp>=
#include <iostream>
#include <set>
#include "printset.h"
using namespace std;
int main ()
{
set<int> s1;
// Ç¥ÁØÀûÀÎ ¹æ½ÄÀ¸·Î ¿ø¼Ò¸¦ Ãß°¡ÇÑ´Ù.
s1.insert(1);
s1.insert(2);
s1.insert(-2);
// ƯÁ¤À§Ä¡¿¡ ¿ø¼Ò »ðÀÔ
s1.insert(s1.end(), 3);
s1.insert(s1.begin(), -3);
s1.insert((s1.begin()++)++, 0);
cout << "s1 = " << s1 << endl;
// ¼º°øÀûÀ¸·Î Ãß°¡µÇ¾ú´ÂÁö üũ
pair<set<int>::iterator,bool> x = s1.insert(4);
cout << "Insertion of 4 " << (x.second ? worked. : failed.)
<< endl;
x = s1.insert(0);
cout << "Insertion of 0 " << (x.second ? worked. : failed.)
<< endl;
// insert¿¡¼ ¸®ÅÏµÈ iterator¸¦ µÎ¹øÂ° ÇüÅÂÀÇ insertÀÇ ÀÎÀÚ·Î
// »ç¿ëÇÒ ¼ö ÀÖ´Ù.
cout << "Inserting 10, 8 and 7." << endl;
s1.insert(10);
x=s1.insert(7);
s1.insert(x.first, 8);
cout << "s1 = " << s1 << endl;
// ¸î ¿ø¼ÒµéÀ» Áö¿î´Ù.
cout << "Removal of 0 " << (s1.erase(0) ? worked. : failed.)
<< endl;
cout << "Removal of 5 " << (s1.erase(5) ? worked. : failed.)
<< endl;
// ¿ø¼Ò¸¦ ã¾Æ¼, Áö¿î´Ù. (find ÇÔ¼ö´Â ´ÙÀ½ ÀåÀ» ÂüÁ¶)
cout << "Searching for 7." << endl;
set<int>::iterator e = s1.find(7);
cout << "Removing 7." << endl;
s1.erase(e);
cout << "s1 = " << s1 << endl;
// ¸¶Áö¸·À¸·Î ¸ðµç ¿ø¼Ò¸¦ Áö¿î´Ù.
cout << "Removing all elements from s1." << endl;
s1.erase(s1.begin(), s1.end());
cout << "s1 = " << s1 << endl;
cout << "s1 is now " << (s1.empty() ? empty. : non-empty.)
<< endl;
}
17.7.7. ¿ø¼Ò¸¦ ã±â¾î¶² ¿ø¼Ò°¡ ÁýÇÕ¿¡ ÀÖ´ÂÁö Ã¼Å©ÇØÁÖ´Â µÎ°¡Áö ÇÔ¼ö°¡ ÀÖ´Ù.
iterator find (T& x) .
ÀÌ ÇÔ¼ö´Â ÁýÇÕ¿¡ ¿ø¼Ò x°¡ Á¸ÀçÇÏ´ÂÁö ã´Â´Ù. ¸¸¾à ãÀ¸¸é
À̸¦ °¡¸®Å°´Â iterator¸¦ ¸®ÅÏÇϰí, ¾øÀ¸¸é end ()¸¦ ¸®ÅÏÇÑ´Ù.
int count (T& x) .
ÀÌÇÔ¼ö´Â Á¸ÀçÇϸé 1À», ¾øÀ¸¸é 0À» ¸®ÅÏÇÑ´Ù.
(multiset¿¡¼ÀÇ countÇÔ¼ö´Â °°Àº ¿ø¼Ò°¡ ¿©·¯°³ ÀÖÀ» ¼ö ÀÖÀ¸¹Ç·Î
¸®ÅϰªÀÌ 1º¸´Ù ´õ Ŭ ¼öµµ ÀÖ´Ù.
count¶ó´Â ¸»ÀÇ ¶æÀ» »ý°¢Çغ¸¶ó! )
findÀÇ »ç¿ë¹ýÀº ÀÌ¹Ì À§¿¡ º¸ÀÎ ÀûÀÌ ÀÖ´Ù. ¿ì¸®´Â count¸¦ ÀÌ¿ëÇÏ¿© °£´ÜÇÑ template±â¹ÝÀÇ
ÁýÇÕ¿¡ ¼ÓÇÏ´ÂÁö testÇÏ´Â ÇÔ¼ö¸¦ ¸¸µé ¼ö ÀÖ´Ù.
(ÀÌ´Â ÀÎÀÚ x¿¡ ´ëÇÑ ·¹ÆÛ·±½º¸¦ Á¦°øÇÑ´Ù.)
<setmember.h>=
#ifndef _SETMEMBER_H
#define _SETMEMBER_H
#include <set>
template<class T, class Comp>
bool member (T x, std::set<T,Comp>& s)
{
return (s.count(x)==1 ? true : false);
}
#endif
// ÀÌ´Â ´ÙÀ½°ú °°ÀÌ ¾²ÀÏ ¼ö ÀÖ´Ù.
<set-membership.cpp>=
#include <iostream>
#include <set>
#include "printset.h"
#include "setmember.h"
using namespace std;
int main ()
{
set<int> s;
for (int i= 0; i<10; i++) s.insert(i);
cout << "s = " << s << endl;
cout << "1 is " << (member (1,s) ? : not) << " a member of s "
<< endl;
cout << "10 is " << (member (10,s) ? : not) << " a member of s "
<< endl;
}
17.7.8. ÁýÇÕ ¿¬»êSTLÀº ºÎºÐÁýÇÕ, ÇÕÁýÇÕ, ±³ÁýÇÕ, Â÷ÁýÇÕ, ´ëĪÂ÷ÁýÇÕ (XOR) µîÀÇ
ÁýÇÕ¿¬»êÀ» generic ¾Ë°í¸®ÁòÀ¸·Î Á¦°øÇÑ´Ù.
ÀÌ ÇÔ¼öµéÀ» ÀÌ¿ëÇϱâ À§Çؼ´Â algo.h¸¦ include ÇØ¾ßÇÑ´Ù.
(¾Æ·¡ÀÇ ³»¿ëÁß iter´Â ÀûÀýÇÑ iterator¸¦ ÀǹÌÇÑ´Ù).
bool includes (iter f1,iter l1,iter f2,iter l2).
À§ ÇÔ¼ö´Â [f2,l2] ¹üÀ§¿¡ ÀÖ´Â °ÍµéÀÌ [f1,l1] ¾ÈÀÇ °ÍµéÀ» Æ÷ÇÔÇÏ´Â Áö¸¦ üũÇÑ´Ù.
¸¸¾à Æ÷ÇÔÇϸé true¸¦, ±×·¸Áö ¾ÊÀ¸¸é false¸¦ ¸®ÅÏÇÑ´Ù.
µû¶ó¼ ÇÑ ÁýÇÕÀÌ ´Ù¸¥ ÁýÇÕÀ» Æ÷ÇÔÇÏ´Â Áö¸¦ º¸·Á¸é, ´ÙÀ½°ú °°ÀÌ ÇÏ¸é µÈ´Ù.
includes(s1.begin(), s1.end(), s2.begin(), s2.end())
The includes function checks the truth of 3#3 ( that is of 4#4).
ÀÌ ÇÔ¼ö´Â ÁýÇÕÀÌ < ¿¬»êÀÚ¸¦ ÀÌ¿ëÇØ Á¤·ÄµÇ¾ú´Ù°í º»´Ù. ¸¸¾à, <ÀÌ ¾Æ´Ñ ´Ù¸¥ ¿¬»êÀÚ
°¡ »ç¿ëµÇ¾ú´Ù¸é, ÀÌ (function object)¸¦ ¸¶Áö¸· ÀÎÀڷμ Ãß°¡·Î ³Ñ°ÜÁÖ¸é µÈ´Ù.
iter set_union (iter f1,iter l1,iter f2,iter l2,iter result).
ÀÌ´Â [f1,l1]°ú [f2,l2] ¹üÀ§¿¡ ÀÖ´Â ÁýÇÕµéÀÇ ÇÕÁýÇÕÀ» ¸¸µç´Ù.
ÀÎÀÚ·Î ÁÖ´Â result °ªÀº »õ·Î¸¸µé¾îÁø ÇÕÁýÇÕÀÇ Ã¹ ÀÎÀÚ¸¦ °¡¸®Å°´Â iteratorÀÌ´Ù.
¸®ÅϰªÀº »õ·Î¿î ÁýÇÕÀÇ ³¡ (end)¸¦ °¡¸®Å°´Â iteratorÀÌ´Ù.
result ÀÎÀÚ°¡ iterator¶õ ¸»Àº, ´ÙÀ½°ú °°Àº ½ÄÀ¸·Î set_unionÀ» »ç¿ëÇÏ¸é ¾ÈµÈ´Ù´Â
°ÍÀÌ´Ù.
set<int> s1, s2, s3;
// s1 °ú s2ÀÇ ¿ø¼Ò¸¦ °¡Áö°í ÇÕÁýÇÕÀ» ¸¸µç´Ù.
// (±×·¯³ª ÀÌ·± ½ÄÀ¸·Î´Â µ¿ÀÛÇÏÁö ¾ÊÀ½)
set_union(s1.begin(), s1.end(),
s2.begin(), s2.end(),
s3.begin());
±× ÀÌÀ¯´Â begin ()°ú end ()°¡ ÁýÇÕÀ̳ª ¸Ê¿¡ »ç¿ëµÉ ¶§´Â »ó¼ö input iterator°¡ µÇ±â ¶§¹®ÀÌ´Ù.
ÀÌ·¯ÇÑ iterator´Â ÁýÇÕÀÇ ¿ø¼Ò¸¦ Àбâ À§Çؼ´Â »ç¿ëµÉ ¼ö ÀÖÁö¸¸, °ªÀ» ¾µ ¼ö´Â ¾ø´Ù.
(¶ÇÇÑ ¸¸¾à °ªÀ» ¾µ ¼ö ÀÖ°Ô ÇÑ´Ù¸é ÁýÇÕÀÇ ¼ø¼¸¦ ¸Á°¡¶ß¸± ¼ö ÀÖ´Â À§ÇèÀÌ ÀÖ±â
¶§¹®À̱⵵ ÇÏ´Ù)
ÇØ°áÃ¥Àº set_typeÀÇ insert iterator¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù. ÀÌ´Â
(*i)=value °°Àº ºÒ°¡´ÉÇÑ ±¸¹®À» s.insert(i,value)ÀÇ ÇüÅ·Π¾µ ¼ö ÀÖ°Ô ÇØÁØ´Ù.
(¿©±â¼ s´Â iterator i°¡ °¡¸®Å°´Â ÁýÇÕÀÌ´Ù. ÀÌ´Â ´ÙÀ½°ú °°ÀÌ ¾²ÀδÙ.
// ÆíÀǸ¦ À§ÇØ Typedef¸¦ »ç¿ë
typedef set<int> intSet;
intSet s1, s2, s3;
// s1°ú s2¿¡ ¸î ¿ø¼Ò¸¦ Ãß°¡.
// ±×¸®°í ÇÕÁýÇÕÀ» ±¸ÇÑ´Ù.
set_union(s1.begin(), s1.end(),
s2.begin(), s2.end(),
inserter(s3,s3.begin()) );
ÀÌÁ¦ À§¿¡ ³ª¿À´Â °ÍµéÀ» Á¾ÇÕÀûÀ¸·Î »ç¿ëÇÏ´Â ¿¹Á¦¸¦ º¸ÀÚ.
<set-theory.cpp>=
#include <iostream>
#include <set>
#include <algorithm>
#include <iterator>
#include "printset.h"
using namespace std;
int main ()
{
typedef set<int> intSet;
intSet s1, s2, s3, s4;
for (int i=0; i<10; i++)
{ s1.insert(i);
s2.insert(i+4);
}
for (int i=0; i<5; i++) s3.insert(i);
cout << "s1 = " << s1 << endl;
cout << "s2 = " << s2 << endl;
cout << "s3 = " << s3 << endl;
// s1ÀÌ s2ÀÇ ºÎºÐÁýÇÕÀΰ¡?
bool test = includes(s2.begin(),s2.end(),s1.begin(),s1.end());
cout << "s1 subset of s2 is " << (test ? true. : false.) << endl;
// s3°¡ s1ÀÇ ºÎºÐÁýÇÕÀΰ¡?
test = includes(s1.begin(),s1.end(),s3.begin(),s3.end());
cout << "s3 subset of s1 is " << (test ? true. : false.) << endl;
// s1°ú s2ÀÇ ÇÕÁýÇÕ.
set_union(s1.begin(), s1.end(), s2.begin(), s2.end(),
inserter(s4,s4.begin()) );
cout << "s1 union s2 = " << s4 << endl;
// s4¸¦ Áö¿ì°í, s1°ú s2ÀÇ ±³ÁýÇÕÀ» ±¸ÇÑ´Ù.
// ( ¸¸¾à s4¸¦ Áö¿ìÁö ¾ÊÀ¸¸é ¿ø·¡ s4¿¡ µé¾îÀÖ´Â °Íµéµµ
// °°ÀÌ µé¾î°¡°Ô µÉ °ÍÀÌ´Ù. )
s4.erase(s4.begin(),s4.end());
set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(),
inserter(s4,s4.begin()) );
cout << "s1 intersection s2 = " << s4 << endl;
// Â÷ÁýÇÕ
s4.erase(s4.begin(),s4.end());
set_difference(s1.begin(), s1.end(), s2.begin(), s2.end(),
inserter(s4,s4.begin()) );
cout << "s1 minus s2 = " << s4 << endl;
// Â÷ÁýÇÕÀº ´ëĪÀûÀÌÁö ¾Ê´Ù. (Áï, A-B != B-A)
s4.erase(s4.begin(),s4.end());
set_difference(s2.begin(), s2.end(), s1.begin(), s1.end(),
inserter(s4,s4.begin()) );
cout << "s2 minus s1 = " << s4 << endl;
// ´ëĪÂ÷ÁýÇÕ
s4.erase(s4.begin(),s4.end());
set_symmetric_difference(s1.begin(), s1.end(), s2.begin(), s2.end(),
inserter(s4,s4.begin()) );
cout << "s1 symmetric_difference s2 = " << s4 << endl;
// ´ëĪÂ÷ÁýÇÕÀº ´ëĪÀûÀÌ´Ù. (Áï, commutative)
s4.erase(s4.begin(),s4.end());
set_symmetric_difference(s2.begin(), s2.end(), s1.begin(), s1.end(),
inserter(s4,s4.begin()) );
cout << "s2 symmetric_difference s1 = " << s4 << endl;
}
17.9. STL ¾Ë°í¸®Áò17절 ÀåÀ» º¸¾Æ¶ó.