2015-03-31 101 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/