使用 reverse_iterator 擦除最后一个元素
Erasing the last element with the 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。为了防止对解决方案进行任何改进,我已经重写了它以使其工作。问题是为什么上面的代码不能正常运行?
调用erase
后的所有迭代器都失效。但是,erase
returns 一个您可以使用的迭代器。
rit
被 erase
调用无效。
您需要保存 erase()
的 return 值并将其转换回 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.
}
最近我在维护的代码中发现了以下内容:
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。为了防止对解决方案进行任何改进,我已经重写了它以使其工作。问题是为什么上面的代码不能正常运行?
调用erase
后的所有迭代器都失效。但是,erase
returns 一个您可以使用的迭代器。
rit
被 erase
调用无效。
您需要保存 erase()
的 return 值并将其转换回 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.
}