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

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



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

<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V4.1//EN"> 
<article lang="ko"> 
 
<!--           --> 
<!-- ¹®¼­ Á¤º¸ --> 
<!--           --> 
<articleinfo> 
    <title>Iterator</title> 
 
    <author> 
        <surname>À± »ó¹è</surname> 
 
        <affiliation> 
            <address> 
                <email>dreamyun@yahoo.co.kr</email> 
            </address> 
        </affiliation> 
    </author> 
</articleinfo> 
 
 
<!--                                                                 --> 
<!-- ¼½¼Ç ½ÃÀÛ                                                       --> 
<!--                                                                 --> 
<!-- Âü°í »çÀÌÆ® :                                                   -->  
<!-- http://www.cs.brown.edu/people/jak/proglang/cpp/stltut/tut.html -->  
<section> 
    <title>¼Ò°³</title>     
    <para> 
        À̹ø±Û¿¡´Â STL ¿¡ ´ëÇÑ °£´ÜÇÑ ÀÀ¿ëÀ» Æ÷ÇÔÇÑ´Ù.  
        ´ë·®ÀÇ µ¥ÀÌŸ¸¦ Ãë±ÞÇØ¾ß ÇÒ¶§ ¾î¶»°Ô ÀÛ¾÷À» ÇØ¾ß ÇÒ·±Áö¿¡  
        ´ëÇÑ ¸î°¡Áö ¹®Á¦µéÀ» ´ã°í ÀÖ´Ù.  
    </para> 
    <para> 
        À̸¦ À§Çؼ­ DOS ATTACK °ø°ÝÀ» °ËÃâÇÏ´Â ¾îÇø®ÄÉÀ̼ÇÀ» ¿¹·Î µé¾î¼­  
        ¼³¸íÀ» ÇÒ°ÍÀÌ´Ù. ±×·¯³ª ÀÌ ¹®¼­´Â ¾îµð±îÁö³ª ¹æ¹ýÀ» Á¦½ÃÇÏ´Â ¹®¼­·Î½á  
        ¿Ïº®ÇÑ Äڵ带 Á¦½ÃÇÏÁø ¾ÊÀ»°ÍÀ̸ç, Å×½ºÆ® °¡´ÉÇÑ ¼öÁØÀÇ Äڵ常À» Á¦°øÇÒ°ÍÀÌ¸ç  
        ±¸Çö¿¡ ´ëÇÑ °í¹ÎÀº °¢ÀÚÀÇ ¸òÀÌ µÉ°ÍÀÌ´Ù.     
    </para> 
    <para> 
        DOS °ø°Ý¿¡ ´ëÇÑ ³»¿ëÀº <ulink url=http://www.joinc.co.kr/modules.php?name=News&file=article&sid=109&mode=nested>³×Æ®¿÷ º¸¾ÈÀÇ ±âº»(1)</ulink>À» Âü°íÇϱ⠹ٶõ´Ù.  
    </para> 
