list::erase()
的文档说“之前调用析构函数”,这是什么意思?如果我想再次erase(it)
一个项目,然后又push_back(*it)
该项目,那么它是否会被删除,因为它已经被破坏了?
答案 0 :(得分:5)
是的,这将导致未定义的行为。一旦erase
列表迭代器,使迭代器无效,这意味着它引用的对象不再保证有效。这意味着如果您尝试在任何上下文中使用迭代器,包括尝试取消引用该值以再次将其添加到列表中,则会导致未定义的行为,这可能导致程序崩溃,覆盖重要内存或什么都不做。
如果要将列表元素移到后面,请考虑使用列表的splice
方法:
myList.splice(myList.end(), myList, it);
这会将元素移到最后而不复制。
答案 1 :(得分:2)
从容器中删除容器中的元素时会被销毁。如果要在将对象从容器中删除后保留该对象,则需要复制该对象并使用该副本。
您建议的代码:
v.erase(it);
v.push_back(*it);
无效,因为删除后it
无效。在失效后,您无法使用迭代器。
答案 2 :(得分:0)
混合擦除和迭代器可能是一件非常棘手的事情。完成擦除后各种迭代器的有效性可能因容器而异。如果你想要erase
和push_back
,你应该做的事情是首先保存*it
中的内容副本,然后在执行push_back
时使用副本}。
答案 3 :(得分:0)
通过销毁该项目然后从列表中删除对它的引用来删除该项目。如果您想保留该项目,则需要在调用erase之前复制该项目。所有这些都表明,std :: list可能不是满足您需求的正确容器。