2017-03-12 60 views
0

我有一个不同寻常的图结构,它由几个类组成,我试图在其中一个布尔成员值中设置布尔成员值以便遍历。假设这些类是图形,节点和边缘。 Graph保存一个无序映射,其中字符串标签作为键和节点作为值。该图具有有界度,因此固定大小的指向Edges的指针数组保留在每个节点处,并且每个Edge还具有指向每个末端节点的指针。C++如何通过映射值指针更新成员值

我的目标是访问每个边缘一次,所以我维护一个布尔'标记'标志内每个边缘初始设置为false。由于Graph中的映射允许我迭代节点,因此我希望遍历每个节点的所有边,并标记每个边以避免来自相反两端的重复访问。然而,我发现这些商标没有被记录下来,似乎也无法使其发挥作用。

我重复的代码如下所示:

for(auto it = nodeMap.begin(); it != nodeMap.end(); ++it){ 
    Node* node = &it->second; 
    for (i=0; i< node->EdgeArray.size(); i++){ 
     if (node->EdgeArray[i]){ 
      Edge & edge = *(node->EdgeArray[i]); 
      if(edge.getMark()) continue; 
      [...do needed processing...] 
      edge.setMark(true); 
     } 
    } 
} 

我更舒服三分球比我有引用,所以我最初的版本有“边缘”为指针到边界阵列,而不反引用。然而,一些挖掘让我明白,通过引用传递是用来影响函数调用者的值的变化。我怀疑是在这里需要一些类似的调整,但在这种情况下,所有的迭代都发生在Graph类中存储nodeMap的方法中。我已经基本上尝试了指针的所有变体(取消引用或不引用)和引用我可以想到的,但似乎无法获得标记的值以在循环外部持续存在。也就是说,如果我添加一个依赖于第二个条件的打印,我从来没有看到它的结果。

回答

1

如果您以前的版本工作过,您是否尝试过用node->EdgeArray[i]->setMark(true)替换edge.setMark(true)

+0

谢谢。我最终发现真正的问题是由于突变改变了“需要处理”部分中的Edge结构。摆脱这一点,并纳入你的变化使它的工作。 – roro