在以下情况下,如何从列表中删除屏幕?
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 :(得分: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);
将起作用。
答案 1 :(得分:2)
使用list :: find查找实际要删除的屏幕的迭代器。然后使用remove,将迭代器传递给它。
答案 2 :(得分:2)
std :: list的erase方法需要一个你想要删除的迭代器。因此,一旦您获得了屏幕的迭代器,只需将其传递给屏幕即可。
换句话说,你想做screens.erase(std::find(screens.begin(), screens.end(), screen));
这只有在你的价值类上正确定义了运算符==时才有效。
请注意,如果您计划删除很多东西,可能需要使用std :: map而不是std :: list(因为在列表中查找屏幕将是O(n)。)