在我的代码中,我需要这样做:
if (edges[j].ConnectedToNode() != i) //problem line
{
edges.push_back(Edge(i, j, nodes[i].Position(), nodes[j].Position(), distanceToNode));
}
然而,有可能边缘[j]尚不存在。我如何测试这个以避免和索引超出范围的异常? (这与路径节点有关,基本上如果有一条边连接j到i,我不想从i添加另一个j。
答案 0 :(得分:6)
在访问edges[j]
之前,请检查j < edges.size()
。
编辑:
说明Mark Ransom评论的内容:
if (j < edges.size() && edges[j].ConnectedToNode() != i) //problem line
{
edges.push_back(Edge(i, j, nodes[i].Position(), nodes[j].Position(), distanceToNode));
}
答案 1 :(得分:0)
您可以通过检查向量的大小来执行此操作:
if(edges.size() <= i) // will be false if i is too large
如果是这种情况,则必须调整矢量大小:
edges.resize(j + 1);
根据邻接列表的密度,您将获得一个非常稀疏的向量(大多数条目将不会被使用)。在这种情况下,您应该考虑使用std::map<int, int>
或类似的东西。如果给定键不存在,则映射会自动创建新索引。