目錄
一、list iterator的使用
二、list的迭代器失效
一、list iterator的使用
? ? ? ? 對(duì)于list的迭代器的用法,可以將它看做一個(gè)指針(實(shí)際要更加復(fù)雜)來(lái)使用,該指針指向list中的一個(gè)節(jié)點(diǎn)。
? ? ? ? 【注意】
? ? ? ? (1)begin和end為正向迭代器,對(duì)迭代器執(zhí)行++操作,迭代器向后移動(dòng)
? ? ? ? (2)rbegin和rend是反向迭代器,對(duì)迭代器執(zhí)行++操作,迭代器向前移動(dòng)
二、list的迭代器失效
? ? ? ? list的迭代器失效即迭代器所指向的節(jié)點(diǎn)被刪除掉了。list是帶哨兵位頭節(jié)點(diǎn)的雙向循環(huán)鏈表,在list中進(jìn)行插入節(jié)點(diǎn)不會(huì)導(dǎo)致list的迭代器失效,只有刪除節(jié)點(diǎn)時(shí)才會(huì)出現(xiàn)失效問(wèn)題,并且失效的只是指向被刪除節(jié)點(diǎn)的迭代器,其他迭代器不受影響。
//list迭代器失效測(cè)試案例
void Test1()
{
int arr[] = { 1,2,3,4,5,6,7,8,9 };
list<int> l(arr, arr + sizeof(arr) / sizeof(arr[0]));
list<int>::iterator it = l.begin();
cout << *it << endl;
while (it != l.end())
{
l.erase(it);
it++; //erase()函數(shù)執(zhí)行后,it所指向的節(jié)點(diǎn)已被刪除,導(dǎo)致it失效,所以不能再對(duì)it進(jìn)行++操作
}
}
? ? ? ? ?上面測(cè)試代碼調(diào)試觸發(fā)異常:"cannot increment value-initialized list iterator",(即迭代器失效)
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-819401.html
? ? ? ? list.erase()的返回值是指向帶刪除節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)的迭代器,所以為避免迭代器失效,針對(duì)上述測(cè)試代碼可以做以下修改:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-819401.html
void Test2()
{
int arr[] = { 1,2,3,4,5,6,7,8,9 };
list<int> l(arr, arr + sizeof(arr) / sizeof(arr[0]));
list<int>::iterator it = l.begin();
while (it != l.end())
{
cout << *it << endl;
l.erase(it++); //等價(jià)于it=l.erase(it) 即用it來(lái)接收指向下一個(gè)節(jié)點(diǎn)的迭代器
//erase()返回的是指向待刪除節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)的迭代器
}
}
到了這里,關(guān)于【c++】list迭代器失效問(wèn)題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!