</section> 
<section> 
    <title>DOS ATTACK °ËÃâ ¾îÇø®ÄÉÀÌ¼Ç Á¦ÀÛ</title> 
    <para> 
        °£´ÜÇÑ DOS °ø°ÝÀ» °Ë»öÇÏ´Â ¾îÇø®ÄÉÀ̼ÇÀ» ¸¸µç´Ù°í  
        °¡Á¤À» ÇØº¸ÀÚ. DOS °ø°ÝÀÇ °æ¿ì º¸Åë ÇϳªÀÇ IP¿¡¼­ ƯÁ¤ Æ÷Æ®·Î  
        ªÀº½Ã°£¿¡ ¿äûÀÌ µé¾î¿Ã°ÍÀÓÀ¸·Î, "5ÃÊ¿¡ 20¹øÀÇ ¿äûÀÌ ÀÖÀ¸¸é  
        DOS °ø°ÝÀ¸·Î °£ÁÖÇÑ´Ù" ¶ó´Â ½ÄÀ¸·Î DOS °ø°Ý¿¡ ´ëÇØ¼­  
        Á¤Àǰ¡ °¡´ÉÇÏ´Ù.  
    </para> 
    <para> 
        ±×·¸´Ù¸é ¾îÇø®ÄÉÀ̼ÇÀº ÇØ´çÆÐŶÀÌ µé¾î¿Ã°æ¿ì IP Á¤º¸¸¦  
        ºÐ¼®Çؼ­ Ä«¿îÆÃÇϰí, ÀÌ Ä«¿îÆÃÀÌ 5ÃÊ ³»¿¡ 20¹ø ¹ß»ý  
        Çß´Ù¸é "DOS WARN ¸Þ½ÃÁö"¸¦ ½ÃÄÑ¾ß ÇÒ°ÍÀÌ´Ù.   
    </para> 
    <para> 
        ÀÌ ¾îÇø®ÄÉÀ̼ÇÀ» Á¦ÀÛÇϴµ¥ À־ °¡Àå Áß¿äÇÑ Æ÷ÀÎÆ®´Â 
        ÀڷᱸÁ¶ÀÇ À¯Áö¿Í È¿À²¼ºÀÌ µÉ°ÍÀÌ´Ù.  
        DOS ¾îÅÃÀ» ÆÇ´ÜÇÏ´Â ±Ù°Å´Â IP¿Í PORT °¡ µÊÀ¸·Î, ¸ðµç ÀÔ·Â  
        IP¿Í PORT¿¡ ´ëÇÑ Å×À̺íÀ» À¯ÁöÇϰí ÀÖ¾î¾ß ÇÑ´Ù.  
    </para> 
    <para> 
        ±×·±µ¥ ¾Æ½Ã´Ù ½ÃÇÇ IPÀÇ ¹üÀ§´Â ³Ê¹« ³Ð´Ù. Á» ³Î¸® ¾Ë·ÁÁø ¹Ù»Û¼­¹ö  
        ¶ó¸é ªÀº½Ã°£¿¡ ¼öõ-¼ö¸¸ ȤÀº ±×ÀÌ»óÀÇ ¼­·Î´Ù¸¥ IP ¿¡¼­ÀÇ  
        Á¢±ÙÀÌ ÀÌ·ç¾îÁú¼ö ÀÖÀ»°Å´Ù. ¸¸¾à ¶ó¿ìÅÍ¿¡ ¼³Ä¡ÇÒ°æ¿ì  
        ´õ¿í ¸¹Àº Á¢±ÙÀÌ ÀϾ°ÍÀÌ´Ù.     
        ÀÌ°É ´Ü¼øÈ÷ map À̳ª vector ·Î IPÁ¤º¸ Å×À̺íÀ» ±¸¼ºÇÒ°æ¿ì  
        È¿À²¿¡ ¹®Á¦°¡ ¹ß»ýÇÒ¼ö ÀÖ´Ù.   
    </para> 
    <section> 
        <title>È¿À²ÀûÀÎ ÀڷᱸÁ¶¸¦ »ý°¢Çغ¸ÀÚ</title> 
        <para> 
            ±×·³ ¾î¶»°Ô ÇØ¾ß È¿À²ÀûÀÎ ÀڷᱸÁ¶¸¦ ¸¸µé¼ö ÀÖÀ»±î..  
            ´Ü¼øÇÑ map À¸·Î ÇÒ°æ¿ì ¸¸¾à IP°¡ ¼ö¸¸°³°¡ µé¾î¿Â´Ù¸é,  
            ¼ö¸¸°³ÀÇ ¿ø¼Ò·Î ÀÌ·ç¾îÁø °Å´ëÇÑ map µ¥ÀÌŸ°¡ ¸¸µé¾îÁú  
            °ÍÀ̸ç, ´õ Ä¿Áú¼öµµ ÀÖÀ»°ÍÀÌ´Ù. °Å±â¿¡ port Á¤º¸±îÁö  
            Æ÷ÇÔÇØ¾ß µÊÀ¸·Î, ´Ü¼ø map À¸·Î ±¸¼ºÇϱ⿡´Â  
            ¿ø¼ÒÀÇ °¹¼ö°¡ ³Ê¹« ¸¹¾ÆÁø´Ù.    
        </para> 
        <para> 
            map Àº Á¤·Ä¿¬°ü ÄÁÅ×À̳ʷΠ±ÕÇü ÀÌÁøÆ®¸® ±¸Á¶¸¦ °¡Áø´Ù.  
            ´ÙÀ½Àº map ÀÇ º¹Àâµµ(Complexity guarantees) ÀÌ´Ù.  
            size() ´Â map ¿¡ Æ÷ÇÔµÈ ¿ø¼ÒÀÇ °¹¼öÀ̸ç, count(k) ´Â  
            »èÁ¦ÇϰíÀÚ ÇÏ´Â key ÀÇ °¹¼öÀÌ´Ù. N Àº ¿ø¼ÒÀÇ °¹¼öÀÌ´Ù.   
            <table> 
                <title>Æò±Õ º¹Àâµµ(Average complexity)</title> 
                <tgroup cols=2>  
                <tbody> 
                    <row> 
                        <entry>erase key</entry> 
                        <entry>O(log(size()) + count(k))</entry> 
                    </row> 
                    <row> 
                        <entry>erase element</entry> 
                        <entry>constant time</entry> 
                    </row> 
                    <row> 
                        <entry>¹üÀ§ »èÁ¦</entry> 
                        <entry>O(log(size()) + N)</entry> 
                    </row> 
                    <row> 
                        <entry>count</entry> 
                        <entry>O(log(size()) + count(k))</entry> 
                    </row> 
                    <row> 
                        <entry>find</entry> 
                        <entry>logarithmic</entry> 
                    </row> 
                </tbody> 
                </tgroup>  
            </table> 
            ¿¹¸¦ µé¾î 13¸¸°³ Á¤µµÀÇ ¿ø¼Ò¸¦ °¡Áø map ¿¡¼­ ƯÁ¤ÇÑ  
            ¿ø¼Ò¸¦ ãÀ»°æ¿ì Æò±Õ °É¸®´Â ½Ã°£Àº ¾à 17 Á¤µµ°¡ µÉ°ÍÀÌ´Ù.  
            1,000,000 Àº ¾à 20 ÀÌ´Ù.   
        </para> 
        <para> 
            DOS °ø°ÝÀ» °Ë»öÇØ³»´Â ¾îÇø®ÄÉÀ̼ÇÀ̶ó¸é ¶ó¿ìÅÍ¿¡ ¼³Ä¡µÉ°Íµµ  
            »ý°¢ÇغÁ¾ß ÇÑ´Ù. ±×·¡¼­ Æò±Õ 1,000,000 ÀÇ µ¥ÀÌŸ¿¡¼­  
            ¼­ÃëÇÏ´Â°É·Î ÇØ¼­ °è»êÇØº¸¸é ´ë·® 20 Á¤µµÀÇ ½Ã°£ÀÌ ¼Ò¸ðµÈ´Ù.  
            20 Àº ÀÌó·³ ¹Ù»Û¾îÇø®ÄÉÀÌ¼Ç ²Ï³ª Å«¼öÄ¡ÀÌ´Ù.  
            ±×·³À¸·Î ½Ã°£À» Á»´õ ÁÙ¿©¾ß ÇÒ Çʿ伺ÀÌ ÀÖ´Ù.    
        </para> 
        <para> 
            °Ô´Ù°¡ ÀÌ ¾îÇø®ÄÉÀ̼ÇÀ» À§Çؼ­ map À» ±¸¼ºÇÑ´Ù°í ÇßÀ»¶§  
            map ÀÇ key ´Â IP¿Í PORT ÀÇ Á¶ÇÕÀÌ µÉ°ÍÀÓÀ¸·Î, ¹é¸¸ ÀÌ»óÀÇ  
            µ¥ÀÌŸ¸¦ °¨´çÇÒ¼ö ÀÖ´Ù°í ºÁ¾ßÇÒ°ÍÀÌ´Ù.   
        </para> 
        <section> 
            <title>ÇØ½¬¸¦ ÀÌ¿ëÇÑ È¿À²¼º ³ôÀ̱â</title> 
            <para> 
                ±×·¡¼­ »ý°¢ÇÒ¼ö ÀÖ´Â°Ô Hash ÇÔ¼öÀÇ »ç¿ëÀÌ´Ù.  
                Hash ÇÔ¼ö´Â µ¥ÀÌŸ Ãà¾àÀ» À§ÇÑ ÇÔ¼ö·Î½á, °°Àº °ªÀ»  
                ÀÔ·ÂÇßÀ»¶§´Â ¾ðÁ¦³ª °°Àº µ¥ÀÌŸ Ãà¾àÀ» ¾ò¾î³¾¼ö ÀÖ´Â  
                ÇÔ¼öÀÌ´Ù.    
            </para> 
            <para> 
                ¿ì¸®°¡ Ãà¾àÇØ¾ßÇÒ µ¥ÀÌŸ´Â ¹°·Ð 32bit Å©±âÀÇ IP ÁÖ¼Ò 
                ÀÌ´Ù. 32bit ´Â ¹üÀ§°¡ ³Ê¹«³ª ³ÐÀ½À¸·Î À̰ÍÀ» 1024(2^10)  
                Á¤µµ·Î ÁÙÀ̵µ·Ï ÇϰڴÙ. HASH ÇÔ¼ö´Â ¸Å¿ì ´Ü¼ø¹«½ÄÇÑ  
                ¹æ¹ýÀ¸·Î IP ÁÖ¼Ò 32bit Áß 10bit ¸¸À» ÀÌ¿ëÇØ¼­ Hash  
                °ªÀ» ¾òµµ·ÏÇϴµ¥, ´ÜÁö ½¬ÇÁÆ® ¿¬»êÀ» ÇØÁÖ´Â °Í¸¸À¸·Î  
                ÇØ°á°¡´ÉÇÏ´Ù.   
                <screen> 
