• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            面對現實,超越自己
            逆水行舟,不進則退
            posts - 269,comments - 32,trackbacks - 0
                  STL中的容器按存儲方式分為兩類:一類是按以數組形式存儲的容器(如:vector,deque);另一類是以不連續的節點形式存儲的容器(如:list,map,set)。
                  在使用erase方法刪除元素時,迭代器有時候會失效。在Effective STL,條款9,找到了erase容器中元素的原則。

                     1. 對于關聯容器(如map, set, multimap,multiset),刪除當前的iterator,僅僅會使當前的iterator失效,只要在erase時,遞增當前iterator即可。這是因為map之類的容器,使用了紅黑樹來實現,插入、刪除一個結點不會對其他結點造成影響。
            錯誤的使用方法

                std::map<stringstring> mapTest;
                std::map<stringstring>::iterator iter; 
                
            for ( iter = mapTest.begin();iter != mapTest.end(); iter ++ ) 
                { 
                    
            if ( iter->second == "test" ) 
                    { 
                        mapTest.erase( iter ); 
                    } 
                } 

            正確的使用方法1:
                std::map<stringstring> mapTest;
                std::map<stringstring>::iterator iter; 
                
            for ( iter = mapTest.begin();iter != mapTest.end();) 
                { 
                    
            if ( iter->second == "test" ) 
                    { 
                        mapTest.erase( iter++ ); 
                    } 
                    
            else
                    {
                        iter++// Use Pre Increment for efficiency. 
                    }
                } 
                  因為iter傳給erase方法的是一個副本,iter++會指向下一個元素。
             
            正確的使用方法2:
                std::map<stringstring> mapTest;
                std::map<stringstring>::iterator iter; 
                 for ( iter = mapTest.begin();iter != mapTest.end();) 
                { 
                    if ( iter->second == "test" ) 
                    { 
                        iter = mapTest.erase( iter ); 
                    } 
                    else
                    {
                           ++iter; // Use Pre Increment for efficiency. 
                    }
                } 

                     2. 對于序列式容器(如vector,deque),刪除當前的iterator會使后面所有元素的iterator都失效。這是因為vetor,deque使用了連續分配的內存,刪除一個元素導致后面所有的元素會向前移動一個位置。還好erase方法可以返回下一個有效的iterator
                   3. 對于list來說,它使用了不連續分配的內存,并且它的erase方法也會返回下一個有效的iterator,因此上面兩種正確的方法都可以使用。
                  
            其他鏈接:http://www.shnenglu.com/Herbert/archive/2009/01/08/70479.html
            其他
            鏈接:http://blog.csdn.net/kay226/article/details/6126515
            其他鏈接
            http://www.shnenglu.com/humanchao/archive/2013/04/22/199630.html
            posted on 2013-10-14 18:22 王海光 閱讀(1012) 評論(0)  編輯 收藏 引用 所屬分類: STL
            久久99精品久久久久久齐齐| 久久精品中文字幕大胸| 丁香五月网久久综合| 久久免费国产精品一区二区| 国产福利电影一区二区三区久久老子无码午夜伦不| 久久久91精品国产一区二区三区 | 国产精品久久久久乳精品爆| 九九久久精品国产| 国产成人精品综合久久久| 99久久99久久精品国产片果冻| 色婷婷噜噜久久国产精品12p | 亚洲国产欧洲综合997久久| 国产午夜免费高清久久影院| 日韩久久久久中文字幕人妻| 久久精品亚洲精品国产色婷| 久久青青草原精品国产不卡| 97精品久久天干天天天按摩| 2021最新久久久视精品爱| 成人亚洲欧美久久久久| 欧美精品久久久久久久自慰| 久久亚洲AV成人无码软件| 国产精品美女久久久久AV福利| 久久精品国产亚洲av水果派| 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 久久精品中文字幕一区| 久久亚洲AV成人无码电影| 久久这里只有精品首页| 亚洲伊人久久综合中文成人网| 国内精品伊人久久久久影院对白| 91精品国产9l久久久久| 久久天堂AV综合合色蜜桃网| 99精品国产综合久久久久五月天| 国产欧美久久久精品影院| 久久久久国产日韩精品网站| 久久e热在这里只有国产中文精品99 | 久久久久亚洲精品天堂久久久久久| 久久91精品国产91久久麻豆| 久久国产免费观看精品3| 日产精品99久久久久久| 久久亚洲精品人成综合网| 久久天天躁狠狠躁夜夜96流白浆|