C++中list的erase()函數問題


典型錯誤

for(list::iterator it=li.begin();it!=li.end();it++){
    li.erase(it);
}

問題:該程序不能跳出循環
原因:li.erase(it);每次做erase時都有可能使迭代器失效,it++就發生錯誤了。可以參見effective stl一書。所有容器做erase操作時都有可能使迭代器失效。

因為,當list執行erase函數后,會刪除對應it的元素,這時迭代器it自動更新為下一個元素的地址(下一個指刪除元素的下一個)。這時再執行it++,就會把

迭代器it指向刪除元素的下下個,導致最終失效,因為跳過一個元素。

正確寫法有:

while{ it!= li.end(); ){
		if (*it % 2)
		{
			li.erase(it++); //在刪除it還在時,對其++
		}
		else
                {
			it++;
                }
}

 或者:

while{ it!= li.end(); ){
        if (*it % 2)
        {
            it=li.erase(it); //erase函數返回值為刪除元素的下一個元素的迭代器(其實就是一個指針),把它賦值給it,就相當於++了。我更喜歡第一種寫法。
        }
        else
        {
            it++;
        }
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM