我有一个不同寻常的图结构,它由几个类组成,我试图在其中一个布尔成员值中设置布尔成员值以便遍历。假设这些类是图形,节点和边缘。 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的方法中。我已经基本上尝试了指针的所有变体(取消引用或不引用)和引用我可以想到的,但似乎无法获得标记的值以在循环外部持续存在。也就是说,如果我添加一个依赖于第二个条件的打印,我从来没有看到它的结果。
谢谢。我最终发现真正的问题是由于突变改变了“需要处理”部分中的Edge结构。摆脱这一点,并纳入你的变化使它的工作。 – roro