C++ 删除std::list中的项,同时将其保留为已分配

C++ 删除std::list中的项,同时将其保留为已分配,c++,stl,linked-list,doubly-linked-list,C++,Stl,Linked List,Doubly Linked List,我构建了一个定期合并在一起的项目(图形组件结构)列表。其思想是,如果我发现一个节点连接两个组件,它们将成为一个组件,我的列表将枚举我的组件。每个组件对其“父”组件都有一个句柄(在本例中为std::list::iterator),该句柄在合并后设置。通过这种方法来确定特定节点所属的组件,我沿着这个链走 最后,我要寻找的是std::list上的操作,它允许我获取itemN的迭代器,并将其从列表中删除,但不取消分配:列表其余部分的结构以与正常删除它完全相同的方式进行修改 最好是比重新分配项目、从列表中

我构建了一个定期合并在一起的项目(图形组件结构)列表。其思想是,如果我发现一个节点连接两个组件,它们将成为一个组件,我的列表将枚举我的组件。每个组件对其“父”组件都有一个句柄(在本例中为
std::list::iterator
),该句柄在合并后设置。通过这种方法来确定特定节点所属的组件,我沿着这个链走

最后,我要寻找的是
std::list
上的操作,它允许我获取item
N
的迭代器,并将其从列表中删除,但不取消分配:列表其余部分的结构以与正常删除它完全相同的方式进行修改

最好是比重新分配项目、从列表中复制项目并调用真正的
remove
erase
更简单的方法


也许我可以通过
拼接
来完成它。我需要将要删除的元素拼接到一个“垃圾”列表中,不是吗?

您可以使用拼接来完成此操作。例如,将
*it
移动到垃圾邮件列表:

junk.splice(junk.begin(),comp_list,it);
您还可以将移动向量添加到
组件
。然后,在从列表中删除之前,将内容移动到tmp var,如下所示:

component  tmp(*it);
li.erase(it);

另外,建议Fomin Arseniy使用组件指针列表(或
std::shared_ptr
)也很好

拼接
-将其插入垃圾列表听起来是正确的……这种方法不太可能使用不兼容的分配器强制复制。还是。。。有几个额外的指针被洗牌了。好。。。有一种方法可以迭代我的非完全孤立节点没有坏处。为什么使用列表而不是列表不适合您?简单的
列表
可能会导致更多的手动簿记,但
列表
可能也是一种可靠的方法。我想让事情保持简单:使用垃圾列表方法,我可以避免编写
new
关键字。