【问题标题】:Deleting elements from containers while iterating through them在迭代容器时从容器中删除元素
【发布时间】:2012-03-28 19:37:41
【问题描述】:

好的,我已经多次遇到这个问题,并认为将它扔给 SO 上的好人会很好。

假设我创建了一个类,我们称之为资源。 所以 Resource 类有一个布尔变量,它指示天气任何实例是否处于活动状态。

现在,我创建一个容器,其中包含对 Resource 类型对象的引用。

随着时间的推移,它们中的一些会被停用,我想删除这些停用的对象,以便它们释放内存。 我总是尝试通过以下方式做到这一点:尝试遍历容器中的元素并删除标记为非活动的元素。这显然会导致迭代器失效问题,并且程序开始抛出运行时错误。

最后,我的问题是,根据某些只能通过查看对象内容来评估的条件,安全删除对象的最佳方法是什么。

【问题讨论】:

标签: c++


【解决方案1】:

erase-remove idiomstd::remove_if 一起使用。例如:

std::vector<int> myvec;
...
myvec.erase(std::remove_if(myvec.begin(),myvec.end(), [] (int i) -> bool { return false; }), myvec.end());

【讨论】:

  • 像地图这样的关联容器呢?我收集的 std::remove_if 对他们不起作用。
  • @angryInsomniac:不,它不起作用,因为它会破坏排序。 This question 提供了该问题的答案。
【解决方案2】:

最安全的方法是使用std::remove_if。这会将与给定谓词匹配的所有项目移动到序列的末尾。然后您可以删除它们。

【讨论】:

  • 像地图这样的关联容器呢?
  • 使用地图,您可以删除迭代器指向的元素,而不会使任何其他迭代器失效。这意味着你可以做your_map.erase(it++);。请参阅this question 了解更多信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
  • 2021-03-28
  • 2016-07-19
  • 2014-12-16
  • 2016-06-15
  • 2020-03-18
相关资源
最近更新 更多