遍歷一個(gè)容器同時(shí)刪除這個(gè)容器的迭代器,會(huì)使這個(gè)容器失效
來看下什么是迭代器, 任何特定的迭代器都是某個(gè)類型的對(duì)象,vectorr的迭代器可以被實(shí)現(xiàn)為一個(gè)到vector的指針,加一個(gè)下標(biāo)
表的迭代器可以是一個(gè)指向鏈表的指針, 所有迭代器的共同之處在于它們的語義,以及它們的有關(guān)操作的名字。
eg.迭代器++操作總是產(chǎn)生引用下一個(gè)元素的迭代器, *總是產(chǎn)生這個(gè)迭代器引用的那個(gè)元素,基本上符合這些的都可以成為迭代器了
常用的遍歷刪除迭代器方法,拿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;
}
}
在刪除時(shí)記錄下下一個(gè)有效的迭代器就OK了
如果用同樣的方法使用在vector上就崩了,這個(gè)是為什么呢
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++ ); // 導(dǎo)致崩潰
}
else
{
++it;
}
}
這是因?yàn)関ector和list,map刪除迭代器后結(jié)果不一樣, 因?yàn)閙ap, list刪除迭代器后,只有當(dāng)前刪除的迭代器無效, it++就可以獲得下一個(gè)有效的迭代器了,但是vector 刪除迭代器后,
當(dāng)前刪除的迭代器之后的所有迭代器都會(huì)失效
正確方法
#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 );
}
// 標(biāo)準(zhǔn)庫調(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
風(fēng)輕云淡 閱讀(700)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
C++