图表上是否应避免循环依赖?
例如,考虑一个嵌入了graph
个对象数组的vertex
类,每个对象都有一个edge
个对象数组,指向vertex
。
此处,vertex
和edge
是循环相关的。这是一个坏主意吗 ?它应该如何以及如何避免?
答案 0 :(得分:2)
不,它不应该。具有非平凡边和顶点类的图是固有循环相关的。如果edge
实际上是空的,你可能只存储邻接矩阵(即,是否存在给定顶点之间的边缘);如果vertex
为空,则可以存储和存储顶点数(size_t)而不是指针的边列表。
最佳做法是使用smart_ptr<>和weak_ptr<>打破链条。后者是非拥有的,因此:
graph
班级有vector< smart_ptr< vertex > >
vertex
班级有vector< smart_ptr< edge > > m_out;
,可选vector< weak_ptr< edge > > m_in;
edge
班级有weak_ptr< vertex > m_vertices[2];
(或者更好的是m_from和m_to)graph
班级有vector< smart_ptr< edge > >
edge
班级有smart_ptr< vertex > m_from;
和weak_ptr< vertex > m_to;
vertex
班级有vector< weak_ptr< edge > > m_out;
,可选vector< weak_ptr< edge > > m_in;
如果由于某种原因(如高级widsom :),编码标准等,你不能使用smart_ptr&lt;&gt;和weak_ptr&lt;&gt;,您可以使用引用而不是弱指针,这些通常被认为是非拥有的。而不是smart_ptr&lt;&gt;您可以使用指针 - 或者为什么不使用成员只要edge
和vertex
不是基类。 Stroustrup还建议使用owner<>
标记应在退出时删除的裸指针。如果您没有,可以将其作为template<typename T> using owner = T;
定义为无操作。