2013-10-20 65 views
1

好吧,這可能是非常基本的,但我從來沒有這樣做過。安全刪除指針向量

我有一個向量Particle s,當他們離開可見屏幕時,我想要將它們抹去。我查了一下erase-remove成語,但我不知道如何做這個工作,因爲我還需要刪除Particle實例。我試圖向後迭代,都沒有成功:

for (std::vector<Particle*>::reverse_iterator rit = particles.rbegin(); rit != particles.rend(); ++rit) 
{ 
    if (IsOffScreen((*rit)->pos)) 
    { 
     delete (*rit.base()); 
     particles.erase(rit.base()); 
    } 
} 

在運行時崩潰,Visual Studio中說:"iterator cannot be decremented"。我究竟做錯了什麼?有沒有更好的辦法?

+1

當'rit'不是有效的迭代器時,你不能說'++ rit'。 –

+1

你會發現['std :: vector :: erase'](http://en.cppreference.com/w/cpp/container/vector/erase)的返回值對解決你的問題特別有幫助,因爲它應該成爲新的迭代器值,而不是在擦除事件中遞增/遞減退出的值。 – WhozCraig

+0

使用索引以相反的順序。 –

回答

1

什麼:

for (std::vector<Particle*>::iterator it = particles.begin(); it != particles.end(); ++it) { 
    if (IsOffScreen((*it)->pos)) { 
     delete *it; 
     *it = NULL; 
    } 
} 
particles.erase(std::remove(particles.begin(), particles.end(), NULL), particles.end()); 

有各種其他的選擇 - 你可以真正的刪除它們的謂語,例如,因爲IIRC它保證將在每個項目上正好運行一次。

你確實需要小心removeremove_if對於這種事情,因爲拆除的對象被留在不確定狀態,所以它不可能remove並刪除之後(您可以使用std::partition對於這一點,但它的比較慢)。

+0

這會產生錯誤C2446:'==':'std :: algorithm'中沒有從'const int'到'Particle *'的轉換。 – Innkeeper

+0

也許它希望'(粒子*)NULL'? – Peter

+0

可以使用std :: remove_if和修飾要移除的元素的謂詞;) –