2015-03-31 103 views
-1

我試圖通過迭代每個元素從STL集合數據結構中移除元素。問題是我不能通過迭代集合結構來刪除每個元素。當我嘗試這種方式,它只是給錯誤消息或程序卡住了。當它發生時,我認爲它是Mingw的bug,所以我嘗試了Cygwin g ++;但是Cygwin g ++也不起作用。 我應該如何更改代碼使用迭代Mingw,Cygwin g ++,STL集

  • MinGW和Cygwin的都安裝在Windows 7 x64系統來刪除集結構的每個元素。

//Tested by using MinGW, Cygwin g++ in Win64 environment 
 

 
#include <iostream> 
 
#include <string> 
 
#include <set> 
 
using namespace std; 
 

 
int main() 
 
{ 
 

 
\t set<int> mySet; 
 
\t mySet.insert(1); 
 
\t mySet.insert(2); 
 
\t mySet.insert(7); 
 

 

 
/* 
 
    //Works fine 
 
    mySet.erase(1); 
 
    mySet.erase(2); 
 
    mySet.erase(7); 
 
*/ 
 

 

 

 
/* 
 
    //Error 
 
\t for(set<int>::iterator iter = mySet.begin(); iter != mySet.end(); iter++) 
 
\t \t mySet.erase(iter); 
 

 
\t //Error 
 
    int size = mySet.size(); 
 
    set<int>::iterator iter = mySet.begin(); 
 
    for(int i = 0; i < size(); i++) 
 
    { 
 
     mySet.erase(iter); 
 
     iter++ 
 
    } 
 

 
*/ 
 

 
    //print out elements in mySet 
 
\t for(set<int>::iterator iter = mySet.begin(); iter != mySet.end(); iter++) 
 
\t \t cout << *iter << " "; 
 

 
\t return 0; 
 
}

+1

'mySet.erase(iter)'使迭代器失效。接下來,你嘗試增加這個現在無效的迭代器,於是你的程序展現出未定義的行爲。提示:'erase()'返回一個有效的迭代器到下一個元素。無論如何,如果你的目標確實是刪除所有元素,只要執行'mySet.clear()' – 2015-03-31 01:50:50

回答

0

像伊戈爾Tandetnik賽義德mySet.clear()會工作。 但通常在C++ 11,mySet.erase(iter)應返回以下元件:

返回一個迭代隨後移除的最後一個元素(或設置::結束時,如果除去最後一個元素)的元素。

在C++ 98中它返回nos值,這就是爲什麼它不起作用。當您編譯測試時,嘗試通過-std=c++11

來源:http://www.cplusplus.com/reference/set/set/erase/