Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 循环依赖与图_C++_Design Patterns_Data Structures - Fatal编程技术网

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
    • 类具有
      弱ptrm_顶点[2](或者更好的是从和到)
  • 如果图形存储边:
    • 图形
      类具有
      向量
    • edge
      类具有
      smart\u ptrm\u from
      弱ptrm_-to
    • 顶点
      类具有
      向量>m\u out和可选的
      向量>m_in

如果由于某种原因(如高级:的widsom)、编码标准等)您不能使用smart_ptr和弱_ptr,您可能会使用引用而不是弱指针,这些通常被认为是非拥有的。代替smart_ptr,您可以使用指针,或者只要
edge
vertex
不是基类,就可以使用成员。Stroustrup还建议使用
owner
标记应该在退出时删除的裸指针。如果没有,可以使用owner=t为其定义一个no op作为
模板

通常,
将为每个
顶点使用标识符
,而不使用指向每个
顶点的指针。
图形将包含边和顶点。@vu1p3n0x:除了避免循环依赖之外,使用标识符而不是指针有什么好处?这完全取决于图形的使用上下文。如果需要一个
对象是独立的,并且不绑定到图形本身,则需要使用指向顶点的指针。但是,如果您的graph类将顶点存储在
向量中并且支持添加顶点,则您不能使用指针,因为它们可以移动。@vu1p3nox:您仍然可以使用一个边数组,我不知道指针有什么问题。指针就像一个标识符。同样,它完全取决于
graph
的使用方式。如果您可以保证顶点不会移动,那么我看不出使用指针有什么问题。事实上,使用指针可以使一些事情变得更容易。