0

最近我在维护的代码中发现了以下内容:

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)。关键是它看起来应该可以正常工作,但事实并非如此(由于无效的迭代器导致一些内存损坏),我想知道为什么?是否有任何限制或规则不这样做?

谢谢。

PS 为了防止对解决方案进行任何改进,我已经重写了它以使其工作。问题是为什么上面的代码不能正常工作?

4

3 回答 3

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.
}
于 2015-07-20T13:33:24.900 回答
1

调用后的所有迭代器erase都失效。但是,erase返回一个您可以使用的迭代器。

于 2015-07-20T13:03:54.580 回答
1

rit被调用无效erase

于 2015-07-20T13:04:25.123 回答