【问题标题】:Elements of container removing itselves?容器的元素会自行移除吗?
【发布时间】:2016-05-29 18:04:43
【问题描述】:

我有一堂课:

class C1 {
    std::vector<C2> vec;
};

我想实现 C1 和 C2 类,向量中的元素(C2 类)可能导致将自身从容器 vec 中移除。如何做到这一点最好?

也许我可以将对 C1 类的引用传递给 C2 类并调用 C1 中的方法来删除这个元素。这是很好的解决方案吗?如何在 C++11 中做到这一点?

(C1是程序中唯一的一个类)

【问题讨论】:

  • 您是否尝试为您建议的解决方案编写代码?
  • 为了将C2 与其存储方式分离,您可以为其提供一个知道如何执行操作的函数来调用。
  • 你必须维护所有权,否则你最终会陷入循环引用(资源/内存泄漏)
  • 与其让您的 C2 对象尝试删除自身(这可能会变得混乱),不如在您的 C2 对象中添加一个布尔“死”变量。当你的 C2 对象想要离开时,它会将“dead”变量设置为 true,并且在向量中查看的其他代码知道不对设置了“dead”标志的 C2 对象做任何事情(除了可能将它们从向量——在方便的时候可以做的事情)。

标签: c++ c++11 design-patterns


【解决方案1】:

我认为侵入式容器可以很好地解决您的问题,因此如果您不一定必须使用 std::vector,那么我建议您看看它们(侵入式容器接近指针容器,其中每个元素存储对下一个和前一个元素的引用,这使得元素很容易从容器中删除自己)。 boost 有很好的侵入式容器库,所以如果你使用它,你不必从头开始编写所有东西。看看这里,看看 std::vector(非侵入式容器)和侵入式容器有什么区别:http://www.boost.org/doc/libs/1_35_0/doc/html/intrusive/intrusive_vs_nontrusive.html

【讨论】:

    【解决方案2】:

    正如@JeremyFriesner 所建议的那样,一种解决方案是使用回调函数构造 C2 对象以进行删除 - 但您必须小心不要在其方法代码运行时破坏该对象(好吧,您可能可以将其关闭,但有点危险)。也许一些持有 shared_ptr 的技巧会有所帮助(或者可能没有)。

    此外,您可以让 C2 假设它们包含在向量或其他类似容器中,而不是回调函数,并让它们存储一个(普通?弱?)指向向量的指针。

    最后,我讨厌这样做,但是 - 你确定你需要让 C2 将自己从向量中移除吗?也就是说,您确定类的语义需要它,并且不能是 C1 删除它们的(更简单的)情况吗?您自己提供的答案也可能为您提供如何实施移除机制的方向。

    【讨论】:

      猜你喜欢
      • 2023-02-13
      • 2012-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-08
      相关资源
      最近更新 更多