关于C ++ STL列表类方法erase()

时间:2011-02-07 20:53:28

标签: c++ list stl

list::erase()的文档说“之前调用析构函数”,这是什么意思?如果我想再次erase(it)一个项目,然后又push_back(*it)该项目,那么它是否会被删除,因为它已经被破坏了?

4 个答案:

答案 0 :(得分:5)

是的,这将导致未定义的行为。一旦erase列表迭代器,使迭代器无效,这意味着它引用的对象不再保证有效。这意味着如果您尝试在任何上下文中使用迭代器,包括尝试取消引用该值以再次将其添加到列表中,则会导致未定义的行为,这可能导致程序崩溃,覆盖重要内存或什么都不做。

如果要将列表元素移到后面,请考虑使用列表的splice方法:

myList.splice(myList.end(), myList, it);

这会将元素移到最后而不复制。

答案 1 :(得分:2)

从容器中删除容器中的元素时会被销毁。如果要在将对象从容器中删除后保留该对象,则需要复制该对象并使用该副本。

您建议的代码:

v.erase(it);
v.push_back(*it);

无效,因为删除后it无效。在失效后,您无法使用迭代器。

答案 2 :(得分:0)

混合擦除和迭代器可能是一件非常棘手的事情。完成擦除后各种迭代器的有效性可能因容器而异。如果你想要erasepush_back,你应该做的事情是首先保存*it中的内容副本,然后在执行push_back时使用副本}。

答案 3 :(得分:0)

通过销毁该项目然后从列表中删除对它的引用来删除该项目。如果您想保留该项目,则需要在调用erase之前复制该项目。所有这些都表明,std :: list可能不是满足您需求的正确容器。