int hash(ulong ip) 
{ 
    return ip >> 22; 
} 
                </screen> 
                ÀÌ °ªµéÀº 0 ºÎÅÍ 1023 ±îÁö ºÐÆ÷°¡ µÉ°ÍÀÓÀ¸·Î  
                vector ȤÀº array ·Î ÀڷᱸÁ¶¸¦ ±¸ÇöÇÒ¼ö ÀÖÀ»°ÍÀÌ´Ù.  
                IP °¡ µé¾î¿À¸é 0 - 1023 Áß¿¡ ÇϳªÀÇ °ªÀ¸·Î hashing µÉ°Çµ¥,  
                vector ¿¡ Áý¾î³ÖÀ»¶§´Â ÀÌ hashing µÈ °ªÀÚü¸¦ ÷ÀÚ·Î ÇØ¼­  
                ÀÔ·ÂÇÒ¼ö ÀÖÀ½À¸·Î ½Ã°£º¹Àâµµ´Â O(1) ÀÌ µÉ°ÍÀÌ´Ù.  
                ´Ù¸¥ ¸»·Î "ÇÑŰ" ¿¡ ÀÚ½ÅÀÌ ÀúÀåµÉ °÷À» ã¾Æ°¥¼ö  
                ÀÖ°Ô µÈ´Ù. ÀÌ vector ´Â ۸¦ IP¿Í PORT·Î °¡Áö´Â map À»  
                ¿ø¼Ò·Î °¡Áö°Ô µÉ°ÍÀÌ´Ù.    
            </para> 
            <para> 
                °¡Àå ÀÌ»óÀûÀÎ »óȲÀº IP°¡ 2^20 °³°¡  
                µé¾îÀִµ¥ 0¿¡¼­ 1023±îÁöÀÇ vector ¿¡ ¾ÆÁÖ ±ÕµîÇÏ°Ô  
                µé¾îÀÖ´Â »óȲÀ¸·Î °¢ vector ÀÇ ¿ø¼Ò´Â 1024 °³ÀÇ ¿ø¼Ò¸¦  
                °¡Áö´Â map À» °¡Áö°Ô µÉ°ÍÀÌ´Ù. ÀÌ»óȲ¿¡¼­ ¿øÇÏ´Â  
                µ¥ÀÌŸ (IP,PORT¸¦ Ű·Î °¡Áö´Â)¸¦ ã´Âµ¥ °É¸®´Â ½Ã°£Àº  
                "vector ¿¡¼­ ÷ÀÚ¿¬»êÇϴµ¥ °É¸®´Â ½Ã°£ O(1)" + "O(log1024)"  
                °¡ µÉ°ÍÀÌ´Ù. ±×·³À¸·Î ´ë·« 11 ¹øÁ¤µµ¿¡ ¿øÇÏ´Â °ªÀ»  
                ãÀ»¼ö ÀÖ°Ô µÈ´Ù. ÃÖÃÊ map ¸¸À» »ç¿ëÇßÀ»¶§ÀÇ 20 ¿¡  
                ºñÇÏ¸é °ÅÀÇ Àý¹Ý¼öÁØÀ¸·Î ÁÙ¾îµêÀ» ¾Ë¼ö ÀÖ´Ù. 
            </para> 
            <para> 
                ¹°·Ð À§ÀÇ »óȲÀº ¸Å¿ì ÀÌ»óÀûÀÎ »óȲÀ̸ç, ½ÇÁ¦·Î´Â  
                À§ÀÇ °æ¿ì¿¡ ºñÇØ¼­ ´õ ¸¹Àº ½Ã°£ÀÌ ¼Ò¸ðµÉ°ÍÀÌ´Ù.  
                ¿Ö³ÄÇϸé À§ÀÇ ´Ü¼øÇÑ ÇØ½¬ÇÔ¼ö·Î´Â IP°¡ ±ÕµîÇÏ°Ô 0-1023 À¸·Î  
                ºÐÆ÷µÇ±â°¡ Èûµé°ÍÀ̱⠶§¹®ÀÌ´Ù.  
                ÇØ½¬ÇÔ¼ö¸¦ ¸¸µå´Âµ¥ À־ °¡Àå Áß¿äÇÑ ºÎºÐÀº ¹Ù·Î  
                ÀԷµ¥ÀÌŸµé¿¡ ´ëÇØ¼­ ÃÖ´ëÇÑ ±ÕµîÇÏ°Ô ºÐÆ÷µÇ´Â ÇØ½¬°ªÀ»  
                ¾ò¾î³»´Â °ÍÀε¥, À§ÀÇ ÇÔ¼ö·Î´Â ºÐ¸íÈ÷ ±ÕµîÇÏ°Ô ºÐÆ÷µÇÁö  
                ¾ÊÀ»°ÍÀÌ´Ù. ÇÏÁö¸¸ ÀÏ´ÜÀº À§ÀÇ ÇØ½¬ÇÔ¼ö¸¦ »ç¿ëÇϵµ·Ï ÇϰڴÙ.  
                Á»´õ ¼º´ÉÁÁÀº ÇØ½¬ÇÔ¼ö´Â ¸¹Àº °í¹Î°ú Å×½ºÆ®¸¦ ÅëÇØ¼­ ¸¸µé¾î  
                Áú¼ö ÀÖÀ»°ÍÀÌ´Ù.(°ø°³µÈ°Íµéµµ ¸¹ÀÌ ÀÖÀ¸´Ï google µîÀ» ÅëÇØ¼­  
                È®ÀÎÇØº¸±â ¹Ù¶õ´Ù)  
            </para> 
        </section> 
        <section> 
            <title>ÃÖÁ¾ÀûÀÎ ÀڷᱸÁ¶</title> 
            <para> 
                ´ÙÀ½Àº ÀÌ·¸°Ô ÇØ¼­ ¸¸µé¾îÁø ÃÖÁ¾ÀûÀÎ ÀڷᱸÁ¶ÀÌ´Ù.  
                <figure> 
                    <title>map ÀڷᱸÁ¶</title> 
                    <graphic fileref=http://www.joinc.co.kr/albums/album01/abf.gif> 
                </figure> 
                hash °ªÀ» À§ÇÑ 1024 Å©±âÀÇ vector °¡ ³õÀδÙ. ÀÌ vector Àº  
                IP,PORT ¸¦ key ·Î °¡Áö°í, TIME, COUNT ¸¦ value·Î °¡Áö´Â map À» ¿ø¼Ò·Î  
                °¡Áø´Ù. TIME Àº ÆÐŶÀÌ µé¾î¿Â ½Ã°£À̸ç, COUNT ´Â ¸î¹ø µé¾î¿Ô´ÂÁö¸¦ °è¼öÇ챉  
                À§Çؼ­ »ç¿ëµÈ´Ù.   
                ÀÌ map ÀÇ ÀڷᱸÁ¶´Â ´ëÃæ ´ÙÀ½°ú °°À» °ÍÀÌ´Ù.  
                <screen> 
