检查向量索引是否为空

4
在我的代码中,我需要完成这个任务:
if (edges[j].ConnectedToNode() != i) //problem line
{
    edges.push_back(Edge(i, j, nodes[i].Position(), nodes[j].Position(), distanceToNode)); 
}

然而,edges[j] 可能还不存在。我该如何测试以避免索引越界异常?(这与路径节点有关,如果存在一条连接 j 和 i 的边,我不想再添加从 i 到 j 的边。)


看起来你混淆了索引。你正在使用j作为边缘和节点的索引。push_back将把你创建的Edge对象的副本附加到edges数组中。它不一定会进入第j个索引。考虑使用boost::graph库。 - David Nehme
你是完全正确的,我正在更新我的代码,edges(边)从一个向量转变为一个映射索引到边的映射的向量。 - Dollarslice
2个回答

8

在访问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)); 
}

3
这就是 &&|| 的短路行为派上用场的地方 - 你可以将该检查放在 if 语句的第一部分,第二部分就不会被执行,这样就不会发生越界访问的可能性。 - Mark Ransom

0
你可以通过检查向量的大小来实现这一点:
if(edges.size() <= i) // will be false if i is too large

如果是这种情况,你需要调整向量的大小。
    edges.resize(j + 1);

根据邻接表的密度,你可能会得到一个非常稀疏的向量(大多数条目将不会被使用)。在这种情况下,你应该考虑使用std::map<int, int>或类似的东西。这样做的好处是,如果给定的键没有存在的索引,映射会自动创建一个新的索引。


为什么我需要调整向量的大小? - Dollarslice
我认为你的表述“尚未存在”表明你想在条目不存在时创建一个条目。看来我误解了。 - Björn Pollex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接