从std :: list中删除对象

时间:2012-03-29 20:39:27

标签: c++ list

在以下情况下,如何从列表中删除屏幕?

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
    }
}

3 个答案:

答案 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)。)