typedef struct _key 
{ 
    int ip; 
    int port; 
} key; 
 
typedef struct _value 
{ 
    int time; 
    int count; 
} value; 
 
struct ltstr 
{ 
    bool operator() (key a1, key a2) 
    { 
        return memcmp((void *)&a1, (void *)&a2, 8) < 0; 
    } 
}; 
map<key, value, ltstr> mydata; 
                </screen> 
                ltstr À» ÁÖ¸ñÇϱ⠹ٶõ´Ù. ltstr Àº key ¸¦ Á¤·ÄÇϱâ À§Çؼ­ Á¤ÀǵǾú´Âµ¥,  
                memcmp ¸¦ ÀÌ¿ëÇØ¼­ 2°³ÀÇ ±¸Á¶Ã¼ÀÇ Å©±â¸¦ ºñ±³ÇÑ´Ù. 2°³ÀÇ int ¸¦ °¡Áö°í  
                ÀÖÀ½À¸·Î 8byte Å©±â·Î ºñ±³ÇÏ¸é µÉ°ÍÀÌ´Ù.  
                ´ÙÀ½Àº Å×½ºÆ®¸¦ À§ÇÑ °£´ÜÇÑ ÄÚµåÀÌ´Ù.   
            </para> 
            <para> 
                <emphasis>¿¹Á¦ : map_test.cc</emphasis> 
                <screen> 
#include <vector> 
#include <map> 
#include <iostream> 
 
using namespace std; 
 
// map ÀÇ KEY °ªÀ¸·Î ip¿Í port Á¤º¸¸¦ °¡Áø´Ù. 
typedef struct _key 
{ 
    ulong ip; 
    int port; 
} key; 
 
// map ÀÇ VALUE °ªÀ¸·Î óÀ½ ¸¸µé¾îÁø ½Ã°£°ú  
// Ä«¿îÆ® °¹¼öÀÌ´Ù.  
typedef struct _value 
{ 
    int time; 
    int count; 
} value; 
 
