2008-12-17 84 views
0

我正在嘗試做一個簡單的擦除,並不斷收到錯誤。幫助C++清單擦除功能

這裏是代碼爲我擦的片段:

std::list<Mine*>::iterator iterMines = mines.begin(); 
for(int i = oldSizeOfMines; i >0 ; i--, iterMines++) 
{ 
    if(player->distanceFrom(*iterMines) < radiusOfOnScreen) 
    { 
     onScreen.push_back(*iterMines); 
     iterMines = onScreen.erase(iterMines); 
     iterMines--; 
    } 
} 

我不斷收到一個編譯器消息:

1>c:\users\owner\desktop\bosconian\code\bosconian\environment.cpp(158) : error C2664: 'std::list<_Ty>::_Iterator<_Secure_validation> std::list<_Ty>::erase(std::list<_Ty>::_Iterator<_Secure_validation>)' : cannot convert parameter 1 from 'std::list<_Ty>::_Iterator<_Secure_validation>' to 'std::list<_Ty>::_Iterator<_Secure_validation>' 
1>  with 
1>  [ 
1>   _Ty=SpaceObject *, 
1>   _Secure_validation=true 
1>  ] 
1>  and 
1>  [ 
1>   _Ty=Mine *, 
1>   _Secure_validation=true 
1>  ] 
1>  and 
1>  [ 
1>   _Ty=SpaceObject *, 
1>   _Secure_validation=true 
1>  ] 
1>  No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called 

我很困惑,因爲我相信我給它正確的迭代器。

煤礦是SpaceObject的子類(第二代子類是)

這是否有什麼關係呢?我將如何解決它?

+0

只是爲了確保,是行158「iterMines = onScreen.erase(iterMines);」? – 2008-12-17 02:26:37

回答

4

問題是你正在嘗試使用地雷的迭代器作爲onScreen列表中的迭代器。這不起作用。

您是否打算調用mines.erase(iterMines)而不是onScreen.erase(iterMines)?

+0

我覺得啞巴。非常感謝。 – Chad 2008-12-17 02:38:17

2
std::list<Mine*>::iterator iterMines = mines.begin(); 
for(int i = oldSizeOfMines; i >0 ; i--, iterMines++) 
{ 
     if(player->distanceFrom(*iterMines) < radiusOfOnScreen) 
     { 
       onScreen.push_back(*iterMines); 
       iterMines = onScreen.erase(iterMines); 
       iterMines--; 
     } 
} 

一個真正的問題,和一個可能的解決方案:

erase會給你刪除的元素之後的下一個迭代。所以,如果你是在開始,並擦除,你會得到新的開始。如果你然後遞減迭代器,則在開始之前遞減。這是無效的。更好的因素了iterMines++進入循環體:

std::list<Mine*>::iterator iterMines = mines.begin(); 
for(int i = oldSizeOfMines; i >0 ; i--) 
{ 
     if(player->distanceFrom(*iterMines) < radiusOfOnScreen) 
     { 
       onScreen.push_back(*iterMines); 
       iterMines = mines.erase(iterMines); // change to mines!! 
     } else { 
      ++iterMines; // better to use ++it instead of it++ 
     } 
} 

更好地利用預增量,既然你永遠不知道一個迭代器做幕後是什麼時候創建的自身的副本。 ++it將返回新的迭代器,而it++將在增量之前返回迭代器的副本。我有評論部分,其中可能的解決方案是太:)

+0

刪除不是統一的集合是我對stl容器的主要抱怨之一。這就是爲什麼我更喜歡使用擦除(iter ++)慣用語 – grepsedawk 2008-12-17 02:45:39