C++设置容器不能删除奇数

标签 c++ set containers

<分区>

这个程序要求用户输入一个数字,然后将所有数字存储到并包括它到一个集合容器中。问题是我要删除特定数字,但我不能,因为每当我尝试删除奇数(由下面的 NUMBER 表示)时程序就会卡住。不过,当我删除偶数时它工作正常。但是,我注意到如果我将 y 的初始值更改为偶数,我将无法删除偶数。这里我把它设置为奇数。我做错了什么?

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

int main()
{
set<int>s;
set<int>::iterator cnt;
int n,x,y=1;
cout<<"Number: ";
cin>>n;
for(x=0;x<n-1;x++)
{
    s.insert(y);
    y++;
}
for(cnt=s.begin();cnt!=s.end();cnt++)
{
    if(*cnt==NUMBER)
    s.erase(cnt);
}
for(cnt=s.begin();cnt!=s.end();cnt++)
cout<<*cnt<<"\n";
return 0;
}

最佳答案

set::erase 的文档说“引用被函数删除的元素的迭代器、指针和引用无效。所有其他迭代器、指针和引用保持其有效性。”

for(cnt=s.begin();cnt!=s.end();cnt++)
{
    if(*cnt==NUMBER)
    s.erase(cnt);
}

一旦您执行了 s.erase(cnt)cnt 就不再引用集合中的元素。所以当你执行 cnt++ 时,你试图让它指向“下一个元素”,但是没有下一个元素。

一种可能的解决方案:

cnt = s.begin();
while (cnt != s.end())
{
    if (*cnt == NUMBER)
        s.erase(cnt++);
    else
        ++cnt;
}

关于C++设置容器不能删除奇数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18841370/

相关文章:

c++ - 自动删除新运算符(operator)

java - 如何测试 Java 迭代器是否始终使用相同的顺序(可重现的顺序)?

c++ - 我如何有效地遍历多种类型的树?

WPF:什么是通用容器控件?

c++ - 更改 C++ netbeans 项目中的主文件

c++ - 为什么会发生此编译器错误?

java - Set<String> 不会保持与添加元素的顺序相同的顺序

c++ - 将 const_iterator 分配给迭代器

在 Docker 容器上运行管道工 API

c++ - 排序谓词的链接(例如,对于 std::sort)