// KEY ÀÎ struct key ¸¦ Á¤·ÄÇϱâ À§Çؼ­ »ç¿ëÇÑ´Ù.  
// memcmp ¸¦ ÀÌ¿ëÇØ¼­ Á¤·ÄÇϵµ·Ï ÇÑ´Ù.  
struct ltstr 
{ 
    bool operator() (key a1, key a2) 
    { 
        return memcmp((void *)&a1, (void *)&a2, 8) < 0; 
    } 
}; 
 
int main() 
{ 
    key mkey; 
    value mvalue; 
    map<key, value, ltstr> mydata; 
 
    mkey.ip = 134; 
    mkey.port = 4; 
    mydata[mkey] = mvalue; 
 
    mkey.ip = 134; 
    mkey.port = 3; 
    mydata[mkey] = mvalue; 
 
    mkey.ip = 132; 
    mkey.port = 1; 
    mydata[mkey] = mvalue; 
 
    map<key,value,ltstr>::iterator mi; 
    mi = mydata.begin(); 
    while(mi != mydata.end()) 
    { 
        cout << mi->first.ip << ","<< mi->first.port << endl; 
        *mi++; 
    } 
} 
                </screen> 
                Á¤·Ä¼ø¼­´Â ¸ÕÀú ip¸¦ ¿ì¼±À¸·Î ÇÑ´Ù. ¸¸¾à ip °¡ µ¿ÀÏÇÒ°æ¿ì port ¹øÈ£·Î  
                Á¤·ÄÀÌ µÉ°ÍÀÌ´Ù. ¾ÆÁ÷Àº ¸¸µé¾îÁø map Á¤º¸¸¦ hash Å×ÀÌºí¿¡ ÀÔ·ÂÇÏÁö ¾Ê¾Ò´Âµ¥,  
                <xref linkend="skelcode">¿¡¼­ ¼³¸íÇÒ°ÍÀÌ´Ù.   
            </para> 
        </section> 
        <section id="skelcode"> 
            <title>skeleton code (°ñ°Ý ÄÚµå)</title> 
            <para> 
                ÀÌÁ¦ ½ÇÁ¦ÀûÀÎ °ñ°Ý Äڵ带 ¸¸µé¾î º¸µµ·Ï ÇÏÀÚ.  
                ÀÌ°Ç ¾îµð±îÁö³ª Áö±Ý±îÁö ¿ì¸®°¡ »ý°¢Çß´ø ÀڷᱸÁ¶°¡ ½ÇÁ¦  
                ±¸ÇöµÉ¼ö ÀÖ´ÂÁö¸¦ È®ÀÎÇØ º¸´Â Å×½ºÆ®¼öÁØÀÇ ÄÚµåÀÌ´Ù.   
            </para> 
            <para> 
                ÀÌ ¾îÇø®ÄÉÀ̼ÇÀº IP¿Í Port ¹øÈ£ ¸¦ ÀÌ¿ëÇØ¼­ Key ¸¦ ¸¸µé°í  
                ¸¸¾à µ¿ÀÏÇÑ IP, Port ¿¡¼­ ¿¬°áÀÌ µé¾î¿Ô´Ù¸é, count ¸¦ 1¾¿ Áõ°¡½ÃŲ´Ù.  
                ¸¸¾à ÁöÁ¤µÈ ½Ã°£(À§À¸ Äڵ忡¼­´Â 30ÃÊ) µ¿¾È 100 ¹øÀÌ»óÀÇ count °¡  
                ¹ß»ýÇÒ°æ¿ì Dos °ø°ÝÀ̶ó°í ÆÇ´ÜÇÏ°í ¿ö´× ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÑ´Ù.   
                <screen> 
#include <vector> 
#include <map> 
#include <time.h> 
#include <iostream> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <sys/types.h> 
 
using namespace std; 
 
typedef struct _key 
{ 
    ulong ip; 
    int port; 
} key; 
 
typedef struct _value 
{ 
    int time; 
    int count; 
} value; 
 
struct ltstr 
{ 
    bool operator() (key a1, key a2) 
    { 
        return memcmp((void *)&a1, (void *)&a2, 8) < 0; 
    } 
}; 
int hash(ulong ip) 
{ 
    return ip >> 22; 
} 
 
map<key, value, ltstr> mydata; 
vector<map<key, value, ltstr> > hash_map(1024); 
 
void InitValue(value *mvalue); 
int insert_packet(key akey); 
 
int main() 
{ 
    key mkey; 
    value mvalue; 
 
    // Å×½ºÆ®¿ë ÀÚ·á ÀÔ·Â ---------------- 
    mkey.ip = inet_addr("192.168.100.1"); 
    mkey.port = 21 ; 
    insert_packet(mkey); 
 
    mkey.ip = inet_addr("192.168.100.1"); 
    mkey.port = 2; 
    insert_packet(mkey); 
 
    mkey.ip = inet_addr("192.168.100.3"); 
    mkey.port = 22; 
    insert_packet(mkey); 
 
    mkey.ip = inet_addr("192.168.100.200"); 
    mkey.port = 80; 
    insert_packet(mkey); 
 
    mkey.ip = inet_addr("192.168.100.1"); 
    mkey.port = 2; 
    insert_packet(mkey); 
    // Å×½ºÆ®¿ë ÀÚ·á ÀÔ·Â ---------------- 
 
 
    // Å×½ºÆ®¸¦ À§Çؼ­ Ãâ·ÂÇÑ´Ù.  
    // 192.168.100.1 ¿¡ ´ëÇÑ hash ۸¦ ¸¸µé°í  
    // °ªÀ» Ãâ·ÂÇØº»´Ù.   
    mkey.ip = inet_addr("192.168.100.1"); 
    mkey.port = 2; 
 
    map<key, value, ltstr>::iterator mi; 
 
    cout << hash(mkey.ip) << endl; 
    mi = hash_map[hash(mkey.ip)].find(mkey);  
    if (mi == hash_map[hash(mkey.ip)].end()) 
    { 
        cout << "not found " << endl; 
    } 
    else 
    { 
        cout << mi->second.time << ":" << mi->second.count << endl; 
    } 
} 
 
