【问题标题】:C++ error using std::set [duplicate]使用 std::set 的 C++ 错误 [重复]
【发布时间】:2016-11-14 23:37:56
【问题描述】:

我正在使用集合进行练习,但收到一条错误消息,我不知道如何解释。我对编程的技术方面不太了解。我是一名数学系的学生,所以我只专注于实际的编程本身,所以我不知道如何处理某些错误。

我做了集合,并用端点插入了从 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 断言失败,并且“映射/设置迭代器不可增加”。我做错了什么?

【问题讨论】:

  • 在迭代时删除条目是一个非常糟糕的主意。
  • 在这种情况下循环遍历整数并删除我想删除的那些更好吗?
  • 你为什么要把所有的整数都加起来?您可以只添加奇数,而不是添加所有并删除偶数。
  • @tkausl 是的,当然,如果这是针对实际程序,我会这样做。这是练习的明确愿望;)只是为了让我们学习如何使用集合。

标签: c++ set


【解决方案1】:

循环应该是这样的

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;
}

【讨论】:

  • 擦除成员函数是否返回迭代器?我以为没有
  • @Auclair 如果您使用的编译器至少支持 C++ 11,则擦除方法返回迭代器。
  • 我使用的是 Visual C++ 2015,所以它应该支持 C++11。您的第一个建议效果很好,谢谢!
  • @Auclair 是的 MS VC++ 2015 是支持 C++11 的现代编译器
猜你喜欢
  • 2014-07-03
  • 1970-01-01
  • 2014-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-20
  • 2015-05-21
相关资源
最近更新 更多