循环依赖和图表

时间:2016-06-13 21:55:31

标签: c++ design-patterns data-structures

图表上是否应避免循环依赖?

例如,考虑一个嵌入了graph个对象数组的vertex类,每个对象都有一个edge个对象数组,指向vertex

此处,vertexedge是循环相关的。这是一个坏主意吗 ?它应该如何以及如何避免?

1 个答案:

答案 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;您可以使用指针 - 或者为什么不使用成员只要edgevertex不是基类。 Stroustrup还建议使用owner<>标记应在退出时删除的裸指针。如果您没有,可以将其作为template<typename T> using owner = T;定义为无操作。