我一直在向上和向下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