// key ¸¦ ÀԷ¹޾Ƽ­  
// hash ۸¦ ¸¸µé¾î¼­ ÇØ´ç hash_map ÀڷᱸÁ¶¿¡ ÀÔ·ÂÇÑ´Ù.  
int insert_packet(key akey) 
{ 
    value mvalue; 
    int hash_value = hash(akey.ip); 
    map<key,value,ltstr>::iterator mi; 
    mi = hash_map[hash_value].find(akey); 
 
    InitValue(&mvalue); 
 
    // ¸¸¾à ÀÌ¹Ì Á¸ÀçÇϰí ÀÖ´Ù¸é 
    // count ¸¦ Áõ°¡ ½ÃŲ´Ù.  
    if (mi != hash_map[hash_value].end()) 
    { 
        cout << "Count Áõ°¡" << endl; 
        mi->second.count++; 
    } 
    // ±×·¸Áö ¾Ê´Ù¸é »õ·Î »ý¼ºÇÑ´Ù.  
    else 
    { 
        cout << "Insert " << endl; 
        hash_map[hash_value].insert(pair<key, value>(akey, mvalue)); 
    } 
} 
 
void InitValue(value *mvalue) 
{ 
    mvalue->time = time((time_t *)NULL);  
    mvalue->count = 1; 
} 
                </screen> 
            </para> 
        </section> 
    </section> 
    <section> 
        <title>¹®Á¦ ¹ß»ý(È¿À² ¹®Á¦)</title> 
        <para> 
            ºñ·Ï °ñ°Ý ÄÚµåÀ̱ä ÇÏÁö¸¸ À§ÀÇ Äڵ尡 ºñ±³Àû È¿À²ÀûÀ¸·Î  
            ÀÛµ¿Çϸ®¶õ°É ¿¹»óÇÒ¼ö ÀÖ´Ù.  
            ±×·¯³ª ÀÌ°Ç ¾îµð±îÁö³ª µ¥ÀÌŸ ÀÔ·ÂÀÇ °æ¿ìÀÌ´Ù.  
        </para> 
        <para> 
            À§ÀÇ ¹æ½ÄÀ¸·Î ÇØ¼­ µ¥ÀÌŸ°¡ °è¼Ó ½×ÀÌ´Â °Ç ±×·¸´Ù Ä¡°í,  
            Àú·± »óÅ·Π¸î½Ã°£¸¸ µ¹¸é ºÐ¸íÈ÷ map ¿¡´Â ¼ö½Ê/¼ö¹é¸¸°ÇÀÇ  
            µ¥ÀÌŸ°¡ ½×ÀÌ°Ô µÉ°ÍÀÌ´Ù. ±âº»ÀûÀ¸·Î Ä«¿îÅͰ¡ ÀÏÁ¤¼ö¸¦  
            ³Ñ¾î°¡¾ß¸¸ Áö¿öÁö±â ¶§¹®¿¡ Ä«¿îÅͰ¡ ÃʰúÇßÀ»°æ¿ì  
            ÀڷᱸÁ¶¿¡¼­ Áö¿öÁø´Ù°í ÇÏ´õ¶óµµ, ±×·¸Áö ¾ÊÀº ¼ö¸¹Àº  
            µ¥ÀÌŸ´Â Áö¿öÁöÁö ¾ÊÀ»°ÍÀ̱⠶§¹®ÀÌ´Ù.  
                °á±¹ ¸î½Ã°£µµ ¾ÈµÇ¾î¼­  
            ¸ðµç ½Ã½ºÅÛ ¸Þ¸ð¸® ÀÚ¿øÀ» ¸ù¶¥ ½á¹ö¸®°Ô µÉ°ÍÀÌ´Ù.    
        </para> 
        <para> 
            ÀÌ·¯ÇÑ ¹®Á¦ÀÇ ÇØ°áÀ» À§Çؼ­ value ¿¡ time À̶ó´Â º¯¼ö¸¦  
            µÎ±ä ÇßÀ½À¸·Î, ÀÏÁ¤½Ã°£ ¸¶´Ù time ¸¦ È®ÀÎÇϰí,  
            ÃʰúµÈ ¸Þ½ÃÁö´Â Áö¿öÁÜÀ¸·Î½á ÇØ°áÀÌ °¡´ÉÇÒ °ÍÀÌ´Ù.  
        </para> 
        <para> 
            ±×·¸´Ù¸é ¾î¶»°Ô Áö¿öÁÙ°ÍÀΰ¡.. ´Ü¼øÇѹæ¹ýÀº  vector ÀÇ 0¹øºÎÅÍ  
            1023¹ø±îÁöÀÇ ¸ðµç map À» ¼øÈ¯Çϸ鼭 ÀÏÀÏÀÌ time ºñ±³¸¦ ÇØ¼­  
            time ÀÌ ÃʰúÇßÀ»°æ¿ì Áö¿öÁÖ´Â ¹æ¹ýÀε¥,  
            ô ºÁµµ ¾Ë°ÚÁö¸¸, ³Ê¹«³Ê¹« ºñÈ¿À²ÀûÀÌ´Ù. µ¥ÀÌŸ°¡ ½Ê¸¸  
            ȤÀº ¹é¸¸ Á¤µµ µé¾îÀÖ´Ù°í °¡Á¤ÇØ º¸ÀÚ. Á¦´ë·Î ÀÛµ¿ÇÏ´Â°É  
            ±â´ëÇϱâ Èûµé°ÍÀÌ´Ù.     
        </para> 
        <section> 
            <title>ÇØ°á - ÀÌÅÍ·¹ÀÌÅÍ ÀúÀåÇϱâ</title> 
            <para> 
                ÀÌ·²°æ¿ì »ý°¢ÇÒ¼ö ÀÖ´Â ¹æ¹ýÀÌ garbage µ¥ÀÌŸ Á¤¸®¸¦ À§ÇÑ  
                º°µµÀÇ ÀڷᱸÁ¶¸¦ Çϳª ¸¸µé¾î¼­ À¯ÁöÇÏ´Â °ÍÀÌ´Ù.  
                ¿©·¯°¡Áö ÀڷᱸÁ¶¸¦ »ý°¢ÇÒ¼ö Àִµ¥, ¿©±â¿¡¼­´Â  
                multimapÀ» »ç¿ëÇϵµ·Ï Çß´Ù. key ´Â time ÀÌ µÉ°ÍÀε¥,  
                ÀÌ time ÀÌ ºÐ¸íÈ÷ °ãÄ¥¼ö ÀÖÀ»°ÍÀ̱⠶§¹®ÀÌ´Ù.   
                <screen> 
