1. 程式人生 > >c++ erase 會使迭代器失效

c++ erase 會使迭代器失效

因為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++);