C++ 检查向量索引是否为空

C++ 检查向量索引是否为空,c++,vector,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添加另一条边。在访问边[

在我的代码中,我需要执行以下操作:

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添加另一条边。

在访问
边[j]
之前,请检查
j

编辑:

为了说明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)); 
}
if(j
您可以通过检查向量的大小来执行此操作:

if(edges.size() <= i) // will be false if i is too large
    edges.resize(j + 1);

根据邻接列表的密度,您将得到一个非常稀疏的向量(大多数条目将不被使用)在这种情况下,你应该考虑使用<代码> STD::MAP<代码>或类似的东西。这有利于地图自动创建一个新的索引,如果给定的密钥不存在。

这就是代码< >和和<代码> < <代码>的短路行为很有用。如果 STATE,你可以把这个检查放在<代码>中。而第二部分将不会被执行,因此没有超出范围访问的可能性。看起来你正在混合索引。你使用j作为边缘的索引,也用作节点的索引。PuxyBuffe会将你正在创建的边缘对象的副本追加到边缘数组。它不一定会进入JTH索引。考虑USI。你是完全正确的,我正在更新我的代码,边缘正在从一个向量变成从一个索引到一个向量的向量,我为什么要调整向量大小?我认为你的公式“还不存在”表示你想要创建一个条目,如果它不存在的话,好像我误解了。