2016-07-12 42 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