隨筆-124  評論-194  文章-0  trackbacks-0


          Stl 刪除元素注意事項

                STL中的容器按存儲方式分為兩類,一類是按以數組形式存儲的容器(如:vector 、deque);另一類是以不連續的節點形式存儲的容器(如:list、set、map)。在使用erase方法來刪除元素時,需要注意一些問題。
                在使用 list、set 或 map遍歷刪除某些元素時可以這樣使用:

          正確使用方法1      std::list< int> List; 
                std::list< int>::iterator itList; 
                for( itList = List.begin(); itList != List.end(); ) 
                { 
                      if( WillDelete( *itList) ) 
                      { 
                         itList = List.erase( itList); 
                      } 
                      else 
                         itList++; 
                } 

                 或

          正確使用方法2      std::list< int> List; 
                std::list< int>::iterator itList; 
                for( itList = List.begin(); itList != List.end(); ) 
                { 
                      if( WillDelete( *itList) ) 
                      { 
                         List.erase( itList++); 
                      } 
                      else 
                         itList++; 
                } 

                
                下面是兩個錯 誤的使用方法:

          錯誤使用方法1      std::list< int> List; 
                std::list< int>::iterator itList; 
                for( itList = List.begin(); itList != List.end(); itList++) 
                { 
                      if( WillDelete( *itList) ) 
                      { 
                         List.erase( itList); 
                      } 
                } 

                   或
          錯誤使用方法2      std::list< int> List; 
                std::list< int>::iterator itList; 
                for( itList = List.begin(); itList != List.end(); ) 
                { 
                      if( WillDelete( *itList) ) 
                      { 
                         itList = List.erase( ++itList); 
                      } 
                      else 
                         itList++; 
                } 

                正確使用方法 1:通過erase方法的返回值來獲取下一個元素的位置
                正確使用方法 2:在調用erase方法之前先使用 “++”來獲取下一個元素的位置
                錯誤使用方法 1:在調用erase方法之后使用“++”來獲取下一個元素的位置,由于在調用erase方法以后,該元素的位置已經被刪除,如果在根據這個舊的位置來獲 取下一個位置,則會出現異常。
                錯誤使用方法 2:同上。

                這里“++” 運算符與我們平常的理解剛好相反,erase( itList++) 是先獲取下一個元素的位置在刪除; erase( ++itList) 是刪除以后再獲取下一個元素的位置。

               在使用 vector、deque遍歷刪除元素時,也可以通過erase的返回值來獲取下一個元素的位置:
          正確使用方法      std::vector< int> Vec; 
                std::vector< int>::iterator itVec; 
                for( itVec = Vec.begin(); itVec != Vec.end(); ) 
                { 
                      if( WillDelete( *itVec) ) 
                      { 
                           itVec = Vec.erase( itVec); 
                      } 
                      else 
                         itList++; 
                }
                
                注 意:vector、deque 不能像上面的“正確使用方法2”的辦法來遍歷刪除。
          posted on 2011-07-18 17:02 我愛佳娃 閱讀(1489) 評論(0)  編輯  收藏 所屬分類: 工具使用
          主站蜘蛛池模板: 四川省| 双桥区| 正镶白旗| 海林市| 汉阴县| 绥中县| 绥滨县| 梁河县| 三门峡市| 藁城市| 定远县| 乌什县| 长春市| 瑞金市| 丹巴县| 岗巴县| 淮南市| 安丘市| 郴州市| 卫辉市| 盱眙县| 抚顺市| 云林县| 城固县| 隆安县| 邹平县| 正镶白旗| 多伦县| 罗平县| 吉安市| 玉龙| 哈巴河县| 巴彦县| 麦盖提县| 章丘市| 亚东县| 西宁市| 太和县| 盐城市| 宜阳县| 荣昌县|