我有以下课程。它有一个静态成员_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())
这样简单的东西来避免创建迭代器。
答案 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
函数更方便。