删除 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 的迭代器,并从列表中删除它但不释放它:列表其余部分的结构与正常删除它的方式完全相同。

最好是比重新分配项目、从列表中复制它并调用真正的removeerase 更丑的东西。

也许我可以用splice 完成它。我需要将要删除的元素拼接成“垃圾”list,不是吗?

【问题讨论】:

splice-ing 进入一个垃圾清单听起来很对... 这种方法不太可能使用不兼容的分配器会强制复制。仍然......还有一些额外的指针被洗牌。嗯......没有伤害有一种方法来迭代我的非完全孤立节点。 为什么用 list 代替 list 不适合你? 【参考方案1】:

你可以用拼接来做到这一点。例如,将*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 中的项目,同时保持分配状态的主要内容,如果未能解决你的问题,请参考以下文章

C ++中的高效链表?

是否应弃用 std::list ?

Delete 无法识别 List 中的指针分配

循环在 std::list 上为迭代的 std::erase 挂起

为啥从 std::vector 中随机删除比 std::list 快?

遍历std::list过程中删除元素后继续遍历过程