擦除类列表的静态成员的元素

时间:2016-05-12 10:00:57

标签: c++

我有以下课程。它有一个静态成员_list,由类的所有实例共享,将在Class_f()中创建。我想使用擦除功能来擦除_list的最后一个元素。

class myClass 
{
    private:
        static list<int> _list;
    public:
        //constructors,destructors
        void Class_f();
}

list<int> myCLass::_list;

void myClass::Class_f() 
{
    //..some code
    list<int>::iterator it1;
    it1=_list.end (); //erase for instance the last element _list
    it1=_list.erase(it1);
    //more code
}

但是在编译它时会输出一个错误消息“list iterator not incrementable”。为什么它给我这个错误?另外,为什么我不能使用像_list.erase(_list.end())这样简单的东西来避免创建迭代器。

3 个答案:

答案 0 :(得分:5)

_list.end()不是最后一个元素的迭代器。它是一个过去的结束迭代器。你无法真正做任何事情。 C++'s iterator ranges are half-open

但是,如果您真的遇到了编译器错误,那么您没有向我们展示错误。

您更有可能从运行时看到调试器消息,其中调试模式下的标准库实现非常友好地发现您尝试增加_list.end()(这将具有未定义的行为),这在编写期间发生_list.erase(it1)的返回值,并告诉你不要这样做。 :)

答案 1 :(得分:4)

首先,list.end()为您提供了一个“迭代器引用过去的结束元素”。所以调用erase(list.end())将不起作用。

其次,使用list.pop_back()删除最后一个元素。 List.pop_back()

答案 2 :(得分:3)

使用_list.pop_back(),您可以删除最后一个元素,这可能比使用erase函数更方便。

http://www.cplusplus.com/reference/list/list/pop_back/