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 的现有成员。

我有两个问题

  • 传递它->秒作为指针不好吗?
  • 遍历此容器的最佳方法是什么?

谢谢你。

编辑:

像这样访问容器的元素

   nodes[intpair(x, y)]

ConnectNode函数内部会导致这个问题吗?

edit2 是的。

这是为什么?我将如何解决它?

4

2 回答 2

1
  • 传递它->秒作为指针不好吗?

    这取决于接受指针本身的函数的作用。单独来看,传递指针本身并没有错。

  • 遍历此容器的最佳方法是什么?

    您使用的方式很好。使用begin()end()迭代是相当标准的。

所以我认为问题一定出在ConnectNode,并且很可能您没有迭代器失效问题,而是其他问题。

“确实像这样访问容器的元素”

nodes[intpair(x, y)]

这将在地图中添加一个新条目,该条目的键intpair(x,y)不存在,所以是的,这可能会弄乱迭代。您可以通过在使用运算符访问之前检查该键的元素是否存在来避免这种情况[]

于 2012-04-22T13:19:04.820 回答
1

根据您的更新,ConnectNode可以修改您正在迭代的地图。

nodes[intpair(x, y)]

如果地图中不存在该键,则将插入一个新元素。这可能会导致映射重新散列,使所有迭代器无效。

为避免修改地图,您可以使用find()or at()find()将通过其返回值指示键是否存在,at()如果键不存在则抛出。

如果您确实需要在 期间向地图添加新元素ConnectNode,那么事情就比较棘手了。您也许可以将它们放在一个单独的容器中,然后nodes在循环之后添加它们。

于 2012-04-22T13:28:18.797 回答