使用reverse_iterator擦除最后一个元素

时间:2015-07-20 13:01:42

标签: c++ std reverse-iterator

最近我在代码中找到了以下内容:

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。为了防止对解决方案进行任何改进,我已经重新编写了它以使其正常工作。问题是为什么上面的代码不能正常工作?

3 个答案:

答案 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.
}