使用 reverse_iterator 擦除最后一个元素
Posted
技术标签:
【中文标题】使用 reverse_iterator 擦除最后一个元素【英文标题】:Erasing the last element with the reverse_iterator 【发布时间】:2015-07-20 13:01:41 【问题描述】:最近我在维护的代码中发现了以下内容:
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)中删除最后一个元素。关键是它看起来应该可以正常工作,但事实并非如此(由于无效的迭代器导致一些内存损坏),我想知道为什么?是否有任何限制或规则不这样做?
谢谢。
附:为了防止对解决方案进行任何改进,我已经重写了它以使其工作。问题是为什么上面的代码不能正常工作?
【问题讨论】:
不是你的问题的答案,但为什么这么复杂?你不能先反向复制整个容器然后清除原始容器吗?另外,什么是base_container? std::list 正如我上面写的 您是否按照base_container::
的建议从容器继承? :-(
base_container 只是 std:list 的 typedef调用erase
后的所有迭代器都失效。但是,erase
返回一个您可以使用的迭代器。
【讨论】:
不是所有的迭代器。但肯定是指向被擦除元素的迭代器。【参考方案2】:rit
被erase
调用无效。
【讨论】:
【参考方案3】:您需要保存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.
【讨论】:
以上是关于使用 reverse_iterator 擦除最后一个元素的主要内容,如果未能解决你的问题,请参考以下文章
条目二十八《正确理解由reverse_iterator的base()成员函数所产生的iterator的用法》
在遍历中使用 iterator/reverse_iterator 进行 Erase 的用法