2016-05-15 37 views
0

我在網上搜索很長時間。但沒用。請幫助或嘗試提供一些想法如何解決這個問題。向量迭代器不可遞增,這與迭代器和擦除的操作有關

class Solution{ 
public: 
    int removeElement(vector<int> &nums, int val) 
    { 

     for (auto &it = nums.begin(); it != nums.end(); ++it) 
     { 
      if (*it == val) 
      { 
       it = nums.erase(it); 
      } 
     } 
     return nums.size(); 
    } 
}; 
int main(void) 
{ 
    Solution s; 
    vector<int> vi = { 3, 2, 2, 3 }; 
    cout << "size = " << s.removeElement(vi, 3) << endl; 
    for (auto &i : vi) 
    { 
     cout << i << " "; 
    } 
    cout << endl; 

    return 0; 
} 

哪些是我的代碼的類體和主函數體。 但是當我運行它,編譯器彈出一個窗口:

enter image description here

+1

這不是顯示錯誤的編譯器,這是你的程序*崩潰*。 –

+0

@JoachimPileborg感謝您指出我的錯誤 –

+0

順便說一句:http://stackoverflow.com/a/347478/440119 - 它不僅方便,而且比您的方法更具運行效率。 –

回答

2

刪除最後一個元素後,it成爲nums.end(),並增加這是不允許的。

擦除後不應該增加it。這也將解決擦除後一個元素被跳過的問題。

另外&auto &it = nums.begin()應該被刪除,因爲它會使它非法初始化非const引用。

試試這個:

#include <iostream> 
#include <vector> 

using std::vector; 
using std::cout; 
using std::endl; 

class Solution{ 
public: 
    int removeElement(vector<int> &nums, int val) 
    { 

     for (auto it = nums.begin(); it != nums.end();) 
     { 
      if (*it == val) 
      { 
       it = nums.erase(it); 
      } else 
      { 
       ++it; 
      } 
     } 
     return nums.size(); 
    } 
}; 
int main(void) 
{ 
    Solution s; 
    vector<int> vi = { 3, 2, 3, 3, 2, 3 }; // added testcase of consecutive 3 
    cout << "size = " << s.removeElement(vi, 3) << endl; 
    for (auto &i : vi) 
    { 
     cout << i << " "; 
    } 
    cout << endl; 

    return 0; 
} 
+0

感謝您的幫助,現在我明白了我的程序崩潰的原因。 –