C++设置容器无法擦除奇数
C++ set container can't erase odd numbers
该程序要求用户输入一个数字,然后将所有数字存储到一个设置的容器中。问题是我要擦除特定的数字,但我不能,因为每当我尝试擦除奇数(由下面的数字表示)时,程序都会冻结。不过,当我擦除偶数时,它可以正常工作。但是,我注意到,如果我将 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;
}
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);
相关文章:
- 引用一个已擦除类型(void*)的指针
- 擦除while循环中迭代的元素
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- C++擦除(如果存在)
- 在映射擦除c++期间执行循环的次数
- 为什么擦除方法会影响结束方法
- C++ 字符串类擦除成员函数的时空复杂性
- 类型擦除的std::function与虚拟函数调用的开销
- C++14 中unordered_map矢量和擦除删除成语的奇怪行为
- C++ 擦除函数中需要澄清
- 循环挂起迭代的 std::擦除 on std::list
- 擦除许多矢量元素,同时使用'auto'
- 如何擦除冗余输入?
- C++ STL 设置按值擦除
- 如何在C++中允许成员函数的自定义返回类型进行类型擦除?
- 迭代时擦除设置元素///
- std::设置擦除复杂性异常
- C++:查找并擦除设置元素
- C++设置容器无法擦除奇数
- 矢量擦除无需设置返回值即可工作