multimap<int, map<key.value.ltstr>::iterator> garbage_collect; 
                </screen> 
                ¾ÆÀ̵ð¾î´Â °£´ÜÇÏ´Ù. À§¿¡¼­ ¿ì¸®°¡ map µ¥ÀÌŸ¸¦  
                ÀÔ·ÂÇÒ¶§ µ¿½Ã¿¡ À§ÀÇ garbage_collect ÀڷᱸÁ¶¿¡  
                mapµ¥ÀÌŸÀÇ iteraotr À» ÀԷ½ÃÄÑÁÖ´Â °ÍÀÌ´Ù.  
                ±×¸®°í ÀÏÁ¤½Ã°£ÀÌ Áö³ª¸é garbage_collect ÀڷᱸÁ¶¸¦  
                ¼øÈ¯Çϸ鼭 ½Ã°£ÀÌ ÃʰúµÈ iterator ¿¡ ´ëÇØ¼­  
                »èÁ¦¸¦ ÇØÁÖ¸é µÉ°ÍÀÌ´Ù. Æ÷ÀÎÅ͸¦ º°µµ·Î ÀúÀåÇØ³õ°í  
                Æ÷ÀÎÅ͸¦ ÀÌ¿ëÇØ¼­ garbage µ¥ÀÌŸ¸¦ »èÁ¦ÇØÁÖ´Â °Í°ú  
                ºñ½ÁÇÑ ¹æ½ÄÀÌ´Ù.   
            </para>   
            <para>   
                ½Ã°£ º¹Àâµµ¸¦ °è»êÇØº¸¸é  
                garbage_collect ¿¡¼­ ¿øÇÏ´Â ¹üÀ§ÀÇ ¿ø¼Ò¸¦ »èÁ¦Çϴµ¥   
                °É¸®´Â ½Ã°£ "O(log(size()) + N)", garbage_collect ¿¡¼­  
                ³ª¿Â iterator ¸¦ ÀÌ¿ëÇØ¼­ »èÁ¦½Ã۴µ¥ °É¸®´Â  
                ½Ã°£ O(1) + N, ip ¸¦ hash ·Î ¹Ù²Ù´Âµ¥ °É¸®´Â ½Ã°£ O(1) + N  
                Á¤µµ°¡ µÈ´Ù.  
                <screen> 
O(log(size()) + N) + O(2N)  
                </screen> 
                N Àº »èÁ¦ÇؾßÇÒ ¿ø¼ÒÀÇ °¹¼öÀÌ´Ù. ¿¹¸¦µé¾î  
                1000000 °³ÀÇ µ¥ÀÌŸ¿¡¼­ 100 °³ÀÇ µ¥ÀÌŸ¸¦ »èÁ¦ÇØ¾ß  
                ÇÑ´Ù°í °¡Á¤ÇßÀ»¶§, 6+100+200 = 306 Á¤µµ°¡  
                µÉ°ÍÀÌ´Ù.  
            </para>   
            <para>   
                hashvector ÀÇ Ã³À½ºÎÅÍ ³¡±îÁö ¼øÈ¯ÇÏ´Â  
                ¹«½ÄÇÑ ¹æ¹ýÀ» »ç¿ëÇßÀ»°æ¿ì ¼øÈ¯¿¡ °É¸®´Â ½Ã°£ N ¿¡  
                ºñ±³Çϴµ¥ °É¸®´Â ½Ã°£, »èÁ¦Çϴµ¥ °É¸®´Â ½Ã°£µîÀ»  
                ¿¹»óÇϸé ÃÖ¼Ò 2000000 ½Ã°£ÀÌ ¼Ò¸ðµÉ°ÍÀÌ´Ù.  
                (¼øÈ¯¿¡ °É¸®´Â ½Ã°£ 1000000 + ºñ±³Çϴµ¥ °É¸®´Â½Ã°£  
                1000000, °Å±â¿¡ »èÁ¦ÇÒ ¿ø¼Ò N°³) 
            </para>   
            <para> 
                ±×·³ °£´ÜÇÏ°Ô Å×½ºÆ® Äڵ带 Çϳª ¸¸µé¾î º¸µµ·Ï  
                ÇϰڴÙ.  
                ºñ·Ï Å×½ºÆ® ÄÚµåÀ̱ä ÇÏÁö¸¸ "ÀÌÅÍ·¹ÀÌÅÍ ÀúÀå" ¾ÆÀ̵ð¾î°¡  
                Çö½ÇÀûÀÎÁö´Â È®ÀÎÇØ º¼¼ö ÀÖÀ» °ÍÀÌ´Ù.  
            </para> 
            <para> 
                <emphasis>¿¹Á¦ : iterator_map.cc</emphasis> 
                <screen> 
#include <map> 
#include <string> 
#include <iostream> 
using namespace std; 
 
typedef struct _mydata 
{ 
    int age; 
    int num; 
} mydata; 
 
