Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于C++ STL列表类方法的EASE()_C++_List_Stl - Fatal编程技术网

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

关于C++ STL列表类方法的EASE(),c++,list,stl,C++,List,Stl,list::erase的文档中说,在调用析构函数之前,这意味着什么?如果我想将其删除为一个项目,然后再将其推回*该项目,这是否是非法的,因为它已经被销毁了?容器中的元素在从容器中移除时被销毁。如果要在将对象从容器中移除后保留该对象,则需要制作该对象的副本并使用该副本 你建议的守则: v.erase(it); v.push_back(*it); 无效,因为它在擦除后无效。迭代器失效后,您不能使用它。是的,这将导致未定义的行为。删除列表迭代器后,将使迭代器无效,这意味着它引用的对象不再保证有效。这

list::erase的文档中说,在调用析构函数之前,这意味着什么?如果我想将其删除为一个项目,然后再将其推回*该项目,这是否是非法的,因为它已经被销毁了?

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

你建议的守则:

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

无效,因为它在擦除后无效。迭代器失效后,您不能使用它。

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

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


这会将元素移动到末尾而不复制。

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

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

这难道不仅仅是一个元素吗?检查了文档。你是对的,那将做正确的事情;也是我错过的一种方法。另请参阅对一系列迭代器执行相同操作的版本。您确定std::list是适合您的用例的容器吗?链表提供理想性能特征的用例很少。@James McNellis-基于上述用例,OP似乎试图在列表中移动元素。这将是一个非常好的用例,因为所有其他序列都会这样做。@templatetypedef:也许吧。如果我不知道std::list是如何使用的,我仍然会非常犹豫是否推荐它。每个元素的大小、复制每个元素的成本、元素的数量以及拼接与迭代的相对频率都是重要的标准,这些我们都不知道。
myList.splice(myList.end(), myList, it);