C++ 循环依赖与图
在图上应该避免循环依赖吗 例如,考虑一个C++ 循环依赖与图,c++,design-patterns,data-structures,C++,Design Patterns,Data Structures,在图上应该避免循环依赖吗 例如,考虑一个图形类,它嵌入一个顶点对象数组,每个对象都有一个边对象数组,这些对象指向一个顶点 这里,顶点和边是循环相关的。这是个坏主意吗?是否应该以及如何避免它?不,不应该。具有非平凡边和顶点类的图本质上是循环相关的。如果edge实际上为空,则可以只存储邻接矩阵(即,给定顶点之间是否存在边);如果vertex为空,则可以存储存储顶点编号(大小)的边列表,而不是指针。 最佳实践是使用智能ptr和弱ptr来打破链条。后者为非所有权,因此: 如果图形存储顶点: 图形类具
图形
类,它嵌入一个顶点
对象数组,每个对象都有一个边
对象数组,这些对象指向一个顶点
这里,
顶点
和边
是循环相关的。这是个坏主意吗?是否应该以及如何避免它?不,不应该。具有非平凡边和顶点类的图本质上是循环相关的。如果edge
实际上为空,则可以只存储邻接矩阵(即,给定顶点之间是否存在边);如果vertex
为空,则可以存储存储顶点编号(大小)的边列表,而不是指针。
最佳实践是使用智能ptr和弱ptr来打破链条。后者为非所有权,因此:
- 如果图形存储顶点:
类具有图形
向量
类具有顶点
向量
>m\u out代码>和可选的 向量
>m_in代码>
类具有边
弱ptr
m_顶点[2]代码>(或者更好的是从和到)
- 如果图形存储边:
类具有图形
向量
类具有edge
smart\u ptr
m\u from代码>和 弱ptr
m_-to代码>
类具有顶点
向量
>m\u out代码>和可选的 向量
>m_in代码>
如果由于某种原因(如高级:的widsom)、编码标准等)您不能使用smart_ptr和弱_ptr,您可能会使用引用而不是弱指针,这些通常被认为是非拥有的。代替smart_ptr,您可以使用指针,或者只要
edge
和vertex
不是基类,就可以使用成员。Stroustrup还建议使用owner
标记应该在退出时删除的裸指针。如果没有,可以使用owner=t为其定义一个no op作为模板
通常,边
将为每个顶点使用标识符
,而不使用指向每个顶点的指针。图形将包含边和顶点。@vu1p3n0x:除了避免循环依赖之外,使用标识符而不是指针有什么好处?这完全取决于图形的使用上下文。如果需要一个边
对象是独立的,并且不绑定到图形本身,则需要使用指向顶点的指针。但是,如果您的graph类将顶点存储在向量中并且支持添加顶点,则您不能使用指针,因为它们可以移动。@vu1p3nox:您仍然可以使用一个边数组,我不知道指针有什么问题。指针就像一个标识符。同样,它完全取决于graph
的使用方式。如果您可以保证顶点不会移动,那么我看不出使用指针有什么问题。事实上,使用指针可以使一些事情变得更容易。