我一直在向上和向下stackoverflow,甚至非常,非常好Dr. Dobbs article但我找不到问题的明确答案。如何使用std :: reverse_iterator擦除*和CONTINUE *?
对问题What are the shortcomings of std::reverse_iterator?的答案的一部分说,它可能根本不可能。 PS:我知道还有其他的选择,比如erase_if(),但是我正在寻找这个特定问题的答案。
我一直在向上和向下stackoverflow,甚至非常,非常好Dr. Dobbs article但我找不到问题的明确答案。如何使用std :: reverse_iterator擦除*和CONTINUE *?
对问题What are the shortcomings of std::reverse_iterator?的答案的一部分说,它可能根本不可能。 PS:我知道还有其他的选择,比如erase_if(),但是我正在寻找这个特定问题的答案。
这应该只是
std::list<int>::reverse_iterator it = list.rbegin();
while( it != list.rend())
{
int value=*it;
if(some_cond_met_on(value))
{
++it;
it= reverse_iterator(list.erase(it.base()); // change to this!
}
else
{
++it;
}
}
大多数erase()
实现我见过返回序列中的下一个迭代器正是这种情况,如:
std::list<int>::reverse_iterator it = list.rbegin();
while(it != list.rend())
{
int value = *it;
if(some_cond_met_on(value))
{
it = list.erase(it);
}
else
{
++it;
}
}
这是正确的。但是,擦除是结构的成员,而不是迭代器。因此,无论您是使用迭代器还是reverse_iterator,erase()都会接受并返回一个迭代器。没有r_erase(),它接受并返回一个reverse_iterator。 – 2015-01-30 04:03:37
我会试试看。你怎么弄出来的? (只是要求学习如何学习) – Migs 2011-12-23 23:19:33
@Migs,反向迭代器的不变量是:&&(reverse_iterator(i))==&*(i - 1)'。从那里向后映射(或者考虑删除'rbegin()'),然后在答案中找到代码。 – MSN 2011-12-23 23:22:48
谢谢@MSN。它工作完美。我在多布斯的文章中读到了这个不变性,但我想我无法理解它的含义。我会一直盯着,直到有希望发生。 – Migs 2011-12-23 23:25:35