最近我在代码中找到了以下内容:
for (reverse_iterator rit = base_container::rbegin(); rit != base_container::rend() && 0 < N; N--)
{
another_container->push_back(*rit);
base_container::erase((++rit).base());
}
它尝试使用reverse_iterator从循环中删除容器中的最后一个元素(在本例中为std :: list)。关键是它看起来应该正常工作,但它没有(由于无效的迭代器会发生一些内存损坏),我想知道为什么?是否有任何限制或规则不这样做?
感谢。
P.S。为了防止对解决方案进行任何改进,我已经重新编写了它以使其正常工作。问题是为什么上面的代码不能正常工作?
答案 0 :(得分:1)
调用erase
后的所有迭代器都无效。但是,erase
返回一个可以使用的迭代器。
答案 1 :(得分:1)
rit
来电 erase
无效。
答案 2 :(得分:1)
您需要保存erase()
的返回值并将其转换回reverse_iterator
以避免迭代器失效。
for (reverse_iterator rit = base_container::rbegin(); rit != base_container::rend() && 0 < N; N--)
{
another_container->push_back(*rit);
auto it =base_container::erase((++rit).base()); //erase will return an iteraotor
rit(it);//converting iterator to reverse_iterator.
}