下面材料整理自Internet&著作。
STL中的容器按存儲方式分為兩類,一類是按以數組形式存儲的容器(如:vector 、deque);另一類是以不連續的節點形式存儲的容器(如:list、set、map)。在使用erase方法來刪除元素時,需要注意一些問題。
在使用 list、set 或 map遍歷刪除某些元素時可以這樣使用:
1 std::list< int> List; 2 std::list< int>::iterator itList; 3 for( itList = List.begin(); itList != List.end(); ) 4 { 5 if( WillDelete( *itList) ) 6 { 7 itList = List.erase( itList); 8 } 9 else 10 itList++; 11 }
1 std::list< int> List; 2 std::list< int>::iterator itList; 3 for( itList = List.begin(); itList != List.end(); ) 4 { 5 if( WillDelete( *itList) ) 6 { 7 List.erase( itList++); 8 } 9 else 10 itList++; 11 }
1 std::list< int> List; 2 std::list< int>::iterator itList; 3 for( itList = List.begin(); itList != List.end(); itList++) 4 { 5 if( WillDelete( *itList) ) 6 { 7 List.erase( itList); 8 } 9 }
1 std::list< int> List; 2 std::list< int>::iterator itList; 3 for( itList = List.begin(); itList != List.end(); ) 4 { 5 if( WillDelete( *itList) ) 6 { 7 itList = List.erase( ++itList); 8 } 9 else 10 itList++; 11 }
正確使用方法1:通過erase方法的返回值來獲取下一個元素的位置
正確使用方法2:在調用erase方法之前先使用 “++”來獲取下一個元素的位置
錯誤使用方法1:在調用erase方法之後使用“++”來獲取下一個元素的位置,由於在調用erase方法以後,該元素的位置已經被刪除,如果在根據這個舊的位置來獲取下一個位置,則會出現異常。
錯誤使用方法2:同上。
在使用 vector、deque遍歷刪除元素時,也可以通過erase的返回值來獲取下一個元素的位置:
1 std::vector< int> Vec; 2 std::vector< int>::iterator itVec; 3 for( itVec = Vec.begin(); itVec != Vec.end(); ) 4 { 5 if( WillDelete( *itVec) ) 6 { 7 itVec = Vec.erase( itVec); 8 } 9 else 10 itList++; 11 }