C++11 std::set::erase正在推进反向迭代器

C++11 std::set::erase正在推进反向迭代器,c++11,stdset,C++11,Stdset,我正在尝试删除我刚刚遍历到的元素。最初我忘了在for循环中存储返回值s1.erase(…以最终设置退出循环的条件。按照代码现在的方式,我希望循环无限期地继续。但它的工作方式与最初预期的工作方式相同。 看起来std::erase推进了迭代器,并将值存储在rit中。我找不到任何解释此行为的文档 表示必须存储返回的迭代器。set::erase的所有参数都是按值传递的,那么反向迭代器是如何提升的呢 这个循环是如何完成的 std::set<int> s1; s1.insert(20); s1.

我正在尝试删除我刚刚遍历到的元素。最初我忘了在for循环中存储返回值s1.erase(…以最终设置退出循环的条件。按照代码现在的方式,我希望循环无限期地继续。但它的工作方式与最初预期的工作方式相同。 看起来std::erase推进了迭代器,并将值存储在rit中。我找不到任何解释此行为的文档

表示必须存储返回的迭代器。set::erase的所有参数都是按值传递的,那么反向迭代器是如何提升的呢

这个循环是如何完成的

std::set<int> s1;
s1.insert(20);
s1.insert(30);
s1.insert(50);

auto rit = s1.rbegin();

for (; rit!= s1.rend();)
{
    std::cout << "rit is " << *rit << " size is " << s1.size() << std::endl;
    s1.erase(std::next(rit).base());
    std::cout << "rit after erase is " << *rit << std::endl;
}
std::set s1;
s1.插入(20);
s1.插入(30);
s1.插入(50);
自动rit=s1.rbegin();
对于(;rit!=s1.rend();)
{

std::cout回想一下,
reverse\u iterator::base()
始终是明显迭代器值后面的一个元素。例如,在
auto rit=s1.rbegin()
之后,
*rit
返回最后一个元素,而
rit.base()==s1.end()

换句话说,
*rit==*prev(rit.base())

在循环中,最初
rit.base()==s1.end()
。然后
std::next(rit)。base()
指最后一个元素;该元素正在被擦除。在
std::set
中,擦除一个元素只会使该元素的迭代器失效,而不会使任何其他元素失效。
s1.end()
仍然是有效的迭代器,
rit
也是有效的迭代器,
rit.base()
仍然等于
s1.end()
。因此,在循环的下一次迭代中,再次擦除最后一个元素,并再次保留
rit.base()==s1.end()
。依此类推

在某些情况下,最后一个元素被擦除,
s1
变为空,然后
*rit
显示未定义的行为。回想一下
*rit==*prev(rit.base())
,但不再有以前的元素