删除对象::列表

问题描述:

在下列情况下,我怎么能删除列表中的画面?删除对象::列表

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

使用list :: find来定位一个迭代器到你实际想要移除的屏幕。然后使用remove,将迭代器传递给它。

+2

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

的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

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