C ++如何通过映射值指针更新成员值

时间:2017-03-12 20:44:36

标签: c++ pointers graph reference

我有一个不寻常的图形结构,它由几个类组成,我试图在其中一个中设置一个布尔成员值,以便遍历。假设这些类是Graph,Node和Edge。图表包含一个无序映射,其中字符串标签为键,节点为值。图形具有有界度,因此固定大小的指针指针数组保留在每个节点上,每个Edge也有指向每个节点的指针。

我的目标是访问每个Edge一次,所以我在每个Edge初始设置为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);
        }
    }
}

我对指针比使用引用更舒服,因此我的原始版本将'edge'作为指向EdgeArray的指针而没有解除引用。然而,一些挖掘让我明白,通过引用传递用于影响函数调用者的值的变化。我怀疑这里需要进行某种类似的调整,但在这种情况下,所有的迭代都发生在Graph类中存储nodeMap的方法中。我已经尝试了几乎所有指针的变化(取消引用或不引用)和我能想到的引用,但似乎无法让标记值在循环外持续存在。即,如果我添加依赖于第二条if条件的打印,我从未看到它的结果。

1 个答案:

答案 0 :(得分:1)

如果您之前的版本有效,您是否尝试仅将edge.setMark(true)替换为node->EdgeArray[i]->setMark(true)