删除 std::list 中的项目,同时保持分配状态
Posted
技术标签:
【中文标题】删除 std::list 中的项目,同时保持分配状态【英文标题】:Remove item in std::list while leaving it allocated 【发布时间】:2012-12-07 15:15:18 【问题描述】:我构建了一个std::list
的项目(图形组件结构),它们定期合并在一起。这个想法是,如果我发现一个连接两个组件的节点,它们就会成为一个单独的组件,并且我的列表会枚举我的组件。每个组件都有一个指向其“父”组件的句柄(在本例中为 std::list<component>::iterator
),该句柄在合并后设置。通过这种方式确定特定节点所属的组件,我沿着这条链走。
最后,我正在寻找的是对 std::list
的操作,它允许我获取项目 N
的迭代器,并从列表中删除它但不释放它:列表其余部分的结构与正常删除它的方式完全相同。
最好是比重新分配项目、从列表中复制它并调用真正的remove
或erase
更丑的东西。
也许我可以用splice
完成它。我需要将要删除的元素拼接成“垃圾”list
,不是吗?
【问题讨论】:
splice
-ing 进入一个垃圾清单听起来很对...
这种方法不太可能使用不兼容的分配器会强制复制。仍然......还有一些额外的指针被洗牌。嗯......没有伤害有一种方法来迭代我的非完全孤立节点。
为什么用 list你可以用拼接来做到这一点。例如,将*it
移至垃圾列表:
junk.splice(junk.begin(),comp_list,it);
您还可以将 move-ctor 添加到 component
。然后,在从列表中删除内容到 tmp var 之前,如下所示:
component tmp(*it);
li.erase(it);
Fomin Arseniy 也建议使用指向组件的指针列表(或std::shared_ptr
)也很好。
【讨论】:
简单的list<T*>
可能会导致不必要的手动簿记,但list<shared_ptr<T> >
可能也是一种可靠的方法。我想让事情保持简单:使用垃圾列表方法,我可以避免编写 new
关键字。以上是关于删除 std::list 中的项目,同时保持分配状态的主要内容,如果未能解决你的问题,请参考以下文章
循环在 std::list 上为迭代的 std::erase 挂起