2015-07-20 56 views
0

最近我發現了以下代碼,我保持:刪除最後一個元素與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()); 
} 

它試圖從容器中取出的最後一個元素(STD ::在這種情況下列表)中使用reverse_iterator的循環。重點是它看起來應該可以正常工作,但它不會(由於迭代器無效而發生一些內存損壞),我想知道爲什麼?是否有任何限制或規定不這樣做?

謝謝。

P.S.爲了防止對解決方案進行任何改進,我已經重寫了它以使其可行。問題是爲什麼上面的代碼工作不正常?

+0

不是你的問題的答案,但爲什麼這麼複雜?難道你不能先將整個容器複製並清除原來的容器嗎?另外,什麼是base_container? – MikeMB

+0

std :: list正如我上面寫的 – Rom098

+0

你是否從容器繼承了'base_container ::'建議? :-( – Jarod42

回答

1

調用erase後的所有迭代器均失效。但是,erase返回您可以使用的迭代器。

+0

不是所有的迭代器,但肯定是指向被擦除元素的迭代器。 – rici

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. 
} 
相關問題