int main() 
{ 
    mydata md; 
 
    // map ÀڷᱸÁ¶¹× iterator ¼±¾ð 
    map<int, mydata> data[1024]; 
    map<int, mydata>::iterator mi, my; 
 
    // iterator ¸¦ ÀúÀåÇϱâ À§ÇÑ map °ú  
    // À̰ÍÀÇ iterator ¼±¾ð 
    map<int, map<int,mydata>::iterator> garbage_map; 
    map<int, map<int,mydata>::iterator>::iterator mmi; 
 
    // Å×½ºÆ®¿ë µ¥ÀÌŸ ÀÔ·Â 
    md.age = 12; 
    md.num = 1; 
    data[0][1] = md; 
 
    md.age = 19; 
    md.num = 3; 
    data[0][3] = md; 
 
    md.age = 28; 
    md.num = 2; 
    data[0][2] = md; 
 
    md.age = 40; 
    md.num = 22; 
    data[0][4] = md; 
 
    md.age = 42; 
    md.num = 26; 
    data[0][5] = md; 
 
    md.age = 38; 
    md.num = 12; 
    data[0][6] = md; 
    // Å×½ºÆ®¿ë µ¥ÀÌŸ ÀÔ·Â Á¾·á 
 
    int i = 1; 
    mi = data[0].begin(); 
    // Å×½ºÆ®¿ë µ¥ÀÌŸ¸¦ iterator ·Î ¼øÈ¯Çϸ鼭  
    // ÇØ´ç iterator ¸¦ iterator ¸¦ ÀúÀåÇϱâ À§ÇÑ map ¿¡  
    // ÀÔ·Â  
    while(mi != data[0].end()) 
    { 
        // ÀÔ·Â µð¹ö±ë¿ë Ãâ·Â 
        cout << mi->first << ": " << mi->second.num <<  "," 
            << mi->second.age<< endl; 
        // iterator ¸¦ ÀڷᱸÁ¶¿¡ ÀúÀåÇÔ 
        garbage_map[i] = mi; 
        *mi++; 
        i++; 
    } 
    cout << "==============================" << endl; 
 
    // key ÀÇ °ªÀÌ 4º¸´Ù ´õÅ« ÀÌÅÍ·¹ÀÌÅ͸¦ ¸ðµÎ »èÁ¦ÇÑ´Ù.    
    mmi = garbage_map.find(4); 
    while(mmi != garbage_map.end()) 
    { 
        cout << "erase " << endl; 
        data[0].erase(mmi->second); 
        *mmi++; 
    } 
 
    // garbage map ¿¡¼­ ÇÊ¿ä¾ø´Â µ¥ÀÌŸ¸¦ »èÁ¦ÇÑ´Ù.  
    mmi = garbage_map.find(4); 
    garbage_map.erase(mmi, garbage_map.end()); 
    cout << "iterator num "  << garbage_map.size() << endl; 
 
    cout << "==============================" << endl; 
 
    // map µ¥ÀÌŸ¸¦ Ãâ·ÂÇÑ´Ù. µð¹ö±ë¿ë   
    mi = data[0].begin(); 
    while(mi != data[0].end()) 
    { 
        cout << mi->first << ": " << mi->second.num <<  "," 
            << mi->second.age<< endl; 
        *mi++; 
    } 
    cout << "==============================" << endl; 
} 
                </screen> 
                °£´ÜÇÏ°Ô Å×½ºÆ® °¡´ÉÇÒ °Å´Ù. 
            </para> 
            <para> 
                À§ÀÇ Äڵ带 ÀÀ¿ëÇÏ¸é µ¥ÀÌŸ »èÁ¦±îÁö ºü¸¥½Ã°£¿¡ °¡´ÉÇϵµ·Ï  
                Á»´õ ±×·²µíÇÑ Äڵ带 ¸¸µé¼ö ÀÖÀ»°ÍÀÌ´Ù.    
            </para> 
        </section> 
    </section> 
</section> 
<section> 
    <title>°á·Ð</title> 
    <para> 
        ÀÌ»ó °£´ÜÇÏ°Ô STL¿¡ ´ëÇÑ ¸î°¡Áö À̽´¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸¾Ò´Ù.  
        °³ÀÎÀûÀ¸·Î´Â DOS ATTACK °ËÃâÀ» À§ÇÑ Á»´õ ¿Ïº®ÇÑ ¿¹Á¦¸¦ µé¾îº¸°í  
        ½Í¾úÀ¸³ª ±×·¸°Ô Çϱâ À§Çؼ± ÆÐŶĸÃÄ¿Í À̸¦ È¿À²ÀûÀ¸·Î ºÐ¼®Çؼ­  
        °ËÃâÇØ ³»´Â ¹æ¹ý¿¡ ´ëÇØ¼­ Á»´õ °í¹ÎÇØ¾ß Çϱ⠶§¹®¿¡(ÇѸ¶µð·Î ±ÍÂú¾Æ¼­)    
        ¿Ïº®ÇÑ ¿¹Á¦¸¦ ¸¸µéÁö´Â ¸øÇß´Ù.  
    </para> 
    <para> 
        ±×·¸Áö¸¸ STL°ú Iterator ¿¡ ´ëÇÑ ¸î°¡Áö À̽´¿Í ÆÁÁ¤µµ´Â ¾ò¾úÀ»°Å¶ó°í  
        »ý°¢ÇÑ´Ù.  
    </para> 
    <para> 
        ¾ðÁ¨°¡ ÀÌ ¹®¼­ÀÇ ÈļӯíÀÌ ¸¸µé¾îÁö¸é Á»´õ ¿Ïº®ÇÑ ¿¹Á¦¸¦ Æ÷ÇÔ½Ã۵µ·Ï ÇϰڴÙ.  
    </para> 
</section> 
 
</article> 
 
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.