2016-07-12 41 views
0

我正在使用set進行練習,並且收到一條錯誤消息,我不知道如何解釋。我對編程的技術方面不太瞭解。我是一名數學學生,所以我只專注於實際的編程本身,所以我不知道如何處理某些錯誤。使用std :: set的C++錯誤

我做了這個集合,並插入了從0到100的每個整數與端點。然後我想刪除除2之外的所有可以被2整除的整數。下面的代碼:

set<int> intSet; 
for (int i = 0; i < 101; i++) { 
    intSet.insert(i); 
} 

for (set<int>::iterator twoDivIt = intSet.begin(); twoDivIt != intSet.end(); twoDivIt++) { 
    if (*twoDivIt % 2 == 0) { 
     if (*twoDivIt == 2) { 
      continue; 
     } 
     else { 
      intSet.erase(twoDivIt); 
     } 
    } 
} 

for (set<int>::iterator it = intSet.begin(); it != intSet.end(); it++) { 
    std::cout << *it << "\t"; 
} 

我得到一個彈出窗口告訴我debuc斷言失敗,而「圖/設置迭代器不遞增的。」我做錯了什麼?

+0

刪除條目,而迭代是一個非常糟糕的主意。 – tkausl

+0

在這種情況下,更好地循環整數並刪除想刪除的整數? – Auclair

+0

爲什麼你甚至添加所有的整數?與其添加全部並刪除偶數,您只需添加奇數。 – tkausl

回答

0

循環應該像

for (std::set<int>::const_iterator twoDivIt = intSet.begin(); twoDivIt != intSet.end();) 
{ 
    if (*twoDivIt % 2 == 0 && *twoDivIt != 2) twoDivIt = intSet.erase(twoDivIt); 
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
    else ++twoDivIt; 
} 

如果編譯器不支持C++ 11則循環可以像

for (std::set<int>::const_iterator twoDivIt = intSet.begin(); twoDivIt != intSet.end();) 
{ 
    if (*twoDivIt % 2 == 0 && *twoDivIt != 2) intSet.erase(twoDivIt++); 
    else ++twoDivIt; 
} 
+0

擦除成員函數是否返回迭代器?我認爲它沒有 – Auclair

+0

@Auclair如果你使用的編譯器至少支持C++ 11,那麼擦除方法會返回迭代器。 –

+0

我使用的是Visual C++ 2015,所以它應該支持C++ 11。而你的第一個建議很好用,謝謝! – Auclair