容器移除的元素?

时间:2016-02-17 20:13:05

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

我有一个班级:

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

我想实现C1和C2类,向量(C2类)中的元素可以导致自己从容器vec中删除。怎么做到最好?

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

(C1是该计划中唯一的一个类)

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

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

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