2

私はこのイテレータループを持っています、

typedef  boost::unordered_map<std::pair<int, int>, NavigationNode> NodesMap;
NodesMap nodes;
for (NodesMap::iterator it= nodes.begin(); it != nodes.end() ; ++it)
{

  if(it->second.type == NavigationNodeType_Walkable)
  {
    ConnectNode(&it->second);
  }

}

ConnectNode 関数がイテレータを無効にしているようです。NavigationNode 内に新しい要素をプッシュし、NavigationNode の既存のメンバーを変更します。

2つの質問があります

  • it->second をポインタとして渡すのは悪いことですか?
  • このコンテナを反復処理する最良の方法は何ですか?

ありがとうございました。

編集:

このようにコンテナの要素にアクセスしますか

   nodes[intpair(x, y)]

ConnectNode 関数内でこの問題が発生しますか?

edit2 はい、そうです。

何故ですか?どうすればそれを回避できますか?

4

2 に答える 2

1
  • it->second をポインタとして渡すのは悪いことですか?

    それは、ポインター自体を受け取る関数が何をするかによって異なります。単独で考えると、ポインターを渡すことに本質的に問題はありません。

  • このコンテナを反復処理する最良の方法は何ですか?

    お使いの方法は問題ありません。and を使用begin()end()て反復することは、かなり標準的です。

したがって、問題はConnectNode.

「このようにコンテナの要素にアクセスします」

nodes[intpair(x, y)]

これにより、キーが存在しない新しいエントリがマップに追加されるintpair(x,y)ため、はい、これにより反復が台無しになる可能性があります。演算子でアクセスする前に、そのキーの要素が存在するかどうかを確認することで、これを回避できます[]

于 2012-04-22T13:19:04.820 に答える
1

更新によると、ConnectNode反復しているマップを変更できます。

nodes[intpair(x, y)]

そのキーがまだマップに存在しない場合は、新しい要素が挿入されます。これにより、マップが再ハッシュされ、すべてのイテレータが無効になる可能性があります。

マップの変更を避けるには、find()またはを使用できますat()find()戻り値を介してキーが存在するかどうかを示し、キーが存在at()しない場合はスローします。

中にマップに新しい要素を追加する必要がある場合はConnectNode、かなり複雑です。おそらく、それらを別のコンテナーに入れてnodesから、ループの後に追加することができます。

于 2012-04-22T13:28:18.797 に答える