2017-03-12 16 views
0

私は、いくつかのクラスから構成された異常なグラフ構造を持っていますが、トラバーサルのためにそれらのいずれかにブール値を設定しようとしています。クラスがグラフ、ノード、およびエッジであるとしましょう。グラフは、文字列ラベルをキーとして、ノードを値として並べ替えられていないマップを保持します。グラフには境界があり、エッジへのポインターの固定サイズの配列が各ノードに保持され、各エッジには各端のノードへのポインターもあります。C++マップ値ポインタを使用してメンバ値を更新する方法

私の目的は、すべてのEdgeを一度訪れることです。そのため、最初にfalseに設定されたEdge内にブール値の 'marked'フラグを維持します。グラフ内のマップはノードを繰り返し処理できるので、すべてのノードからすべてのエッジを繰り返し処理し、両端に繰り返し訪問するのを避けるためにそれぞれに印を付けます。しかし、私はマークが記録に失敗しており、それを動作させるように見えないことがわかりました。

マイ反復コードは次のようになります。

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); 
     } 
    } 
} 

私の元のバージョンが参照解除せずにEdgeArrayへのポインタとして「エッジ」を持っていたので、私は、私が参照で私よりポインタをより快適にしています。しかし、掘り下げていくと、参照渡しが関数呼び出し側の値を変更するために使用されることを理解できました。私の疑問は、ここで何らかの類似の微調整が必​​要だということでしたが、この場合、すべての反復はNodeMapが格納されているGraphクラスのメソッドで発生します。私は基本的にすべてのバリエーションのポインタ(dereferencedまたはnot)と私が考えることができる参照を試しましたが、マークされた値をループの外で持続させることはできません。つまり、2番目の条件に応じた印刷物を追加すると、その結果は決して見えません。

答えて

1

以前のバージョンが機能していた場合は、edge.setMark(true)のみをnode->EdgeArray[i]->setMark(true)に置き換えてみましたか?

+0

ありがとうございました。私は結局、本当の問題は「必要な処理」の部分でEdge構造を変更した突然変異によるものだとわかりました。それを取り除き、あなたの変化を取り入れることで、それが機能するようになりました。 – roro

関連する問題