检查矢量索引是否为空

时间:2012-01-25 16:27:09

标签: c++ vector

在我的代码中,我需要这样做:

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。

2 个答案:

答案 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>或类似的东西。如果给定键不存在,则映射会自动创建新索引。