2012-01-25 47 views
2

在我的代码,我需要这样做:检查,如果矢量指数为空

if (edges[j].ConnectedToNode() != i) //problem line 
{ 
    edges.push_back(Edge(i, j, nodes[i].Position(), nodes[j].Position(), distanceToNode)); 
} 

然而,有一个边[J]尚不存在的可能性。我该如何测试以避免和索引超出范围的异常? (这是路径节点做的,本质上如果有连接J可我的优势,我不想从我添加另一个到j

+0

它看起来像你混合指数。您将j用作边的索引,并将其用作节点的索引。 push_back会将您正在创建的Edge对象的副本附加到边缘数组中。它不一定会进入第j个指数。考虑使用boost :: graph库。 –

+0

你是绝对正确的,我正在更新我的代码,并且边缘正在从矢量变为从指数到边缘的地图矢量 – SirYakalot

回答

6

访问edges[j]前,检查j < edges.size()

编辑。:

为了说明什么马克赎金评论:

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'语句中,第二部分不会被执行,所以不会有超出范围的访问机会。 –

+0

@MarkRansom很聪明!感谢那。 – SirYakalot

0

为此,您可以通过检查向量的大小:

if(edges.size() <= i) // will be false if i is too large 

如果是这样的话,你必须调整向量:

edges.resize(j + 1); 

根据您的邻接表的密度,你会得到一个非常稀疏向量(大部分项目将不会被使用)。在这种情况下,你应该考虑使用std::map<int, int>或类似的东西。这有一个好处,即地图自动创建一个新的索引,如果没有给定的键。

+0

为什么我需要调整矢量大小? – SirYakalot

+0

我以为你的公式*“不存在**但是**”*表示你想创建一个条目,如果它不存在。似乎我误解了。 –