该程序向用户询问一个数字,然后将所有数字存储到一个容器中。问题是我要删除特定的数字,但我不能,因为每当我尝试删除一个奇数时程序都会冻结(由下面的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;
}
答案 0 :(得分:2)
set::erase
的文档说“ Iterators,指针和引用引用函数删除的元素都是无效的。所有其他迭代器,指针和引用都保持其有效性。”
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;
}
时,你试图让它指向“下一个元素”,但没有下一个元素。
一种可能的解决方案:
{{1}}
答案 1 :(得分:1)
std::set
有一个erase
,它取一个键值而不是一个迭代器,因此整个删除过程可以简化为:s.erase(NUMBER);
。
您还可以使用std::copy
从设置中获取数据输出,最后得到:
s.erase(NUMBER);
std::copy(s.begin(), s.end(),
ostream_iterator<int>(cout, "\n"));
或者,您可以在将输出从集合复制到标准输出时过滤掉不需要的值,如:
std::remove_copy(s.begin(), s.end(),
ostream_iterator<int>(cout, "\n"), NUMBER);