2012-03-29 119 views
1

在下列情況下,我怎麼能刪除列表中的畫面?刪除對象::列表

class ScreenManager { 

    list<GameScreen> screens; 

    void removeScreen(GameScreen & screen) { 
     //screens.remove(screen); // won't work 
     //screens.erase(remove(screens.begin(), screens.end(), screen), screens.end()); // won't work either 
    } 
} 
+0

爲什麼不工作? – vmpstr 2012-03-29 20:43:06

+5

'刪除'作品。如果沒有,那麼你沒有告訴我們足夠的。 – 2012-03-29 20:43:13

+0

給我們更多的細節,你能提供更多的代碼嗎? – ManiP 2012-03-29 20:43:46

回答

2

使用list :: find來定位一個迭代器到你實際想要移除的屏幕。然後使用remove,將迭代器傳遞給它。

+2

'remove'不需要迭代器,你的意思是'erase'。但是'find'然後''erase'正是'remove'所做的,所以我不知道是誰投了票。 – 2012-03-29 20:51:28

2

的std ::名單的刪除方法需要您要刪除的迭代器。所以一旦你獲得了一個迭代器到你的屏幕,只需將它傳遞給屏幕即可。

換句話說,你想要做screens.erase(std::find(screens.begin(), screens.end(), screen));此,如果你有==操作符正確地在你的價值類中定義纔有效。

請注意,如果您打算刪除很多東西,您可能需要使用類似std :: map而不是std :: list(因爲在列表中查找您的屏幕將是O(n)。)

+3

事實上,每當我的代碼片段工作,刪除應該工作太...所以你的問題可能是,你需要重寫運算符==。 – 2012-03-29 20:44:31

+0

你能解釋一下我需要怎麼處理操作員,爲什麼? – Ben 2012-03-29 20:51:52

+0

Johannes S的答案就在這裏。從本質上講,刪除需要知道列表中的哪個對象是你正在尋找的對象,並且除非你告訴它如何(通過重寫operator ==),否則C++並沒有給它一種方法來做到這一點。另一種選擇是讓列表,「新」所有對象,並只複製指針。然後刪除/查找將只使用指針相等。但也有很多問題:-) – 2012-03-29 22:47:25

11

std::remove(或您的案例中的std::list::remove)使用比較運算符(operator==)查找/識別應從容器中移除的對象。

由於您使用的是用戶自定義類型GameScreen,因此您需要爲您的課程提供operator==。所以,在你的班級你需要實施:

bool operator==(const GameScreen& other) const { 
    // do whatever you need to determine whether 
    // `GameScreen` instance `other` is equal (in value) 
    // to `this` instance of `GameScreen` 
} 

然後,screens.remove(screen);將工作。

+0

@Ben這是否解決了你的問題? – 2012-11-13 18:11:26