遍歷一個容器同時刪除這個容器的迭代器,會使這個容器失效
來看下什么是迭代器, 任何特定的迭代器都是某個類型的對象,vectorr的迭代器可以被實現(xiàn)為一個到vector的指針,加一個下標
表的迭代器可以是一個指向鏈表的指針, 所有迭代器的共同之處在于它們的語義,以及它們的有關(guān)操作的名字。
eg.迭代器++操作總是產(chǎn)生引用下一個元素的迭代器, *總是產(chǎn)生這個迭代器引用的那個元素,基本上符合這些的都可以成為迭代器了
常用的遍歷刪除迭代器方法,拿map舉例
map<int, int> mp;
for( int i = 0; i < 10; ++i )
{
mp[i] = i;
}
map<int, int>::iterator iter = mp.begin();
while( iter != mp.end() )
{
if ( iter->first < 10 )
{
mp.erase( iter++ );
}
else
{
++iter;
}
}
在刪除時記錄下下一個有效的迭代器就OK了
如果用同樣的方法使用在vector上就崩了,這個是為什么呢
vector<int> vec;
for( int i = 0 ;i < 20; ++i )
{
vec.push_back( i );
}
vector<int>::iterator it = vec.begin();
while( it != vec.end() )
{
if ( *it < 10 )
{
vec.erase( it++ ); // 導致崩潰
}
else
{
++it;
}
}
這是因為vector和list,map刪除迭代器后結(jié)果不一樣, 因為map, list刪除迭代器后,只有當前刪除的迭代器無效, it++就可以獲得下一個有效的迭代器了,但是vector 刪除迭代器后,
當前刪除的迭代器之后的所有迭代器都會失效
正確方法
#include <windows.h>
#include <map>
#include <string>
#include <list>
#include <vector>
#include <algorithm>
using namespace std;
bool gt_val( int val )
{
return val%2 == 0 ? true : false;
}
int main()
{
vector<int> vec;
for( int i = 0 ;i < 20; ++i )
{
vec.push_back( i );
}
// 標準庫調(diào)用方法
vector<int>::iterator it = vec.begin();
while( (it = find_if( it, vec.end(), gt_val))!= vec.end() )
{
it = vec.erase( it );
}
// 普通調(diào)用方法
it = vec.begin();
while( it != vec.end() )
{
if ( *it < 10 )
{
it = vec.erase( it );
}
else
{
++it;
}
}
map<int, int> mp;
for( int i = 0; i < 10; ++i )
{
mp[i] = i;
}
map<int, int>::iterator iter = mp.begin();
while( iter != mp.end() )
{
if ( iter->first < 10 )
{
iter = mp.erase( iter );
}
else
{
++iter;
}
}
}
posted on 2011-11-08 17:33
風輕云淡 閱讀(693)
評論(0) 編輯 收藏 引用 所屬分類:
C++