典型錯誤
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++; } }