删除对象::列表
在下列情况下,我怎么能删除列表中的画面?删除对象::列表
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
}
}
使用list :: find来定位一个迭代器到你实际想要移除的屏幕。然后使用remove,将迭代器传递给它。
'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)。)
事实上,每当我的代码片段工作,删除应该工作太...所以你的问题可能是,你需要重写运算符==。 – 2012-03-29 20:44:31
你能解释一下我需要怎么处理操作员,为什么? – Ben 2012-03-29 20:51:52
Johannes S的答案就在这里。从本质上讲,删除需要知道列表中的哪个对象是你正在寻找的对象,并且除非你告诉它如何(通过重写operator ==),否则C++并没有给它一种方法来做到这一点。另一种选择是让列表
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);
将工作。
@Ben这是否解决了你的问题? – 2012-11-13 18:11:26
为什么不工作? – vmpstr 2012-03-29 20:43:06
'删除'作品。如果没有,那么你没有告诉我们足够的。 – 2012-03-29 20:43:13
给我们更多的细节,你能提供更多的代码吗? – ManiP 2012-03-29 20:43:46