C++集中的错误
Bug in C++ Set?
当我尝试这部分代码时:
int x=*(s.rbegin());
while(!s.empty()&&0<x)
{
s.erase(x);
x=*(s.rbegin());
}
它运行到一个无限循环中,因为当我调用擦除时,它实际上不会擦除任何内容。这看起来很奇怪,因为 *(s.rbegin()) 绝对应该在 s 中。
更改操作顺序,删除要获取的元素.. 例如:
std::set<int> s;
int x;
s.insert(5);
s.insert(15);
s.insert(25);
s.insert(0);
s.insert(20);
while(!s.empty()&& (0<(x=*s.rbegin())))
{
std::cout<< x << "n";
s.erase(x);
}
请注意,以您定义的方式。上面代码的输出将是
25
20
15
5
请注意,按照您定义的方式 while() 循环,如果它找到 0 元素,您打算停止。退出后还剩下0,设置不会为空。传统使用的迭代看起来像
for (auto it=s.rbegin(); it!=s.rend(); ++it)
{
}
试试这个:
if (!s.empty())
{
int x = *(s.rbegin());
while (0 < x)
{
s.erase(x);
if (s.empty()) break;
x = *(s.rbegin());
}
}
或者,尝试使用迭代器而不是值擦除:
std::set<int>::reverse_iterator iter = s.rbegin();
while ((iter != s.rend()) && ((0 < *iter))
s.erase((iter++).base());
似乎您正在尝试擦除集合中所有正数的元素。这可以通过以下一行更简单地完成:
s.erase(s.upper_bound(0),s.end());
upper_bound
为您提供第一个大于 0 的数字的迭代器。由于从这个到最后的所有元素都保证大于零,因此您可以将它们全部擦除。
你应该在x=*(s.rbegin());
之前检查集合的结尾
int x=*(s.rbegin());
while(!s.empty() && 0<x)
{
s.erase(x);
if(!s.empty())
x=*(s.rbegin());
}
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- MSVC多行宏编译器错误
- C++集中的错误
- 为什么nasm说我在g++创建的程序集中有错误
- 为什么此内联程序集中的错误操作无法正常工作