c++ erase 會使迭代器失效
阿新 • • 發佈:2019-01-09
因為erase函式會真正刪除元素,導致後面的元素前移,因此後面的迭代器失效(不能引用到正確的結果)所以每次執行完erase操作之後,後面的迭代器都會失效,看看下main的程式碼:
int removeDuplicates(vector<int>& nums) {
map<int,int> tmp_map;
for(vector<int>::iterator it = nums.begin(); it != nums.end(); ++it){
tmp_map[*it]++;
if(tmp_map[*it] != 1){
nums.erase(it); //it = nums.erase(it); //it--; } } for(auto c : nums) cout<<c<<endl; return nums.size(); }
上面程式碼,刪除了vector中重複出現的元素,只保留了第一次出現的元素。執行程式碼發現會出錯,原因就是當erase函式執行一次之後後面的迭代器就會失效。
好在erase函式可以返回下一個可用的迭代器,因此只要保留這個返回值便可以解決這個問題,程式碼中註釋掉的兩行是正確的邏輯。
erase函式返回了下一個可用的迭代器,但是由於for 迴圈有個遞增的動作,因此獲得這個迭代器之後遞減一,此時迭代器可正常工作
對於關聯容器,erase 也會有同樣的作用,但是由於關聯容器基於紅黑樹實現,因此不會影響其他迭代器,只會使得當前迭代器失效,因此只要在執行erase操作前遞增迭代器,或者儲存下一個迭代器位置即可。
cont.erase(iter++);