STL¿¡ °üÇÑ ´ÙÀ½ »çÀÌÆ®µéÀ» ¹æ¹®Çغ¸¶ó :
iterator¿¡ ´ëÇÑ ¸Å¿ì ÁÁÀº ¼³¸í http://www.cs.trinity.edu/~joldham/1321/lectures/iterators/
Intro to STL SGI http://www.sgi.com/tech/stl/stl_introduction.html
Mumits STL Ãʺ¸ °¡À̵å (¾à°£ ¿À·¡µÈ °Í) http://www.xraylith.wisc.edu/~khan/software/stl/STL.newbie.html
ObjectSpace ¿¹Á¦ : ObjectSpace´Â 300°³°¡ ³Ñ´Â ¿¹Á¦¸¦ °¡Áö°í ÀÖ°í, µû¶ó¼ Ãʺ¸ÀÚ¿¡°Ô ¾ÆÁÖ ÁÁÀº Ãâ¹ßÁ¡À» Á¦½ÃÇØÁØ´Ù. ftp://butler.hpl.hp.com/stl/examples.zip
Joseph Y. Laurino's STL page. http://weber.u.washington.edu/~bytewave/bytewave_stl.html
Marian Corcoran's STL FAQ. ftp://butler.hpl.hp.com/stl/stl.faq
STL tutorials:
Phil Ottewell's STL Tutorial - http://www.yrl.co.uk/~phil/stl/stl.htmlx
ÁÁÁö¸¸ ¿À·¡µÈ ¹®¼ - http://www.decompile.com/html/tut.html ¹Ì·¯ : http://mip.ups-tlse.fr/~grundman/stl-tutorial/tutorial.html
The Code Project, C++/STL/MFC ¿¡ ´ëÇÑ ¼Ò°³ http://www.codeproject.com/cpp/stlintroduction.asp
C++ Standard Template Library, another great tutorial, by Mark Sebern http://www.msoe.edu/eecs/cese/resources/stl/index.htm
Technical University Vienna by Johannes Weidl http://dnaugler.cs.semo.edu/tutorials/stl mirror http://www.infosys.tuwien.ac.at/Research/Component/tutorial/prwmain.htm
Main STL sites:
C++ STL from SGI http://www.sgi.com/tech/stl
C++ STL from RPI univ http://www.cs.rpi.edu/projects/STL/htdocs/stl.html
C++ STL site ODP for STL ¿Í ¹Ì·¯
STL for C++ Programmers http://userwww.econ.hvu.nl/~ammeraal/stlcpp.html
C++ STL from halper http://www.halpernwightsoftware.com/stdlib-scratch/quickref.html
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Àº ´ÙÀ½°ú °°Àº °ÍµéÀ» Á¦°øÇÑ´Ù.
Container adaptor´Â vector¸¦ stackÀ» ¸¸µé±â À§ÇÑ ±âÃÊ·Î »ç¿ëÇÒ ¼ö ÀÖ°Ô ÇØÁØ´Ù.
function adaptor ´Â ÀÌ¹Ì Á¸ÀçÇÏ´Â function object·ÎºÎÅÍ »õ·Î¿î function object¸¦ ¸¸µé ¼ö ÀÖ°Ô ÇØÁØ´Ù.
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¿¡¼ ¸¹ÀÌ ³ªÅ¸³´Ù.
STLÀ» »ç¿ëÇϱâ À§Çؼ´Â ÀûÀýÇÏ°Ô Çì´õÆÄÀÏÀ» #include ÇØÁÖ¾î¾ß ÇÑ´Ù. ¸¸¾à ÄÄÆÄÀÏ·¯°¡ Ç¥ÁØ¿¡ ¸ÂÁö ¾Ê´Â´Ù¸é ¾à°£ ´Ù¸¦ ¼öµµ ÀÖÁö¸¸, Ç¥ÁØ¿¡ ¸Â´Â ÄÄÆÄÀÏ·¯ (g++ °°Àº)´Â ´ÙÀ½°ú °°ÀÌ ÇÏ¸é µÈ´Ù :
<vector> : º¤ÅÍ Å¸ÀÔ
<list> : ¸®½ºÆ® ŸÀÔ
<set> : ÁýÇÕ(set) ŸÀÔ
<map> : ¸Ê ŸÀÔ
<algorithm> : ÀϹÝÀûÀÎ ¾Ë°í¸®Áò µé
Ç¥ÁØ C++ ¶óÀ̺귯¸®´Â .h ¸¦ µÚ¿¡ ºÙÀÌÁö ¾Ê´Â ´Ù´Â °Í¿¡ ÁÖÀÇÇØ¶ó. ¸¸¾à ¿¾¹öÀüÀÇ È¤Àº ÁÁÁö ¾ÊÀº ÄÄÆÄÀÏ·¯¸¦ »ç¿ëÇϴµ¥, À§¿Í °°ÀÌ ÇØ¼ include°¡ µÇÁö ¾Ê´Â´Ù¸é .h¸¦ ºÙ¿©¼ ½ÃµµÇغ¸¾Æ¶ó. ÇÏÁö¸¸ ±×º¸´Ù´Â »õ·Î¿î ÄÄÆÄÀÏ·¯¸¦ ±¸ÇÏ´Â °Ô ´õ ³ªÀ» °ÍÀÌ´Ù.
ÄÁÅ×ÀÌ³Ê 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 | ¸Ç ¾Õ ¿ø¼Ò »èÁ¦ | * | ||||
¸¸¾à ¾Æ·¡ÀÇ ³»¿ëÁß Àǹ®°¡´Â ºÎºÐÀÌ ÀÖÀ¸¸é (¾Æ¸¶µµ ÀÕÀ» °ÍÀÌ´Ù), Á¶±×¸¸ Å×½ºÆ® ÇÁ·Î±×·¥À» Çϳª Â¥¼ ¾î¶»°Ô µ¹¾Æ°¡´Â Áö ¾Ë¾Æº¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
º¤ÅÍ´Â C++ÀÇ ¹è¿°ú ºñ½ÁÇÑ, ÇÏÁö¸¸ À̸¦ ¹ßÀü½ÃŲ ÄÁÅ×À̳ÊÀÌ´Ù. ƯÈ÷, º¤ÅÍ´Â ¼±¾ð½Ã¿¡ ¾ó¸¶³ª º¤ÅͰ¡ Ä¿¾ßÇÒÁö¸¦ ¾Ë Çʿ䰡 ¾ø°í, push_back ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© ¾ðÁ¦³ª »õ·Î¿î ¿ø¼Ò¸¦ Ãß°¡ÇÒ ¼ö ÀÖ´Ù. ( »ç½Ç insert ÇÔ¼ö°¡ ¾îµð¿¡µç »õ ¿ø¼ÒµéÀ» ³ÖÀ» ¼ö ÀÖ°Ô ÇØÁÖÁö¸¸, ÀÌ´Â ¸Å¿ì ºñÈ¿À²ÀûÀÌ´Ù. ¸¸¾à À̸¦ ÀÚÁÖ ÇØ¾ßÇÑ´Ù¸é list¸¦ ´ë½Å »ç¿ëÇÏ´Â °ÍÀ» °í·ÁÇØº¸¾Æ¶ó. )
º¤ÅÍ´Â class templateÀ̹ǷÎ, ¼±¾ð½Ã¿¡ º¤ÅͰ¡ °®°Ô µÉ °´Ã¼ÀÇ Å¸ÀÔÀ» ¼±¾ðÇØÁÖ¾î¾ß ÇÑ´Ù. ¿¹¸¦µé¾î ´ÙÀ½°ú °°´Ù.
vector<int> v1; vector<string> v2; vector<FiniteAutomaton> v3; |
À§ ³»¿ëÀº v1À» int °ªÀ» °®´Â º¤ÅÍ·Î, v2¸¦ stringÀ» °®´Â º¤ÅÍ·Î, v3¸¦ FiniteAutomaton (¾Æ¸¶µµ ¹Ì¸® ÀÌ·± ŸÀÔÀÌ ¼±¾ðµÇ¾úÀ» °ÍÀÌ´Ù) ¸¦ °®°í ÀÖ´Â º¤ÅÍ·Î ¼±¾ðÇÑ´Ù. ÀÌ ¼±¾ðµéÀº º¤ÅÍÀÇ Å©±â¿¡ ´ëÇØ ÀüÇô ¾Ë·ÁÁÖÁö ¾Ê°í ( ±¸Çö¿¡ µû¶ó ±âº» º¤ÅÍ »çÀÌÁî°¡ ÀÖÀ» °ÍÀÌ´Ù. ) , Çʿ信 µû¶ó ¾ó¸¶µçÁö ´Ã·Á¼ ¾µ ¼ö ÀÖ´Ù.
±×·¯³ª ´ÙÀ½°ú °°ÀÌ ¼±¾ðÇÔÀ¸·Î½á Ãʱâ Å©±â¸¦ Á¤ÇØÁÙ ¼öµµ ÀÖ´Ù.
vector<char> v4(26); |
ÀÌ´Â v4°¡ ¹®ÀÚ(char)ÀÇ º¤ÅͰ¡ µÇ°í, óÀ½¿¡´Â 26°³ÀÇ ±ÛÀÚ¸¦ °¡Áú ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. ¶ÇÇÑ, º¤ÅÍ ¾È¿¡ µé¾î°¡´Â ¼öµéÀ» ÃʱâÈ ÇÏ´Â ¹æ¹ýµµ Àִµ¥, ÀÌ´Â ´ÙÀ½°ú °°´Ù.
vector<float> v5(100,1.0); |
À§ ¼±¾ðÀº v5 °¡ 100°³ÀÇ 1.0À¸·Î ÃʱâÈ µÈ ½Ç¼ö°ªÀ» °®´Â º¤ÅÍÀÓÀ» ¼±¾ðÇÑ´Ù.
Çѹø º¤Å͸¦ ¸¸µç ÈÄ¿¡´Â, 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; } |
º¤ÅÍÀÇ ¿ø¼Ò´Â []¿¬»êÀÚ¸¦ »ç¿ëÇØ¼ Á¢±ÙÇÒ ¼ö ÀÖ´Ù. µû¶ó¼ ¸ðµç ¿ø¼Ò¸¦ ÇÁ¸°Æ®ÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ ÇÏ¸é µÈ´Ù.
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; } |
À§¿¡ ¾ð±ÞµÈ [] ¿Ü¿¡µµ, º¤ÅÍÀÇ ¿ø¼Ò¿¡ Á¢±ÙÇϰųª ¹Ù²Ü ¼ö ÀÖ´Â ¹æ¹ýÀÌ ¸î°¡Áö ´õ ÀÖ´Ù.
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 À§Ä¡¿¡ »ðÀÔÇÑ´Ù. (°°Àº °ªÀ» ¿©·¯¹ø »ðÀÔ)
erase´Â µÎ °¡Áö ÇüÅ·Π¾²Àδ٠(pos, start¿Í end´Â insert¿Í °°Àº Çü½ÄÀ» °®´Â´Ù)
erase(pos) : pos°¡ °¡¸®Å°´Â À§Ä¡ÀÇ ¿ø¼Ò¸¦ ¾ø¾Ø´Ù.
erase(start,end) : start¿¡¼ end±îÁö(end´Â Æ÷ÇÔÇÏÁö ¾ÊÀ½)¿¡ ÇØ´çÇÏ´Â ¿ø¼ÒµéÀ» ¾ø¾Ø´Ù.
º¤ÅÍ vÀÇ ¿ø¼ÒµéÀ» Â÷·Ê´ë·Î º¸´Â °¡Àå ½¬¿î ¹æ¹ýÀº À§¿¡ ÇÑ ¹æ¹ý°°ÀÌ ÇÏ´Â °ÍÀÌ´Ù.
for (int i=0; i<v.size(); i++) { ... v[i] ... } |
¶Ç´Ù¸¥ ¹æ¹ýÀº ¹Ù·Î iterator¸¦ ÀÌ¿ëÇÏ´Â °ÍÀÌ´Ù. iterator´Â ÄÁÅ×À̳ÊÀÇ Æ÷ÀÎÅͶó°í »ý°¢ÇÏ¸é µÈ´Ù. µû¶ó¼ À̸¦ Áõ°¡½ÃŰ¸é¼ ¿ø¼Ò¸¦ Çϳª¾¿ Á¢±ÙÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù. º¤ÅͰ¡ ¾Æ´Ñ ÄÁÅ×À̳ÊÀÇ °æ¿ì´Â iterator°¡ ¿ø¼Ò¸¦ Â÷·Ê´ë·Î Á¢±ÙÇÒ ¼ö ÀÖ´Â À¯ÀÏÇÑ ¹æ¹ýÀÌ´Ù.
type TÀÇ ¿ø¼Ò¸¦ °®°í ÀÖ´Â º¤ÅÍÀÇ °æ¿ì :
vector<T> v; |
iterator´Â ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÈ´Ù.
vector<T>::iterator i; |
ÀÌ·¯ÇÑ 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)¿¡¼´Â °ªÀ» ÂüÁ¶Çϱâ À§ÇØ ¾²ÀÎ °Í¿¡ ÁÖ¸ñÇØ¶ó.
µÎ °³ÀÇ º¤Å͸¦ ==¿Í <¸¦ ÀÌ¿ëÇØ¼ ºñ±³ÇÒ ¼ö ÀÖ´Ù. ==´Â ¾ç ÂÊÀÇ º¤ÅͰ¡ °°Àº ¼öÀÇ ¿ø¼Ò¸¦ °®°í ´ëÀÀµÇ´Â °¢¿ø¼ÒµéÀÌ ¸ðµÎ °°À» ¶§ 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ÀýÀåÀ» ºÁ¶ó.
17ÀýÀåÀ» ºÁ¶ó.
set ÄÁÅ×ÀÌ³Ê Å¸ÀÔÀº º¤ÅͰ°ÀÌ À妽º¸¦ ÅëÇØ ¿ø¼Ò¿¡ Á¢±ÙÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó, ¿ø¼Ò¸¦ Á÷Á¢ ÀúÀåÇÏ°í »¬ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù. set ÄÁÅ×À̳ʴ ¼·Î ´Ù¸¥ ¿ø¼Òµé¸¸À» °®´Â ¼öÇÐÀûÀÎ ÁýÇÕ°ú °°ÀÌ µ¿ÀÛÇÑ´Ù. ±×·¯³ª, ¼öÇÐÀûÀÎ ÁýÇÕ°ú´Â ´Ù¸£°Ô, ÁýÇÕ ¾ÈÀÇ ¿ø¼ÒµéÀº (»ç¿ëÀÚ°¡ ÁöÁ¤ÇÏ´Â) ¾î¶² ¼ø¼ ´ë·Î ÀúÀåµÇ°Ô µÈ´Ù. ½ÇÁ¦·Î À̰ÍÀº set ÄÁÅ×À̳ʷΠ¼öÇÐÀûÀÎ ÁýÇÕÀ» ±¸ÇöÇÏ´Â µ¥ ÀÖ¾î ÀÛÀº Á¦ÇÑÀÏ »ÓÀ̰í, ÀÌ·¸°Ô ÇÔÀ¸·Î½á ¼ø¼°¡ ¾ø´Â °Íº¸´Ù ¸¹Àº ¿¬»ê¿¡¼ ´õ È¿À²ÀûÀÌ µÉ ¼ö ÀÖ´Ù.
set ÄÁÅ×À̳ʸ¦ ¸¸µé±â À§Çؼ´Â µÎ °¡Áö template ÀÎÀÚ°¡ ÇÊ¿äÇÏ´Ù - ÀÌ´Â setÀÌ °®°Ô µÉ ¿ø¼ÒµéÀÇ Å¸ÀÔ°ú µÎ ¿ø¼Ò¸¦ ºñ±³ÇÒ ¼ö ÀÖ´Â ºñ±³ÇÔ¼ö function objectÀÇ Å¸ÀÔÀÌ´Ù.
set<T, Compare> s; |
(set < T > s¿Í °°Àº ¼±¾ðµµ °¡´ÉÇØ¾ßÇÑ´Ù. ÀÌ´Â µÎ¹øÂ° ÀÎÀڷμ µðÆúÆ® template ÀÎÀÚÀÎ less < T >¸¦ »ç¿ëÇÑ´Ù. ÇÏÁö¸¸ ¸¹Àº C++ ÄÄÆÄÀÏ·¯ (g++Æ÷ÇÔ)°¡ ±âº» template ÀÎÀÚ¸¦ Áö¿øÇÏÁö ¸øÇϰí ÀÖ´Ù.)
°£´ÜÇÑ Å¸ÀÔ T ¿¡ ´ëÇØ¼´Â less < T > function object¸¦ ¾µ ¼öµµ ÀÖ´Ù. ( "function object"°¡ ¹«¾ùÀΰ¡ ÇÏ´Â °í¹ÎÀº ÇÒÇÊ¿ä ¾ø´Ù.) ¿¹¸¦µé¾î ¾Æ·¡¿Í °°ÀÌ ¼±¾ðÇÏ¸é µÈ´Ù.
set<int, less<int> > s1; set<double, less<double> > s2; set<char, less<char> > s3; set<string, less<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, less<int> > s; set<int, less<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°¡ µÎ¹ø Ãß°¡µÇ¾úÀ½¿¡µµ ºÒ±¸Çϰí, Çѹø¹Û¿¡ ³ª¿ÀÁö ¾Ê´Â °Í¿¡ ÁÖÀÇÇØ¶ó. ÀÌ´Â ÁýÇÕÀ̱⠶§¹®¿¡ ´ç¿¬ÇÑ °ÍÀÌ´Ù.
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, less<myClass> > s1; set<myClass, less<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)°¡ °°Àº ¿ø¼Ò·Î Ãë±ÞµÈ´Ù.
À§ÀÇ ¿¹¿¡¼ ÁýÇÕÀÇ ³»¿ëÀ» Ãâ·ÂÇÏ´Â °ÍÀº º°·Î ÁÁÁö ¾Ê´Ù. ¾Æ·¡ÀÇ Çì´õÆÄÀÏÀº 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 |
¿©±â¼ Ãâ·ÂÀ» À§ÇØ »ç¿ëÇÑ << ¿ë¹ýÀº ÁýÇÕÀÇ ¿ø¼ÒµéÀÌ << ¿¬»êÀÚ¸¦ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï Á¤ÀǵǾîÀÖ´Ù°í °¡Á¤ÇÑ °ÍÀÌ´Ù. ±×·¡¼ À̸¦ ÄÞ¸¶(,)·Î ±¸ºÐÇÏ°í ´ë°ýÈ£·Î µÑ·¯½Î¼ Ãâ·ÂµÇµµ·Ï ÇÑ °ÍÀÌ´Ù. ÀÌ´Â ´ÙÀ½ ¿¹¿¡¼µµ »ç¿ëµÉ °ÍÀÌ´Ù.
ÁýÇÕÀÌ °øÁýÇÕÀÎÁö´Â empty() ¸Þ½îµå¸¦ »ç¿ëÇÏ¿© ¾Ë ¼ö ÀÖ´Ù. ÁýÇÕ¿¡ ¸î°³ÀÇ ¿ø¼Ò°¡ µé¾îÀÖ´ÂÁö´Â size() ¸Þ½îµå¸¦ »ç¿ëÇÏ¿© ¾Ë ¼ö ÀÖ´Ù. À̵éÀº ÀÎÀÚ¾øÀÌ ºÒ·Á¼ °¢°¢ true ³ª false ȤÀº Á¤¼ö(int)¸¦ ¸®ÅÏÇÑ´Ù.
<set-size.cpp>= #include <iostream> #include <set> #include "printset.h" using namespace std; int main() { set<int, less<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; } |
µÎ ÁýÇÕÀÌ ¼·Î °°ÀºÁö´Â == ¿¬»êÀÚ¸¦ »ç¿ëÇÏ¿© °Ë»çÇÒ ¼ö ÀÖ´Ù. ÀÌ´Â T::operator== ¸¦ »ç¿ëÇÏ¿© °¢ ¿ø¼Ò¸¦ Â÷·Ê´ë·Î °Ë»çÇÔÀ¸·Î½á ÀÌ·ç¾îÁø´Ù.
<set-equality.cpp>= #include <iostream> #include <set> #include "printset.h" using namespace std; int main() { set<int, less<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ÀÌ´Ù.
ÁýÇÕ¿¡ ¿ø¼Ò¸¦ Ãß°¡ÇÏ´Â °ÍÀº 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, less<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, less<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,less<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; } |
¾î¶² ¿ø¼Ò°¡ ÁýÇÕ¿¡ ÀÖ´ÂÁö Ã¼Å©ÇØÁÖ´Â µÎ°¡Áö ÇÔ¼ö°¡ ÀÖ´Ù.
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, less<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; } |
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, less<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, less<int> > intSet; intSet s1, s2, s3; // s1°ú s2¿¡ ¸î ¿ø¼Ò¸¦ Ãß°¡. // ±×¸®°í ÇÕÁýÇÕÀ» ±¸ÇÑ´Ù. set_union(s1.begin(), s1.end(), s2.begin(), s2.end(), insert_iterator<intSet>(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, less<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(), insert_iterator<intSet>(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(), insert_iterator<intSet>(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(), insert_iterator<intSet>(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(), insert_iterator<intSet>(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(), insert_iterator<intSet>(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(), insert_iterator<intSet>(s4,s4.begin()) ); cout << "s2 symmetric_difference s1 = " << s4 << endl; } |
17ÀýÀåÀ» º¸¾Æ¶ó.