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