C++集中的错误

Bug in C++ Set?

本文关键字:错误 集中 C++      更新时间:2023-10-16

当我尝试这部分代码时:

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