我之前发布过这个问题,但措辞严厉,这就是为什么它会有不好的反应。我会尽力清楚我要问的是什么。如果您不理解我的问题,请发表评论。我使用两个列表,一个用于保存顶点,另一个用于保存每个顶点的邻居。当我创建一个顶点时,我将它推入第一个列表。当我想创建边缘时,我在我的键中找到了顶点'列出并将相邻顶点添加到其邻居中。名单。我重复所有的边缘。但是,我的邻居名单总是空着。我检查它是否确实将顶点推入了邻居列表,并在addEdge函数中使用了print语句,这表明它确实进入了。当我稍后尝试访问它时,邻居列表总是空出来。为什么会这样?为什么第二个列表总是空的?记忆没有保留吗?
例如: 创建顶点1,2,3 [存储在键列表中]
创建边缘:1-1,1-2(2-1),1-3(3-1 [存储在邻居列表中]
找到1的边缘:找不到任何东西(为什么?)
我的实施。图类保存键列表,顶点保存邻居列表。我用来添加边的函数命名为:两个类中的addEdge。主要还打印顶点没有邻居。
答案 0 :(得分:0)
核心问题是您传递值,修改它们的副本并期望修改原始值。特别是,问题是
getV
将非const引用返回给vertex<T>
。请注意,名称get
通常与不影响对象的const
方法相关联。所以,您可能想稍微更改名称。graph::addEdge
中,sKey
和dKey
应该是vertex<T>&
。此外,当您在addEdge
和sKey
上致电dKey
时,请传入您要添加的整个vertex<T>
对象,而不是T
类型的对象。目前的代码是编译的,因为T
可以隐式转换为vertex<T>
,但这不是你想要的。vertex<T>
中维护vertex
的列表?将其更改为list<vertex<T>*>
。请注意,如果您最终将graph
中的数据结构从list
更改为可能使迭代器和指向其元素的指针无效的其他内容,则此方法将失败。